diff options
author | Paul Frazee <pfrazee@gmail.com> | 2023-05-24 18:46:55 -0500 |
---|---|---|
committer | Paul Frazee <pfrazee@gmail.com> | 2023-05-24 18:46:55 -0500 |
commit | 0a18229784ea6c67e5ac17e4bae1a79a24f80d7f (patch) | |
tree | af829bdacd5489e9e012b74a3778752ed3efbce0 /src/lib/merge-refs.ts | |
parent | 4e1876fe85ab3a70eba50466a62bff8a9d01c16c (diff) | |
parent | 32c9dabb7467149baf39d8f5c2eb3d0b81236d92 (diff) | |
download | voidsky-0a18229784ea6c67e5ac17e4bae1a79a24f80d7f.tar.zst |
Merge branch 'custom-algos' of github.com:bluesky-social/social-app into custom-algos
Diffstat (limited to 'src/lib/merge-refs.ts')
-rw-r--r-- | src/lib/merge-refs.ts | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/lib/merge-refs.ts b/src/lib/merge-refs.ts new file mode 100644 index 000000000..4617b5260 --- /dev/null +++ b/src/lib/merge-refs.ts @@ -0,0 +1,27 @@ +/** + * This TypeScript function merges multiple React refs into a single ref callback. + * When developing low level UI components, it is common to have to use a local ref + * but also support an external one using React.forwardRef. + * Natively, React does not offer a way to set two refs inside the ref property. This is the goal of this small utility. + * Today a ref can be a function or an object, tomorrow it could be another thing, who knows. + * This utility handles compatibility for you. + * This function is inspired by https://github.com/gregberge/react-merge-refs + * @param refs - An array of React refs, which can be either `React.MutableRefObject<T>` or + * `React.LegacyRef<T>`. These refs are used to store references to DOM elements or React components. + * The `mergeRefs` function takes in an array of these refs and returns a callback function that + * @returns The function `mergeRefs` is being returned. It takes an array of mutable or legacy refs and + * returns a ref callback function that can be used to merge multiple refs into a single ref. + */ +export function mergeRefs<T = any>( + refs: Array<React.MutableRefObject<T> | React.LegacyRef<T>>, +): React.RefCallback<T> { + return value => { + refs.forEach(ref => { + if (typeof ref === 'function') { + ref(value) + } else if (ref != null) { + ;(ref as React.MutableRefObject<T | null>).current = value + } + }) + } +} |