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


import { Dropdown } from 'antd';
import locale from 'antd/es/date-picker/locale/ru_RU';
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';

import { DatePickerDark } from '@components/DatePicker';
import { DEFAULT_DATE } from '@components/DatePicker/DatePickerMad';
import { ClearInputIcon } from '@components/Icons/ClearInputIcon';
import { SelectDark, SelectLight } from '@components/Select';
import { TextMedium } from '@components/TextMad';
import { getDateFormat } from '@configs/standartDateFormat';
import useClickOutside from '@hooks/useClickOutside';

import { Icon } from '@uikit/Icon';

import styles from '../../tradingResult.module.scss';
import { dataPickerGroupDisabled, sortArray } from '../../utilites';
import { BigDropdown } from '../BigDropdown';

import type { Dayjs } from 'dayjs';

import '../../tradingResult.scss';

interface IBondsFilters {
  containerWidth: number;
  currentBondInstrument?: string;
  handleChangeBondInstrumentsFilter: (value?: string) => void;
  bondInstruments: { label: string; value: string }[];
  currentBondTradingMode?: string;
  handleChangeBondTradingModesFilter: (value?: string) => void;
  bondTradingModes: { label: string; value: string }[];
  handleSearchBond: (value: string) => void;
  currentDateBond: Dayjs;
  handleChangeCurrentDateBond: (value: Dayjs) => void;
}

const calculateMaxContainerWidth = (widgetWidth: number) =>
  // поменять при изменении наполнения контейнера фильтров
  widgetWidth < 933 ? { maxWidth: '409px' } : { maxWidth: '627px' };

export const BondFilters: React.FC<IBondsFilters> = ({
  containerWidth,
  currentBondInstrument,
  handleChangeBondInstrumentsFilter,
  bondInstruments,
  currentBondTradingMode,
  handleChangeBondTradingModesFilter,
  bondTradingModes,
  currentDateBond,
  handleChangeCurrentDateBond,
}) => {
  const preparedBonds = useMemo(
    () =>
      [...bondTradingModes]
        .sort((first, second) => sortArray(first.value, second.value))
        .map((item) => ({
          title: item.label,
          subTitle: item.value,
          value: item.value,
        })),
    [bondTradingModes],
  );

  const preparedBondsInstruments = useMemo(
    () =>
      [...bondInstruments]
        .sort((first, second) => sortArray(first.label, second.label))
        .map((item) => ({
          title: item.label,
          value: item.value,
          subTitle: item.value,
        })),
    [bondInstruments],
  );

  const [open, setOpen] = useState(false);
  const [openInstruments, setOpenInstruments] = useState(false);

  const [bondLabel, setBondLabel] = useState<null | string>(null);
  const [instrumentLabel, setInstrumentLabel] = useState<null | string>(null);

  const bondsPopupRef = useRef<HTMLDivElement | null>(null);
  const instrumentPopupRef = useRef<HTMLDivElement | null>(null);

  const handleToggleBondsDropdown = useCallback(() => {
    setOpen((prev) => !prev);
  }, []);

  const handleToggleInstrumentDropdown = useCallback(() => {
    setOpenInstruments((prev) => !prev);
  }, []);

  useClickOutside(instrumentPopupRef, () => setOpenInstruments(false));

  useClickOutside(bondsPopupRef, () => setOpen(false));

  useEffect(() => {
    const matchedOption = bondTradingModes.find(
      ({ value }) => value === currentBondTradingMode,
    );

    setBondLabel(matchedOption ? matchedOption.label : null);
  }, [currentBondTradingMode, bondTradingModes]);

  useEffect(() => {
    const matchedOption = bondInstruments.find(
      ({ value }) => value === currentBondInstrument,
    );

    setInstrumentLabel(matchedOption?.label ?? null);
  }, [currentBondInstrument, bondInstruments]);

  const renderInstrumentDropdown = useCallback(
    () => (
      <div ref={instrumentPopupRef}>
        <Dropdown>
          <BigDropdown
            placeholderCustomName="Введите название инструмента"
            selectedItemProps={currentBondInstrument}
            dropdownItems={preparedBondsInstruments}
            onClick={(value) => {
              handleChangeBondInstrumentsFilter(value);
              handleToggleInstrumentDropdown();
            }}
          />
        </Dropdown>
      </div>
    ),
    [
      currentBondInstrument,
      preparedBondsInstruments,
      handleChangeBondInstrumentsFilter,
      handleToggleInstrumentDropdown,
    ],
  );

  const renderBondsDropdown = useCallback(
    () => (
      <div ref={bondsPopupRef}>
        <Dropdown>
          <BigDropdown
            selectedItemProps={currentBondTradingMode}
            dropdownItems={preparedBonds}
            placeholderCustomName="Введите название режима торгов"
            onClick={(value) => {
              handleChangeBondTradingModesFilter(value);
              handleToggleBondsDropdown();
            }}
          />
        </Dropdown>
      </div>
    ),
    [
      currentBondTradingMode,
      preparedBonds,
      handleChangeBondTradingModesFilter,
      handleToggleBondsDropdown,
    ],
  );

  return (
    <div
      style={calculateMaxContainerWidth(containerWidth)}
      className={styles.groupFiltersContainer}
    >
      <div className={styles.groupFiltersItem}>
        <SelectDark
          popupMatchSelectWidth={false}
          placeholder="Инструмент"
          open={openInstruments}
          className={styles.groupFiltersItem}
          value={instrumentLabel}
          onClick={handleToggleInstrumentDropdown}
          notFoundContent={
            <div style={{ padding: '4px' }}>
              <TextMedium>Нет данных</TextMedium>
            </div>
          }
          dropdownRender={renderInstrumentDropdown}
          suffixIcon={currentBondInstrument ? null : <Icon variant="chevron-down" />}
        />

        {currentBondInstrument && (
          <div
            className={styles['clear-input-icon']}
            onClick={() => handleChangeBondInstrumentsFilter(undefined)}
          >
            <ClearInputIcon />
          </div>
        )}
      </div>

      <div className={styles.groupFiltersItem}>
        <SelectLight
          value={bondLabel}
          className={styles.groupFiltersItem}
          popupMatchSelectWidth={false}
          placeholder="Режим торгов"
          open={open}
          onClick={handleToggleBondsDropdown}
          dropdownRender={renderBondsDropdown}
          suffixIcon={currentBondTradingMode ? null : <Icon variant="chevron-down" />}
        />

        {currentBondTradingMode && (
          <div
            className={styles['clear-input-icon']}
            onClick={() => handleChangeBondTradingModesFilter(undefined)}
          >
            <ClearInputIcon />
          </div>
        )}
      </div>

      <DatePickerDark
        disabledDate={dataPickerGroupDisabled}
        format={getDateFormat}
        value={currentDateBond}
        locale={locale}
        className={styles.groupFiltersItem}
        onChange={(date) => {
          handleChangeCurrentDateBond(date ?? DEFAULT_DATE);
        }}
      />
    </div>
  );
};