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


import React from 'react';

import { Icon } from '@uikit/Icon';
import { BUTTON_MORE_ROW_KEY } from '@widgets/TradingResult/components/Repo/constants';
import { LoadMoreButton } from '@widgets/TradingResult/components/Repo/repo-table/component/loadMoreButton';
import { DataInfoByGroup } from '@widgets/TradingResult/components/Repo/repo-table/logic/table/useLoadGroupSubRowsData';
import { GroupFiltersStruct } from '@widgets/TradingResult/components/Repo/types/group';
import { Group } from 'types/MonitorRepo';

import repoTableStyles from '../styles/repoTable.module.scss';

export const createInitialGroupFilters = (record: any): GroupFiltersStruct => {
  const initialGroupFilters = Object.keys(record.rowData)?.reduce((acc, dataKey) => {
    const dataValue = record.rowData[dataKey];
    const isObject = typeof dataValue === 'object' && !Array.isArray(dataValue);

    if (isObject) {
      const groupValue = record.key;
      const filterName = dataKey;
      const filterValue = record.rowData?.[filterName]?.value;

      return {
        ...acc,
        [groupValue]: {
          ...acc?.[groupValue],
          [filterName]: filterValue,
        },
      };
    }
    return acc;
  }, {} as GroupFiltersStruct);

  return initialGroupFilters as GroupFiltersStruct;
};

export const ExpandIcon = ({ onExpand, record }: any) =>
  record.children && (
    <div
      className={repoTableStyles.expandIconWrapper}
      onClick={(e: React.MouseEvent<HTMLElement>) => onExpand(record, e)}
    >
      <Icon variant="chevron-down" />
    </div>
  );

export const unifyGroupAndChildrenRows = (
  groupSubRowsData: Record<string, DataInfoByGroup>,
  groupsData: any[] | Record<string, any>[],
  buttonMargin: number,
  loadMore: (groupValue: string) => Promise<void>,
) => {
  // ищем значения групп по которым существуют данные подстрок
  const groupValues = Object.keys(groupSubRowsData);

  if (groupValues.length === 0) {
    return groupsData;
  }
  groupValues?.forEach((groupValue) => {
    const searchedGroup = groupsData?.find((groupData: any) => groupData.key === groupValue);

    if (searchedGroup) {
      const isEmptyChildrenRows = groupSubRowsData?.[groupValue]?.data?.length === 0;
      const loadedRowsNumber = (groupSubRowsData?.[groupValue]?.page + 1) * groupSubRowsData?.[groupValue]?.size;
      const itemsCount = groupSubRowsData?.[groupValue]?.data?.length;
      const totalValues = groupSubRowsData?.[groupValue]?.total || 0;
      // подгруженные данные репо по группировке заносим в общую структуру групп как children
      searchedGroup.children = [
        ...groupSubRowsData[groupValue]?.data,
        {
          key: `${BUTTON_MORE_ROW_KEY}${groupValue}`,
          forceToSort: true,
          secId: (
            <LoadMoreButton
              styles={{ marginLeft: buttonMargin }}
              onClick={() => loadMore(groupValue)}
              loaded={!isEmptyChildrenRows ? Math.min(loadedRowsNumber, totalValues, itemsCount) : 0}
              shouldDisplayButton={itemsCount === loadedRowsNumber}
              total={!isEmptyChildrenRows ? totalValues || loadedRowsNumber : 0}
            />
          ),
        },
      ];
    }
  });

  return [...(groupsData || [])];
};

/** Обновляем только пересчитываемые значения */
export const refreshRowAggValues = (oldGroup: Group, newGroup: Group): Group => {
  const valuesToNeedRefresh = ['aggPrice', 'aggQuantity', 'aggAccint', 'aggValue', 'aggRepoRate', 'aggRepoValue'];
  let refreshRow = oldGroup;

  for (const key of Object.keys(refreshRow)) {
    const typedKey = key as keyof Group;

    if (valuesToNeedRefresh.includes(typedKey)) {
      const refreshedValue = newGroup[typedKey];
      refreshRow = { ...refreshRow, [typedKey]: refreshedValue };
    }
  }
  return refreshRow;
};