import { isNode } from "@web3r/flowerkit/dom";
import type { RefObject } from "react";
import { createRef } from "react";
/**
* Возвращает DOM-элемент, указанный в объекте `ref`.
* Полезно, если в компоненте используется `useImperativeHandle`.
* @template T - тип значения, хранящегося в `ref.current`.
* @example
* import { useEffect, useRef } from "react";
* import { DatePicker } from "@delement/ui/components";
* import { getElRefHelper } from "@delement/ui/utils/react";
*
* const Component = () => {
*
* const pickerRef = useRef(null);
*
* useEffect(() => {
* const node = getElRefHelper(pickerRef);
* console.debug(node); // => HTMLElement
* });
*
* return ;
* };
* @returns {HTMLElement|null} Возвращает найденный DOM-элемент или `null`, если его не удалось извлечь из `ref`.
*/
export const getElRefHelper = (
ref: RefObject | HTMLElement | null | undefined = createRef()
): HTMLElement | null => {
if (!ref) {
return null;
}
if (typeof HTMLElement !== "undefined" && ref instanceof HTMLElement) {
return ref;
}
const current = ("current" in ref) ? ref.current : null;
if (current && typeof current === "object") {
const currentObj = current as Record;
if ("element" in currentObj && isNode(currentObj.element)) {
return currentObj.element as HTMLElement;
}
if ("el" in currentObj && isNode(currentObj.el)) {
return currentObj.el as HTMLElement;
}
if (isNode(current)) {
return current as unknown as HTMLElement;
}
}
return null;
};