@atlaskit/popup
Version:
A popup displays brief content in an overlay.
28 lines (27 loc) • 925 B
JavaScript
import { useState } from 'react';
import memoizeOne from 'memoize-one';
/*
* Get a memoized functional ref for use within a Popup's Trigger.
* This is still very volatile to change as `prop.isOpen` will regularly change, but it's better than nothing.
* This is memoized within a component as to not be shared across all Popup instances.
*
* This is complex because the inputs are split across three different scopes:
* - `props.isOpen`
* - `useState.setTriggerRef`
* - `renderProps.ref`
*/
export const useGetMemoizedMergedTriggerRef = () => {
const [getMemoizedMergedTriggerRef] = useState(() => memoizeOne((ref, setTriggerRef, isOpen) => {
return node => {
if (node && isOpen) {
if (typeof ref === 'function') {
ref(node);
} else if (ref) {
ref.current = node;
}
setTriggerRef(node);
}
};
}));
return getMemoizedMergedTriggerRef;
};