From 0cebf60549ea2d3e9704397cabf342779253909b Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Fri, 15 Sep 2023 14:36:07 +0300 Subject: [PATCH] elt/kasko: add abortController --- apps/web/Components/Calculation/Form/ELT/Kasko.tsx | 12 +++++++++--- apps/web/api/elt/query.ts | 13 +++++++++---- apps/web/process/elt/reactions/common.ts | 2 ++ apps/web/stores/tables/elt/policy.ts | 2 ++ 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/apps/web/Components/Calculation/Form/ELT/Kasko.tsx b/apps/web/Components/Calculation/Form/ELT/Kasko.tsx index 2108907..9d57c95 100644 --- a/apps/web/Components/Calculation/Form/ELT/Kasko.tsx +++ b/apps/web/Components/Calculation/Form/ELT/Kasko.tsx @@ -11,6 +11,7 @@ import { defaultRow } from '@/stores/tables/elt/default-values'; import { useApolloClient } from '@apollo/client'; import { observer } from 'mobx-react-lite'; import { omit, sift } from 'radash'; +import { useCallback } from 'react'; import { Flex } from 'ui/grid'; const storeSelector: StoreSelector = ({ kasko }) => kasko; @@ -32,7 +33,10 @@ export const Kasko = observer(() => { const apolloClient = useApolloClient(); const { init } = helper({ apolloClient, store }); - async function handleOnClick() { + const handleOnClick = useCallback(async () => { + $tables.elt.kasko.abortController?.abort(); + $tables.elt.kasko.abortController = new AbortController(); + const { kasko } = await init(); $tables.elt.kasko.setRows(kasko); const kaskoCompanyIds = sift( @@ -48,7 +52,9 @@ export const Kasko = observer(() => { if (row) { $tables.elt.kasko.setRow({ key, status: 'fetching' }); makeEltKaskoRequest({ apolloClient, store }, row) - .then((payload) => getEltKasko(payload)) + .then((payload) => + getEltKasko(payload, { signal: $tables.elt.kasko.abortController?.signal }) + ) .then((res) => { if (res) { const companyRes = res?.[row.id]; @@ -114,7 +120,7 @@ export const Kasko = observer(() => { }); } }); - } + }, [$calculation.$values, $tables.elt.kasko, $tables.insurance, apolloClient, init, store]); function handleOnSelectRow(row: Row) { $tables.insurance.row('kasko').column('insuranceCompany').setValue(row.key); diff --git a/apps/web/api/elt/query.ts b/apps/web/api/elt/query.ts index 2eda9d5..6711811 100644 --- a/apps/web/api/elt/query.ts +++ b/apps/web/api/elt/query.ts @@ -2,12 +2,14 @@ import type * as ELT from './types'; import getUrls from '@/config/urls'; import { TIMEOUT } from '@/constants/request'; import { withHandleError } from '@/utils/axios'; -import type { QueryFunctionContext } from '@tanstack/react-query'; import axios from 'axios'; const { URL_ELT_KASKO, URL_ELT_OSAGO } = getUrls(); -export async function getEltOsago(payload: ELT.RequestEltOsago, { signal }: QueryFunctionContext) { +export async function getEltOsago( + payload: ELT.RequestEltOsago, + { signal }: { signal: AbortSignal } +) { return withHandleError( axios .post(URL_ELT_OSAGO, payload, { signal, timeout: TIMEOUT }) @@ -15,10 +17,13 @@ export async function getEltOsago(payload: ELT.RequestEltOsago, { signal }: Quer ); } -export async function getEltKasko(payload: ELT.RequestEltKasko) { +export async function getEltKasko( + payload: ELT.RequestEltKasko, + { signal }: { signal: AbortSignal } +) { return withHandleError( axios - .post(URL_ELT_KASKO, payload, { timeout: TIMEOUT }) + .post(URL_ELT_KASKO, payload, { signal, timeout: TIMEOUT }) .then(({ data }) => data) ); } diff --git a/apps/web/process/elt/reactions/common.ts b/apps/web/process/elt/reactions/common.ts index c5149fd..3c4406f 100644 --- a/apps/web/process/elt/reactions/common.ts +++ b/apps/web/process/elt/reactions/common.ts @@ -100,6 +100,8 @@ export default function reactions(context: ProcessContext) { if (initialValues) { $tables.elt.kasko.setRows(initialValues.kasko); } + + $tables.elt.kasko.abortController?.abort(); }, { delay: 10, diff --git a/apps/web/stores/tables/elt/policy.ts b/apps/web/stores/tables/elt/policy.ts index 407593e..e3c179d 100644 --- a/apps/web/stores/tables/elt/policy.ts +++ b/apps/web/stores/tables/elt/policy.ts @@ -17,6 +17,8 @@ export default class PolicyStore { private rows: IObservableArray; private selectedKey: string | null = null; + public abortController = new AbortController(); + constructor({ rootStore, validationConfig }: ConstructorInput) { this.rows = observable([]); makeAutoObservable(this);