@mantine/hooks
Version:
A collection of 50+ hooks for state and UI management
1 lines • 1.9 kB
Source Map (JSON)
{"version":3,"file":"use-merged-ref.cjs","names":[],"sources":["../../src/use-merged-ref/use-merged-ref.ts"],"sourcesContent":["import { Ref, useCallback, type RefCallback } from 'react';\n\ntype PossibleRef<T> = Ref<T> | undefined;\n\ntype RefCleanup<T> = ReturnType<RefCallback<T>>;\n\nexport function assignRef<T>(ref: PossibleRef<T>, value: T): RefCleanup<T> {\n if (typeof ref === 'function') {\n return ref(value);\n } else if (typeof ref === 'object' && ref !== null && 'current' in ref) {\n ref.current = value;\n }\n}\n\nexport function mergeRefs<T>(...refs: PossibleRef<T>[]): RefCallback<T> {\n const cleanupMap = new Map<PossibleRef<T>, Exclude<RefCleanup<T>, void>>();\n\n return (node: T | null) => {\n refs.forEach((ref) => {\n const cleanup = assignRef(ref, node);\n if (cleanup) {\n cleanupMap.set(ref, cleanup);\n }\n });\n\n if (cleanupMap.size > 0) {\n return () => {\n refs.forEach((ref) => {\n const cleanup = cleanupMap.get(ref);\n if (cleanup && typeof cleanup === 'function') {\n cleanup();\n } else {\n assignRef(ref, null);\n }\n });\n cleanupMap.clear();\n };\n }\n };\n}\n\nexport function useMergedRef<T>(...refs: PossibleRef<T>[]) {\n return useCallback(mergeRefs(...refs), refs);\n}\n"],"mappings":";;;AAMA,SAAgB,UAAa,KAAqB,OAAyB;AACzE,KAAI,OAAO,QAAQ,WACjB,QAAO,IAAI,MAAM;UACR,OAAO,QAAQ,YAAY,QAAQ,QAAQ,aAAa,IACjE,KAAI,UAAU;;AAIlB,SAAgB,UAAa,GAAG,MAAwC;CACtE,MAAM,6BAAa,IAAI,KAAmD;AAE1E,SAAQ,SAAmB;AACzB,OAAK,SAAS,QAAQ;GACpB,MAAM,UAAU,UAAU,KAAK,KAAK;AACpC,OAAI,QACF,YAAW,IAAI,KAAK,QAAQ;IAE9B;AAEF,MAAI,WAAW,OAAO,EACpB,cAAa;AACX,QAAK,SAAS,QAAQ;IACpB,MAAM,UAAU,WAAW,IAAI,IAAI;AACnC,QAAI,WAAW,OAAO,YAAY,WAChC,UAAS;QAET,WAAU,KAAK,KAAK;KAEtB;AACF,cAAW,OAAO;;;;AAM1B,SAAgB,aAAgB,GAAG,MAAwB;AACzD,SAAA,GAAA,MAAA,aAAmB,UAAU,GAAG,KAAK,EAAE,KAAK"}