From 6d3ef494b4cf2dac88ffc348f40567c363fa7620 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 20 Apr 2026 17:16:39 -0700 Subject: [PATCH] Add useCombinedRefs hook --- frontend/src/Helpers/Hooks/useCombinedRefs.ts | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 frontend/src/Helpers/Hooks/useCombinedRefs.ts diff --git a/frontend/src/Helpers/Hooks/useCombinedRefs.ts b/frontend/src/Helpers/Hooks/useCombinedRefs.ts new file mode 100644 index 000000000..00ee45d29 --- /dev/null +++ b/frontend/src/Helpers/Hooks/useCombinedRefs.ts @@ -0,0 +1,39 @@ +import { ForwardedRef, useCallback, useRef } from 'react'; + +type OptionalRef = ForwardedRef | undefined; + +function setRef(ref: OptionalRef, value: T | null) { + if (typeof ref === 'function') { + ref(value); + } else if (ref) { + ref.current = value; + } +} + +function useCombinedRefs(...refs: OptionalRef[]) { + const previousRefs = useRef[]>([]); + + return useCallback((value: T | null) => { + let index = 0; + for (; index < refs.length; index++) { + const ref = refs[index]; + const prev = previousRefs.current[index]; + + if (prev !== ref) { + setRef(prev, null); + } + setRef(ref, value); + } + + for (; index < previousRefs.current.length; index++) { + const prev = previousRefs.current[index]; + setRef(prev, null); + } + + previousRefs.current = refs; + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, refs); +} + +export default useCombinedRefs;