diff --git a/apps/www/content/docs/hooks/use-toggle.mdx b/apps/www/content/docs/hooks/use-toggle.mdx new file mode 100644 index 00000000..450ad6bf --- /dev/null +++ b/apps/www/content/docs/hooks/use-toggle.mdx @@ -0,0 +1,70 @@ +--- +title: useToggle +description: Manage a boolean toggle state +--- + + +```json doc-gen:file +{ + "file": "./src/components/demos/UseToggle/UseToggle.tsx", + "codeblock": true +} +``` + + +## Installation + + + + + ### Copy-paste the hook + + Copy and paste the hook code in a `.ts` file. + + ```json doc-gen:file + { + "file": "./src/hooks/use-toggle.ts", + "codeblock": true + } + ``` + + + + + +### Usage + +```ts +import { useToggle } from '~/hooks/use-toggle'; +``` + +```tsx +const { on, toggle, setToggle } = useToggle(); + +on ? On : Off; +toggle(); +setToggle(true); +``` + +## Details + +### Toggle Functionality + +- The hook provides a simple and efficient way to manage a boolean toggle state, allowing you to easily switch between two states (on/off). +- It initializes the toggle state based on an optional `defaultValue`, which defaults to `false` if not provided. + +### State Management + +- **`on`**: A boolean state that indicates the current status of the toggle. It is `true` when the toggle is in the "on" position and `false` when it is "off". +- **`setToggle`**: A function that allows you to directly set the toggle state to a specific boolean value, providing flexibility in managing the toggle state programmatically. + +### Toggle Action + +- **`toggle`**: A function that toggles the state of `on` between `true` and `false`. This function can be called in response to user actions (e.g., button clicks) to change the toggle state seamlessly. + +### Return Value + +- The hook returns an object containing: +- **`on`**: A boolean indicating the current state of the toggle (`true` for "on", `false` for "off"). +- **`toggle`**: A function to toggle the state between "on" and "off". +- **`setToggle`**: A function to directly set the toggle state to a specific boolean value. diff --git a/apps/www/src/components/ComponentPreview/Components.tsx b/apps/www/src/components/ComponentPreview/Components.tsx index 7e22ea85..c2d0e21e 100644 --- a/apps/www/src/components/ComponentPreview/Components.tsx +++ b/apps/www/src/components/ComponentPreview/Components.tsx @@ -1213,4 +1213,13 @@ export const Components: Record = { })), ), }, + 'use-toggle': { + name: 'use-toggle', + type: 'hook:example', + component: lazy(() => + import('../demos/UseToggle').then((module) => ({ + default: module.UseToggleDemo, + })), + ), + }, }; diff --git a/apps/www/src/components/demos/UseToggle/UseToggle.tsx b/apps/www/src/components/demos/UseToggle/UseToggle.tsx new file mode 100644 index 00000000..e563ef32 --- /dev/null +++ b/apps/www/src/components/demos/UseToggle/UseToggle.tsx @@ -0,0 +1,33 @@ +'use client'; + +import { Button } from '@kosori/ui/button'; +import { Switch } from '@kosori/ui/switch'; + +import { useToggle } from '~/hooks/use-toggle'; + +export const UseToggleDemo = () => { + const { on, toggle, setToggle } = useToggle(); + + return ( +
+ + +
+ + + +
+
+ ); +}; diff --git a/apps/www/src/components/demos/UseToggle/index.ts b/apps/www/src/components/demos/UseToggle/index.ts new file mode 100644 index 00000000..4f00ac81 --- /dev/null +++ b/apps/www/src/components/demos/UseToggle/index.ts @@ -0,0 +1 @@ +export * from './UseToggle'; diff --git a/apps/www/src/hooks/use-toggle.ts b/apps/www/src/hooks/use-toggle.ts new file mode 100644 index 00000000..d2ff2b5a --- /dev/null +++ b/apps/www/src/hooks/use-toggle.ts @@ -0,0 +1,27 @@ +import { useCallback, useState } from 'react'; + +/** + * A custom hook that manages a boolean toggle state. + * + * @param {boolean} [defaultValue=false] - Initial value for the toggle state. Defaults to `false` if not provided. + * + * @returns An object containing: + * - `on`: A boolean indicating the current state of the toggle (`true` for `on`, `false` for `off`). + * - `toggle`: A function to toggle the state between `on` and `off`. + * - `setToggle`: A function to directly set the toggle state to a specific boolean value. + * + * @example + * const { on, toggle, setToggle } = useToggle(); + * on ? 'On' : 'Off'; + * toggle(); + * setToggle(true); + */ +export const useToggle = (defaultValue = false) => { + const [on, setToggle] = useState(!!defaultValue); + + const toggle = useCallback(() => { + setToggle((x) => !x); + }, []); + + return { on, toggle, setToggle }; +};