From 84a679b0e48ed76eee2fa44d3caac83591aa3c8c Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Mon, 30 Oct 2023 11:18:11 +0100 Subject: feat(hooks): add useBoolean and useToggle hooks --- src/utils/hooks/use-toggle/index.ts | 1 + src/utils/hooks/use-toggle/use-toggle.test.ts | 24 ++++++++++++++++++++++++ src/utils/hooks/use-toggle/use-toggle.ts | 15 +++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 src/utils/hooks/use-toggle/index.ts create mode 100644 src/utils/hooks/use-toggle/use-toggle.test.ts create mode 100644 src/utils/hooks/use-toggle/use-toggle.ts (limited to 'src/utils/hooks/use-toggle') diff --git a/src/utils/hooks/use-toggle/index.ts b/src/utils/hooks/use-toggle/index.ts new file mode 100644 index 0000000..01a0e57 --- /dev/null +++ b/src/utils/hooks/use-toggle/index.ts @@ -0,0 +1 @@ +export * from './use-toggle'; diff --git a/src/utils/hooks/use-toggle/use-toggle.test.ts b/src/utils/hooks/use-toggle/use-toggle.test.ts new file mode 100644 index 0000000..b2feeab --- /dev/null +++ b/src/utils/hooks/use-toggle/use-toggle.test.ts @@ -0,0 +1,24 @@ +import { describe, expect, it } from '@jest/globals'; +import { act, renderHook } from '@testing-library/react'; +import { useToggle } from './use-toggle'; + +describe('use-toggle', () => { + it('returns the default state', () => { + const { result } = renderHook(() => useToggle()); + + expect(result.current[0]).toBe(false); + }); + + it('can switch the state', () => { + const initialState = true; + const { result } = renderHook(() => useToggle(initialState)); + + expect(result.current[0]).toBe(initialState); + + act(() => { + result.current[1](); + }); + + expect(result.current[0]).toBe(!initialState); + }); +}); diff --git a/src/utils/hooks/use-toggle/use-toggle.ts b/src/utils/hooks/use-toggle/use-toggle.ts new file mode 100644 index 0000000..c07c1e2 --- /dev/null +++ b/src/utils/hooks/use-toggle/use-toggle.ts @@ -0,0 +1,15 @@ +import { useBoolean } from '../use-boolean'; + +export type UseToggleReturn = readonly [boolean, () => void]; + +/** + * React hook to toggle boolean states. + * + * @param {boolean} [initialState] - The initial state. + * @returns {UseToggleReturn} The state and a function to switch state. + */ +export const useToggle = (initialState = false): UseToggleReturn => { + const { state, toggle } = useBoolean(initialState); + + return [state, toggle] as const; +}; -- cgit v1.2.3