Openstatus www.openstatus.dev
at b07f4bfad742e097cb853857a4c865cbdd1fd5c8 37 lines 1.1 kB view raw
1// @see https://github.com/radix-ui/primitives/blob/main/packages/react/compose-refs/src/composeRefs.tsx 2 3import * as React from "react"; 4 5type PossibleRef<T> = React.Ref<T> | undefined; 6 7/** 8 * Set a given ref to a given value 9 * This utility takes care of different types of refs: callback refs and RefObject(s) 10 */ 11function setRef<T>(ref: PossibleRef<T>, value: T) { 12 if (typeof ref === "function") { 13 ref(value); 14 } else if (ref !== null && ref !== undefined) { 15 (ref as React.MutableRefObject<T>).current = value; 16 } 17} 18 19/** 20 * A utility to compose multiple refs together 21 * Accepts callback refs and RefObject(s) 22 */ 23function composeRefs<T>(...refs: PossibleRef<T>[]) { 24 // biome-ignore lint/complexity/noForEach: <explanation> 25 return (node: T) => refs.forEach((ref) => setRef(ref, node)); 26} 27 28/** 29 * A custom hook that composes multiple refs 30 * Accepts callback refs and RefObject(s) 31 */ 32function useComposedRefs<T>(...refs: PossibleRef<T>[]) { 33 // eslint-disable-next-line react-hooks/exhaustive-deps 34 return React.useCallback(composeRefs(...refs), refs); 35} 36 37export { composeRefs, useComposedRefs };