Загрузка данных


import { MoexChart, Timeframes } from 'moex-chart';

// eslint-disable-next-line import/no-unresolved -- MOEX_CHART
import { CompareManager } from 'moex-chart/dist/types/core/CompareManager';
import { useEffect, useRef, useState } from 'react';

import { useChangeProperties, useSelectProperties } from '@modules/widgetProperties';
import { ChartIndicativeData, ChartProps } from '@widgets/Chart/types';

import { MOEX_CHART_CONFIG } from '../constants';
import { dataSourceProvider, DataSourceProvider } from '../dataSourceProvide';

type TUseMoexChartProps = {
  symbol: string;
  indicativeData: ChartIndicativeData | undefined;
};

export const useMoexChart = ({ symbol, indicativeData }: TUseMoexChartProps) => {
  const moexChartTimeFrame = useSelectProperties((wProps: Partial<ChartProps>) => wProps.moexChartState?.tf);

  const { updateProperties } = useChangeProperties<ChartProps>();

  const handleUpdateTimeFrame = (tf: Timeframes) => {
    if (moexChartTimeFrame === tf) {
      return;
    }

    updateProperties((state) => {
      if (state.moexChartState) {
        state.moexChartState.tf = tf;
      } else {
        state.moexChartState = {
          tf,
        };
      }
    });
  };

  const [isCompareOpen, setIsCompareOpen] = useState(false);

  const containerRef = useRef<HTMLDivElement | null>(null);
  const compareManagerRef = useRef<null | CompareManager>(null);

  useEffect(() => {
    const container = containerRef.current;

    if (!container) {
      return;
    }

    const chart = new MoexChart({
      container,
      openCompareModal: () => setIsCompareOpen(true),
      initialSymbol: symbol,
      getDataSource: DataSourceProvider.getDataSource(indicativeData, handleUpdateTimeFrame),
      initialTimeframe: moexChartTimeFrame || Timeframes['1m'],
      ...MOEX_CHART_CONFIG,
    });

    const { getSymbols, getTimeframe, update } = chart.getRealtimeApi();
    const stopRealtime = dataSourceProvider.startRealtime({ getSymbols, getTimeframe, update });
    const compareManager = chart.getCompareManager();
    compareManagerRef.current = compareManager;
    return () => {
      stopRealtime();
      chart.destroy();
    };
    // eslint-disable-next-line react-hooks/exhaustive-deps -- Должно тригереться только на это.
  }, [symbol, indicativeData]);

  return {
    containerRef,
    isCompareOpen,
    compareManagerRef,
    setIsCompareOpen,
  };
};