@modern-kit/react
Version:
1 lines • 7.94 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../../src/hooks/useHistoryState/index.ts"],"sourcesContent":["import { isFunction, at } from '@modern-kit/utils';\nimport { useCallback, useMemo, useState } from 'react';\n\ninterface UseHistoryStateReturn<T> {\n state: T;\n canForward: boolean;\n canBack: boolean;\n setState: (newState: T | ((prevState: T) => T)) => void;\n replaceState: (newState: T | ((prevState: T) => T)) => void;\n back: () => void;\n forward: () => void;\n go: (index: number) => void;\n}\n\ninterface HistoryState<T> {\n history: T[];\n current: T;\n pointer: number;\n}\n\n/**\n * @description 상태와 상태 변경 이력을 관리하는 훅입니다.\n *\n * 상태 변경 시마다 이력이 저장되며, 상태 히스토리를 이전(`back`)과 다음(`forward`)으로 이동할 수 있습니다. 또한 특정 시점의 상태로 이동(`go`)할 수 있으며, 현재 상태를 대체(`replaceState`)할 수 있습니다.\n *\n * 저장되는 이력의 최대 개수(`capacity`)를 제한할 수 있습니다.\n *\n * @template T - 상태의 타입\n * @param {T | (() => T)} initialValue - 초기 상태 값 또는 초기 상태를 반환하는 함수\n * @param {number} [capacity=10] - 상태 변경 이력의 최대 저장 개수. 기본값은 10\n * @returns {UseHistoryStateReturn<T>} 상태 관리를 위한 객체\n * - `state`: 현재 상태 값\n * - `canForward`: 다음 상태로 이동할 수 있는지 여부\n * - `canBack`: 이전 상태로 이동할 수 있는지 여부\n * - `setState`: 상태 히스토리에 상태를 추가하고 새로운 상태로 업데이트합니다.\n * - `replaceState`: 상태 히스토리의 현재 상태를 대체합니다.\n * - `back`: 상태 히스토리에서 이전 상태로 되돌리는 함수\n * - `forward`: 상태 히스토리에서 다음 상태로 이동하는 함수\n * - `go`: 상태 히스토리에서 특정 인덱스의 상태로 이동하는 함수\n *\n * @example\n * const { state, setState, replaceState, back, forward, go } = useHistoryState(0, 5);\n *\n * setState(1); // history: [0, 1], state: 1\n * setState(2); // history: [0, 1, 2], state: 2\n * replaceState(3); // history: [0, 1, 3], state: 3\n * back(); // history: [0, 1, 3], state: 1\n * forward(); // history: [0, 1, 3], state: 3\n * go(0); // history: [0, 1, 2], state: 0\n * setState(4); // history: [0, 1, 3, 4], state: 4\n */\nexport function useHistoryState<T>(\n initialValue: T | (() => T),\n capacity: number = 10\n): UseHistoryStateReturn<T> {\n const initialValueToUse = isFunction(initialValue)\n ? initialValue()\n : initialValue;\n\n const [state, innerSetState] = useState<HistoryState<T>>({\n history: [initialValueToUse],\n current: initialValueToUse,\n pointer: 0,\n });\n\n const canForward = useMemo(\n () => state.pointer < state.history.length - 1,\n [state.pointer, state.history.length]\n );\n const canBack = useMemo(() => state.pointer > 0, [state.pointer]);\n\n const setState = useCallback(\n (newState: T | ((prevState: T) => T)) => {\n innerSetState((prev) => {\n const history = [...prev.history];\n const newStateToUse = isFunction(newState)\n ? newState(history[prev.pointer])\n : newState;\n\n if (history.length === capacity) {\n history.shift();\n }\n\n history.push(newStateToUse);\n const pointer = history.length - 1;\n\n return { history, current: newStateToUse, pointer };\n });\n },\n [capacity]\n );\n\n const replaceState = useCallback((newState: T | ((prevState: T) => T)) => {\n innerSetState((prev) => {\n const history = [...prev.history];\n const newStateToUse = isFunction(newState)\n ? newState(history[prev.pointer])\n : newState;\n\n history[prev.pointer] = newStateToUse;\n return { ...prev, history, current: newStateToUse };\n });\n }, []);\n\n const back = useCallback(() => {\n innerSetState((prev) => {\n if (prev.pointer < 1) {\n return prev;\n }\n\n const pointer = prev.pointer - 1;\n\n return {\n ...prev,\n current: prev.history[pointer],\n pointer,\n };\n });\n }, []);\n\n const forward = useCallback(() => {\n innerSetState((prev) => {\n if (prev.pointer >= prev.history.length - 1) {\n return prev;\n }\n\n const pointer = prev.pointer + 1;\n\n return {\n ...prev,\n current: prev.history[pointer],\n pointer,\n };\n });\n }, []);\n\n const go = useCallback((index: number) => {\n innerSetState((prev) => {\n const element = at(prev.history, index);\n\n if (element == null) {\n return prev;\n }\n\n const pointer = index < 0 ? prev.history.length + index : index;\n\n return { ...prev, current: element, pointer };\n });\n }, []);\n\n return {\n state: state.current,\n canForward,\n canBack,\n setState,\n replaceState,\n forward,\n back,\n go,\n };\n}\n"],"names":["isFunction","useState","useMemo","useCallback","at"],"mappings":"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"}