@chakra-ui/react-use-controllable-state
Version:
A Quick description of the component
1 lines • 2.96 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { useMemo, useState } from \"react\"\nimport { useCallbackRef } from \"@chakra-ui/react-use-callback-ref\"\n\n/**\n * Given a prop value and state value, the useControllableProp hook is used to determine whether a component is controlled or uncontrolled, and also returns the computed value.\n *\n * @see Docs https://chakra-ui.com/docs/hooks/use-controllable#usecontrollableprop\n */\nexport function useControllableProp<T>(prop: T | undefined, state: T) {\n const controlled = typeof prop !== \"undefined\"\n const value = controlled ? prop : state\n return useMemo<[boolean, T]>(() => [controlled, value], [controlled, value])\n}\n\nexport interface UseControllableStateProps<T> {\n value?: T\n defaultValue?: T | (() => T)\n onChange?: (value: T) => void\n shouldUpdate?: (prev: T, next: T) => boolean\n}\n\n/**\n * The `useControllableState` hook returns the state and function that updates the state, just like React.useState does.\n *\n * @see Docs https://chakra-ui.com/docs/hooks/use-controllable#usecontrollablestate\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\n const onChangeProp = useCallbackRef(onChange)\n const shouldUpdateProp = useCallbackRef(shouldUpdate)\n\n const [uncontrolledState, setUncontrolledState] = useState(defaultValue as T)\n const controlled = valueProp !== undefined\n const value = controlled ? valueProp : uncontrolledState\n\n const setValue = useCallbackRef(\n (next: React.SetStateAction<T>) => {\n const setter = next as (prevState?: T) => T\n const nextValue = typeof next === \"function\" ? setter(value) : next\n\n if (!shouldUpdateProp(value, nextValue)) {\n return\n }\n\n if (!controlled) {\n setUncontrolledState(nextValue)\n }\n\n onChangeProp(nextValue)\n },\n [controlled, onChangeProp, value, shouldUpdateProp],\n )\n\n return [value, setValue] as [T, React.Dispatch<React.SetStateAction<T>>]\n}\n"],"mappings":";;;AAAA,SAAS,SAAS,gBAAgB;AAClC,SAAS,sBAAsB;AAOxB,SAAS,oBAAuB,MAAqB,OAAU;AACpE,QAAM,aAAa,OAAO,SAAS;AACnC,QAAM,QAAQ,aAAa,OAAO;AAClC,SAAO,QAAsB,MAAM,CAAC,YAAY,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC;AAC7E;AAcO,SAAS,qBAAwB,OAAqC;AAC3E,QAAM;AAAA,IACJ,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,eAAe,CAAC,MAAM,SAAS,SAAS;AAAA,EAC1C,IAAI;AAEJ,QAAM,eAAe,eAAe,QAAQ;AAC5C,QAAM,mBAAmB,eAAe,YAAY;AAEpD,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAS,YAAiB;AAC5E,QAAM,aAAa,cAAc;AACjC,QAAM,QAAQ,aAAa,YAAY;AAEvC,QAAM,WAAW;AAAA,IACf,CAAC,SAAkC;AACjC,YAAM,SAAS;AACf,YAAM,YAAY,OAAO,SAAS,aAAa,OAAO,KAAK,IAAI;AAE/D,UAAI,CAAC,iBAAiB,OAAO,SAAS,GAAG;AACvC;AAAA,MACF;AAEA,UAAI,CAAC,YAAY;AACf,6BAAqB,SAAS;AAAA,MAChC;AAEA,mBAAa,SAAS;AAAA,IACxB;AAAA,IACA,CAAC,YAAY,cAAc,OAAO,gBAAgB;AAAA,EACpD;AAEA,SAAO,CAAC,OAAO,QAAQ;AACzB;","names":[]}