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


import { Dropdown } from 'antd';
import locale from 'antd/es/date-picker/locale/ru_RU';
import React, { 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,
  handleSearchBond,
  currentDateBond,
  handleChangeCurrentDateBond,
}) => {
  const preparedBonds = useMemo(
    () =>
      bondTradingModes
        ?.sort((fist, second) => sortArray(fist.value, second.value))
        .map((item) => ({ title: item.label, subTitle: item.value, value: item.value })),
    [bondTradingModes],
  );

  const preparedBondsInstruments = useMemo(
    () =>
      bondInstruments
        .sort((fist, second) => sortArray(fist.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 = () => {
    setOpen(!open);
  };

  const handleToggleInstrumentDropdown = () => {
    setOpenInstruments(!openInstruments);
  };

  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.filter((item) => item.value === currentBondInstrument);

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

  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={() => (
            <div ref={instrumentPopupRef}>
              <Dropdown>
                <BigDropdown
                  placeholderCustomName="Введите название инструмента"
                  selectedItemProps={currentBondInstrument}
                  dropdownItems={preparedBondsInstruments}
                  onClick={(value) => {
                    handleChangeBondInstrumentsFilter(value);
                    handleToggleInstrumentDropdown();
                  }}
                />
              </Dropdown>
            </div>
          )}
          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={() => (
            <div ref={bondsPopupRef}>
              <Dropdown>
                <BigDropdown
                  selectedItemProps={currentBondTradingMode}
                  dropdownItems={preparedBonds}
                  placeholderCustomName="Введите название режима торгов"
                  onClick={(value) => {
                    handleChangeBondTradingModesFilter(value);
                    handleToggleBondsDropdown();
                  }}
                />
              </Dropdown>
            </div>
          )}
          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>
  );
};