2023-05-07 14:16:41 +03:00

73 lines
2.3 KiB
TypeScript

import { PolicyTable, ReloadButton, Validation } from './Components';
import { columns } from './lib/config';
import { makeEltOsagoRequest } from './lib/make-request';
import type { StoreSelector } from './types';
import { getEltOsago } from '@/api/elt/query';
import { STALE_TIME } from '@/constants/request';
import { useStore } from '@/stores/hooks';
import { useApolloClient } from '@apollo/client';
import type { QueryFunctionContext } from '@tanstack/react-query';
import { useQueries } from '@tanstack/react-query';
import { clone } from 'tools';
import { Flex } from 'ui/grid';
const storeSelector: StoreSelector = ({ osago }) => osago;
export function Osago() {
const store = useStore();
const { $tables } = store;
const rows = $tables.elt.osago.getRows;
const apolloClient = useApolloClient();
const queries = useQueries({
queries: rows.map(({ key, id }) => ({
enabled: false,
queryFn: async (context: QueryFunctionContext) => {
const payload = await makeEltOsagoRequest({ apolloClient, store }, id);
const res = await getEltOsago(payload, context);
const companyRes = res[id];
return { ...companyRes, id, key };
},
queryKey: ['elt', 'osago', id],
refetchOnWindowFocus: false,
staleTime: STALE_TIME,
})),
});
async function handleOnClick() {
const fetchingRows = rows.map((x) => ({ ...x, isFetching: true }));
$tables.elt.osago.setRows(fetchingRows);
queries.forEach(({ refetch }) => {
refetch().then((res) => {
if (res.data) {
const { key, numCalc, premiumSum, message, skCalcId, error } = res.data;
$tables.elt.osago.setRow({
isFetching: false,
key,
message: message || error,
numCalc,
skCalcId,
sum: premiumSum,
});
}
});
});
}
const osagoColumns = clone(columns);
osagoColumns[0].title = 'Страховая компания ОСАГО';
osagoColumns[3].title = (
<ReloadButton storeSelector={storeSelector} onClick={() => handleOnClick()} />
);
return (
<Flex flexDirection="column">
<Validation storeSelector={storeSelector} />
<PolicyTable storeSelector={storeSelector} columns={osagoColumns} />
</Flex>
);
}