koval-ui
Version:
React components collection with minimalistic design. Supports theming, layout, and input validation.
1 lines • 3.17 kB
Source Map (JSON)
{"version":3,"file":"useControllableState.cjs","sources":["../../../../src/internal/hooks/useControllableState.ts"],"sourcesContent":["import type {Dispatch, SetStateAction} from 'react';\nimport {useCallback, useState} from 'react';\n\nimport {useCallbackRef} from './useCallbackRef.ts';\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nconst isFunction = <T extends Function = Function>(value: unknown): value is T =>\n typeof value === 'function';\n\nexport function runIfFn<T, U>(valueOrFn: T | ((...fnArgs: U[]) => T), ...args: U[]): T {\n return isFunction(valueOrFn) ? valueOrFn(...args) : valueOrFn;\n}\n\nexport type UseControllableStateProps<T> = {\n /**\n * The value to used in controlled mode\n */\n value?: T;\n /**\n * The initial value to be used, in uncontrolled mode\n */\n defaultValue?: T | (() => T);\n /**\n * The callback fired when the value changes\n */\n onChange?: (value: T) => void;\n /**\n * The function that determines if the state should be updated\n */\n shouldUpdate?: (prev: T, next: T) => boolean;\n};\n\n/**\n * React hook for using controlling component state.\n * @param props\n */\nexport function useControllableState<T>(props: UseControllableStateProps<T>) {\n const {\n value: valueProp,\n defaultValue,\n onChange,\n shouldUpdate = (prev, next) => prev !== next,\n } = props;\n const onChangeProp = useCallbackRef(onChange);\n const shouldUpdateProp = useCallbackRef(shouldUpdate);\n\n const [valueState, setValue] = useState(defaultValue as T);\n\n const isControlled = valueProp !== undefined;\n const value = isControlled ? (valueProp as T) : valueState;\n\n const updateValue = useCallback(\n (next: SetStateAction<T>) => {\n const nextValue = runIfFn(next, value);\n\n if (!shouldUpdateProp(value, nextValue)) {\n return;\n }\n\n if (!isControlled) {\n setValue(nextValue);\n }\n\n onChangeProp(nextValue);\n },\n [isControlled, onChangeProp, value, shouldUpdateProp]\n );\n\n return [value, updateValue] as [T, Dispatch<SetStateAction<T>>];\n}\n"],"names":["isFunction","value","runIfFn","valueOrFn","args","useControllableState","props","valueProp","defaultValue","onChange","shouldUpdate","prev","next","onChangeProp","useCallbackRef","shouldUpdateProp","valueState","setValue","useState","isControlled","updateValue","useCallback","nextValue"],"mappings":"wJAMMA,EAA6CC,GAC/C,OAAOA,GAAU,WAEL,SAAAC,EAAcC,KAA2CC,EAAc,CACnF,OAAOJ,EAAWG,CAAS,EAAIA,EAAU,GAAGC,CAAI,EAAID,CACxD,CAyBO,SAASE,EAAwBC,EAAqC,CACnE,KAAA,CACF,MAAOC,EACP,aAAAC,EACA,SAAAC,EACA,aAAAC,EAAe,CAACC,EAAMC,IAASD,IAASC,CAAA,EACxCN,EACEO,EAAeC,iBAAeL,CAAQ,EACtCM,EAAmBD,iBAAeJ,CAAY,EAE9C,CAACM,EAAYC,CAAQ,EAAIC,EAAAA,SAASV,CAAiB,EAEnDW,EAAeZ,IAAc,OAC7BN,EAAQkB,EAAgBZ,EAAkBS,EAE1CI,EAAcC,EAAA,YACfT,GAA4B,CACnB,MAAAU,EAAYpB,EAAQU,EAAMX,CAAK,EAEhCc,EAAiBd,EAAOqB,CAAS,IAIjCH,GACDF,EAASK,CAAS,EAGtBT,EAAaS,CAAS,EAC1B,EACA,CAACH,EAAcN,EAAcZ,EAAOc,CAAgB,CACxD,EAEO,MAAA,CAACd,EAAOmB,CAAW,CAC9B"}