import * as React from 'react'; import { focusElement } from '../../DomUtils/focusElement'; import { NullableElement } from '../../DomUtils/selectors'; export function ElementRefContextProvider({ children, }: { children: React.ReactNode; }) { const PickerMainRef = React.useRef(null); const AnchoredEmojiRef = React.useRef(null); const BodyRef = React.useRef(null); const EmojiListRef = React.useRef(null); const SearchInputRef = React.useRef(null); const SkinTonePickerRef = React.useRef(null); const CategoryNavigationRef = React.useRef(null); const VariationPickerRef = React.useRef(null); const ReactionsRef = React.useRef(null); return ( {children} ); } export type ElementRef = React.MutableRefObject; type ElementRefs = { PickerMainRef: ElementRef; AnchoredEmojiRef: ElementRef; EmojiListRef: ElementRef; SkinTonePickerRef: ElementRef; SearchInputRef: ElementRef; BodyRef: ElementRef; CategoryNavigationRef: ElementRef; VariationPickerRef: ElementRef; ReactionsRef: ElementRef; }; const ElementRefContext = React.createContext({ AnchoredEmojiRef: React.createRef(), BodyRef: React.createRef(), CategoryNavigationRef: React.createRef(), EmojiListRef: React.createRef(), PickerMainRef: React.createRef(), SearchInputRef: React.createRef(), SkinTonePickerRef: React.createRef(), VariationPickerRef: React.createRef(), ReactionsRef: React.createRef(), }); function useElementRef() { return React.useContext(ElementRefContext); } export function useEmojiListRef() { return useElementRef()['EmojiListRef']; } export function usePickerMainRef() { return useElementRef()['PickerMainRef']; } export function useAnchoredEmojiRef() { return useElementRef()['AnchoredEmojiRef']; } export function useSetAnchoredEmojiRef(): (target: NullableElement) => void { const AnchoredEmojiRef = useAnchoredEmojiRef(); return (target: NullableElement) => { if (target === null && AnchoredEmojiRef.current !== null) { focusElement(AnchoredEmojiRef.current); } AnchoredEmojiRef.current = target; }; } export function useBodyRef() { return useElementRef()['BodyRef']; } export function useReactionsRef() { return useElementRef()['ReactionsRef']; } export function useSearchInputRef() { return useElementRef()['SearchInputRef']; } export function useSkinTonePickerRef() { return useElementRef()['SkinTonePickerRef']; } export function useCategoryNavigationRef() { return useElementRef()['CategoryNavigationRef']; } export function useVariationPickerRef() { return useElementRef()['VariationPickerRef']; }