/* * Copyright 2021 Adobe. All rights reserved. * This file is licensed to you under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. You may obtain a copy * of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ import {MutableRefObject, useMemo, useRef} from 'react'; /** * Offers an object ref for a given callback ref or an object ref. Especially * helfpul when passing forwarded refs (created using `React.forwardRef`) to * React Aria hooks. * * @param forwardedRef The original ref intended to be used. * @returns An object ref that updates the given ref. * @see https://reactjs.org/docs/forwarding-refs.html */ export function useObjectRef(forwardedRef?: ((instance: T | null) => void) | MutableRefObject | null): MutableRefObject { const objRef: MutableRefObject = useRef(null); return useMemo(() => ({ get current() { return objRef.current; }, set current(value) { objRef.current = value; if (typeof forwardedRef === 'function') { forwardedRef(value); } else if (forwardedRef) { forwardedRef.current = value; } } }), [forwardedRef]); }