@spark-ui/hooks
Version:
Common hooks for Spark UI
1 lines • 2.08 kB
Source Map (JSON)
{"version":3,"sources":["../../src/use-combined-state/useCombinedState.tsx"],"sourcesContent":["import isEqual from 'lodash.isequal'\nimport { SetStateAction, useCallback, useRef, useState } from 'react'\n\n/**\n * This hook must be used when a component has both a controlled and uncontrolled mode.\n * It will take care of updating the state value when a controlled mode (prop) is updated.\n */\nexport function useCombinedState<T>(\n controlledValue?: T,\n defaultValue?: T,\n onChange?: (nextValue: T) => void\n): [\n T | undefined,\n (newValue: T, forceFlag?: (prev: T, next: T) => boolean) => void,\n boolean,\n T | undefined,\n] {\n const isControlled = controlledValue !== undefined\n const { current: initialValue } = useRef(isControlled ? controlledValue : defaultValue)\n\n const [innerValue, setInnerValue] = useState(defaultValue as T)\n const value = isControlled ? (controlledValue as T) : innerValue\n\n const updater = useCallback(\n (\n next: SetStateAction<T>,\n shouldUpdateProp = (prevValue: T, nextValue: T) => !isEqual(prevValue, nextValue)\n ) => {\n const nextValue = typeof next !== 'function' ? next : (next as (value: T) => T)(value)\n const shouldUpdate = shouldUpdateProp(value, nextValue)\n if (shouldUpdate && !isControlled) {\n setInnerValue(nextValue)\n }\n onChange && onChange(nextValue)\n },\n [isControlled, value, onChange]\n )\n\n return [value, updater, isControlled, initialValue]\n}\n"],"mappings":";AAAA,OAAO,aAAa;AACpB,SAAyB,aAAa,QAAQ,gBAAgB;AAMvD,SAAS,iBACd,iBACA,cACA,UAMA;AACA,QAAM,eAAe,oBAAoB;AACzC,QAAM,EAAE,SAAS,aAAa,IAAI,OAAO,eAAe,kBAAkB,YAAY;AAEtF,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,YAAiB;AAC9D,QAAM,QAAQ,eAAgB,kBAAwB;AAEtD,QAAM,UAAU;AAAA,IACd,CACE,MACA,mBAAmB,CAAC,WAAc,cAAiB,CAAC,QAAQ,WAAW,SAAS,MAC7E;AACH,YAAM,YAAY,OAAO,SAAS,aAAa,OAAQ,KAAyB,KAAK;AACrF,YAAM,eAAe,iBAAiB,OAAO,SAAS;AACtD,UAAI,gBAAgB,CAAC,cAAc;AACjC,sBAAc,SAAS;AAAA,MACzB;AACA,kBAAY,SAAS,SAAS;AAAA,IAChC;AAAA,IACA,CAAC,cAAc,OAAO,QAAQ;AAAA,EAChC;AAEA,SAAO,CAAC,OAAO,SAAS,cAAc,YAAY;AACpD;","names":[]}