import { Map, YMaps } from "@pbe/react-yandex-maps"; import type { ReactElement, FC, PropsWithChildren, NamedExoticComponent, } from "react"; import { useContext, memo, useEffect, useState, useRef, } from "react"; import type { IMapState, IMapOptions, Clusterer } from "yandex-maps"; import type { TMapContext, TCluster, TLangs, TAPI, TMapInstance, } from "../config/types"; import { MapContext } from "../context"; import { MapItems } from "../ui/MapItems"; import type { TMapItemsProps } from "../ui/MapItems"; import { MapModules } from "../ui/MapModules"; import type { TMapModulesProps } from "../ui/MapModules"; import { MapPanel } from "../ui/MapPanel"; import type { TMapPanelProps } from "../ui/MapPanel"; const MemoModules: NamedExoticComponent = memo((props) => ); MemoModules.displayName = "MapModules"; const MemoItems: NamedExoticComponent = memo((props) => ); MemoItems.displayName = "MapItems"; const MemoPanel: NamedExoticComponent = memo((props) => ); MemoPanel.displayName = "MapPanel"; /** * Внутренний компонент карты * @returns {ReactElement} */ const YandexMap: FC void; onError: (err: Error) => void; state: IMapState; options: IMapOptions; query: { apikey: string; lang: TLangs; }; clusters: TCluster[]; }> = ({ onReady, onError, children, query, state, clusters, options, }): ReactElement => { const { instanceRef, getCN } = useContext(MapContext); const [ apiInstance, setApiInstance ] = useState(null); const [ clustersInstance, setClustersInstance ] = useState(null); const isReadyCalled = useRef(false); const onClustersReady = (clusters: Clusterer[]) => { setClustersInstance(clusters); }; const onMapReady = (ymaps: TAPI) => { setApiInstance(ymaps); }; const saveInstance = (instance: TMapInstance) => { if (instance) { // can be null instanceRef.current = instance; } }; useEffect(() => { if (apiInstance && clustersInstance && !isReadyCalled.current && typeof onReady === "function") { isReadyCalled.current = true; onReady(apiInstance, clustersInstance); } }, [ apiInstance, clustersInstance, onReady ]); return ( {children} ); }; export default YandexMap;