@mantine/hooks
Version:
A collection of 50+ hooks for state and UI management
1 lines • 1.94 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;CACzE,IAAI,OAAO,QAAQ,YACjB,OAAO,IAAI,KAAK;MACX,IAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,aAAa,KACjE,IAAI,UAAU;AAElB;AAEA,SAAgB,UAAa,GAAG,MAAwC;CACtE,MAAM,6BAAa,IAAI,IAAkD;CAEzE,QAAQ,SAAmB;EACzB,KAAK,SAAS,QAAQ;GACpB,MAAM,UAAU,UAAU,KAAK,IAAI;GACnC,IAAI,SACF,WAAW,IAAI,KAAK,OAAO;EAE/B,CAAC;EAED,IAAI,WAAW,OAAO,GACpB,aAAa;GACX,KAAK,SAAS,QAAQ;IACpB,MAAM,UAAU,WAAW,IAAI,GAAG;IAClC,IAAI,WAAW,OAAO,YAAY,YAChC,QAAQ;SAER,UAAU,KAAK,IAAI;GAEvB,CAAC;GACD,WAAW,MAAM;EACnB;CAEJ;AACF;AAEA,SAAgB,aAAgB,GAAG,MAAwB;CACzD,QAAA,GAAA,MAAA,aAAmB,UAAU,GAAG,IAAI,GAAG,IAAI;AAC7C"}