135 lines
4.2 KiB
TypeScript
135 lines
4.2 KiB
TypeScript
/* eslint-disable sonarjs/cognitive-complexity */
|
|
import { PolicyTable, ReloadButton, Validation } from './Components';
|
|
import { columns } from './lib/config';
|
|
import { makeEltOsagoRequest } from './lib/make-request';
|
|
import type { Row, StoreSelector } from './types';
|
|
import { getEltOsago } from '@/api/elt/query';
|
|
import { STALE_TIME } from '@/constants/request';
|
|
import { MAX_INSURANCE, MIN_INSURANCE } from '@/constants/values';
|
|
import { useStore } from '@/stores/hooks';
|
|
import { useApolloClient } from '@apollo/client';
|
|
import type { QueryFunctionContext } from '@tanstack/react-query';
|
|
import { useQueries } from '@tanstack/react-query';
|
|
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((row) => {
|
|
const { id, key } = row;
|
|
|
|
return {
|
|
enabled: false,
|
|
initialData: { ...row, error: '', premiumSum: 0 },
|
|
queryFn: async (context: QueryFunctionContext) => {
|
|
const payload = await makeEltOsagoRequest({ apolloClient, store }, row);
|
|
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, status: 'fetching', sum: 0 }));
|
|
$tables.elt.osago.setRows(fetchingRows);
|
|
|
|
queries.forEach(({ refetch, data }) => {
|
|
refetch()
|
|
.then((res) => {
|
|
if (res.data) {
|
|
const { key, numCalc, premiumSum, message, skCalcId } = res.data;
|
|
let { error } = res.data;
|
|
|
|
if (premiumSum > MAX_INSURANCE) {
|
|
error ||= `Сумма по страховке превышает максимально допустимое значение по стоимости ОСАГО: ${Intl.NumberFormat(
|
|
'ru',
|
|
{
|
|
currency: 'RUB',
|
|
style: 'currency',
|
|
}
|
|
).format(MAX_INSURANCE)}`;
|
|
}
|
|
|
|
if (premiumSum < MIN_INSURANCE) {
|
|
error ||= `Сумма по страховке не должна быть меньше допустимого значения по стоимости ОСАГО: ${Intl.NumberFormat(
|
|
'ru',
|
|
{
|
|
currency: 'RUB',
|
|
style: 'currency',
|
|
}
|
|
).format(MIN_INSURANCE)}`;
|
|
}
|
|
|
|
$tables.elt.osago.setRow({
|
|
key,
|
|
message: error || message,
|
|
numCalc,
|
|
skCalcId,
|
|
status: error ? 'error' : null,
|
|
sum: premiumSum,
|
|
});
|
|
}
|
|
})
|
|
.catch((error) => {
|
|
if (data?.key)
|
|
$tables.elt.osago.setRow({
|
|
key: data?.key,
|
|
message: error,
|
|
numCalc: 0,
|
|
skCalcId: '',
|
|
status: 'error',
|
|
sum: 0,
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
function handleOnSelectRow(row: Row) {
|
|
$tables.insurance.row('osago').column('insuranceCompany').setValue(row.key);
|
|
$tables.insurance.row('osago').column('insCost').setValue(row.sum);
|
|
}
|
|
|
|
type Column = (typeof columns)[number];
|
|
const osagoColumns = columns.map((column: Column) => {
|
|
if (column.key === 'name') {
|
|
return {
|
|
...column,
|
|
title: 'Страховая компания ОСАГО',
|
|
};
|
|
}
|
|
|
|
if (column.key === 'status') {
|
|
return {
|
|
...column,
|
|
title: <ReloadButton storeSelector={storeSelector} onClick={() => handleOnClick()} />,
|
|
};
|
|
}
|
|
|
|
return column;
|
|
});
|
|
|
|
return (
|
|
<Flex flexDirection="column">
|
|
<Validation storeSelector={storeSelector} />
|
|
<PolicyTable
|
|
storeSelector={storeSelector}
|
|
columns={osagoColumns}
|
|
onSelectRow={(row) => handleOnSelectRow(row)}
|
|
/>
|
|
</Flex>
|
|
);
|
|
}
|