diff --git a/apps/web/Components/Calculation/Form/ELT/Kasko.tsx b/apps/web/Components/Calculation/Form/ELT/Kasko.tsx index f3f3272..9d3dd73 100644 --- a/apps/web/Components/Calculation/Form/ELT/Kasko.tsx +++ b/apps/web/Components/Calculation/Form/ELT/Kasko.tsx @@ -9,9 +9,8 @@ import helper from '@/process/elt/lib/helper'; import { useStore } from '@/stores/hooks'; import { defaultRow } from '@/stores/tables/elt/default-values'; import { useApolloClient } from '@apollo/client'; -import type { QueryFunctionContext } from '@tanstack/react-query'; -import { useQueries } from '@tanstack/react-query'; import { observer } from 'mobx-react-lite'; +import { sift } from 'radash'; import { Flex } from 'ui/grid'; const storeSelector: StoreSelector = ({ kasko }) => kasko; @@ -25,72 +24,43 @@ const initialData = { kaskoSum: 0, }, ], - sum: 0, }; export const Kasko = observer(() => { const store = useStore(); const { $tables, $calculation } = store; - const apolloClient = useApolloClient(); - const { init } = helper({ apolloClient, store }); - const queries = useQueries({ - queries: $tables.elt.kasko.getRows.map((row) => { - const { id, key, name } = row; - - return { - enabled: false, - initialData: { ...initialData, id, key, name }, - queryFn: async (context: QueryFunctionContext) => { - const payload = await makeEltKaskoRequest({ apolloClient, store }, row); - const res = await getEltKasko(payload, context); - - if (res) { - const companyRes = res?.[id]; - - return { ...companyRes, id, key, name }; - } - - return { ...initialData, id, key, name }; - }, - queryKey: ['elt', 'kasko', id], - refetchOnWindowFocus: false, - retry: false, - }; - }), - }); - async function handleOnClick() { const { kasko } = await init(); $tables.elt.kasko.setRows(kasko); - - const kaskoCompanyIds = $tables.insurance - .row('kasko') - .getOptions('insuranceCompany') - .map((x) => x.value); + const kaskoCompanyIds = sift( + $tables.insurance + .row('kasko') + .getOptions('insuranceCompany') + .map((x) => x.value) + ); const values = $calculation.$values.getValues(); - queries - .filter(({ data }) => data?.key && kaskoCompanyIds.includes(data.key)) - .forEach(({ refetch, data, remove }) => { - remove(); - if (data?.key) $tables.elt.kasko.setRow({ key: data?.key, status: 'fetching' }); - - refetch() + kaskoCompanyIds.forEach((key) => { + const row = $tables.elt.kasko.getRow(key); + if (row) { + $tables.elt.kasko.setRow({ key, status: 'fetching' }); + makeEltKaskoRequest({ apolloClient, store }, row) + .then((payload) => getEltKasko(payload)) .then((res) => { - if (res.data) { + if (res) { + const companyRes = res?.[row.id]; const { - key, kaskoSum = 0, message, skCalcId, totalFranchise = 0, requestId, paymentPeriods, - } = res.data; - let { error } = res.data; + } = companyRes; + let { error } = companyRes; if (totalFranchise > MAX_FRANCHISE) { error ||= `Франшиза по страховке превышает максимально допустимое значение: ${Intl.NumberFormat( @@ -129,21 +99,21 @@ export const Kasko = observer(() => { requestId, skCalcId, status: error ? 'error' : null, - sum: values.leasingPeriod <= 16 ? kaskoSum : paymentPeriods?.at(0)?.kaskoSum || 0, + sum: values.leasingPeriod <= 16 ? kaskoSum : paymentPeriods?.[0]?.kaskoSum || 0, totalFranchise, }); } }) .catch((error) => { - if (data?.key) - $tables.elt.kasko.setRow({ - ...defaultRow, - key: data?.key, - message: error, - status: 'error', - }); + $tables.elt.kasko.setRow({ + ...initialData, + key, + message: error, + status: 'error', + }); }); - }); + } + }); } function handleOnSelectRow(row: Row) { diff --git a/apps/web/api/elt/query.ts b/apps/web/api/elt/query.ts index 318ac54..2eda9d5 100644 --- a/apps/web/api/elt/query.ts +++ b/apps/web/api/elt/query.ts @@ -15,10 +15,10 @@ export async function getEltOsago(payload: ELT.RequestEltOsago, { signal }: Quer ); } -export async function getEltKasko(payload: ELT.RequestEltKasko, { signal }: QueryFunctionContext) { +export async function getEltKasko(payload: ELT.RequestEltKasko) { return withHandleError( axios - .post(URL_ELT_KASKO, payload, { signal, timeout: TIMEOUT }) + .post(URL_ELT_KASKO, payload, { timeout: TIMEOUT }) .then(({ data }) => data) ); } diff --git a/apps/web/stores/tables/elt/policy.ts b/apps/web/stores/tables/elt/policy.ts index 776c648..407593e 100644 --- a/apps/web/stores/tables/elt/policy.ts +++ b/apps/web/stores/tables/elt/policy.ts @@ -55,6 +55,10 @@ export default class PolicyStore { if (index >= 0) this.rows[index] = { ...this.rows[index], ...row }; }; + public getRow(key: string) { + return this.rows.find((x) => x.key === key); + } + public get getRows() { return toJS(this.rows); }