diff --git a/src/taxes/components/TaxCountryDialog/TaxCountryDialog.tsx b/src/taxes/components/TaxCountryDialog/TaxCountryDialog.tsx index fcce3f2a2d2..62f8b2517e7 100644 --- a/src/taxes/components/TaxCountryDialog/TaxCountryDialog.tsx +++ b/src/taxes/components/TaxCountryDialog/TaxCountryDialog.tsx @@ -1,4 +1,3 @@ -// @ts-strict-ignore import { DashboardModal } from "@dashboard/components/Modal"; import { CountryFragment } from "@dashboard/graphql"; import { useLocalSearch } from "@dashboard/hooks/useLocalSearch"; @@ -70,7 +69,7 @@ const TaxCountryDialog = ({ open, countries, onConfirm, onClose }: TaxCountryDia __marginLeft={-15} __paddingLeft={15} > - {filteredCountries.map(country => ( + {filteredCountries?.map(country => ( { - onConfirm(selectedCountry); + if (selectedCountry) { + onConfirm(selectedCountry); + } }} disabled={!selectedCountry} > diff --git a/src/taxes/pages/TaxChannelsPage/TaxChannelsPage.tsx b/src/taxes/pages/TaxChannelsPage/TaxChannelsPage.tsx index ac4260661d0..1bd38c4bef9 100644 --- a/src/taxes/pages/TaxChannelsPage/TaxChannelsPage.tsx +++ b/src/taxes/pages/TaxChannelsPage/TaxChannelsPage.tsx @@ -1,4 +1,3 @@ -// @ts-strict-ignore import { TopNav } from "@dashboard/components/AppLayout/TopNav"; import CardTitle from "@dashboard/components/CardTitle"; import { ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; @@ -125,7 +124,10 @@ const TaxChannelsPage = (props: TaxChannelsPageProps) => {
{({ data, change, submit, set, triggerChange }) => { const countryExceptions = data.updateCountriesConfiguration; - const handleExceptionChange = (event, index) => { + const handleExceptionChange = ( + event: React.ChangeEvent, + index: number, + ) => { const { name, value } = event.target; const currentExceptions = [...data.updateCountriesConfiguration]; const exceptionToChange = { @@ -254,7 +256,12 @@ const TaxChannelsPage = (props: TaxChannelsPageProps) => { }); triggerChange(); }} - onChange={event => handleExceptionChange(event, countryIndex)} + onChange={event => + handleExceptionChange( + event as React.ChangeEvent, + countryIndex, + ) + } /> )) ?? } diff --git a/src/taxes/pages/TaxChannelsPage/TaxCountryExceptionListItem/TaxCountryExceptionListItem.tsx b/src/taxes/pages/TaxChannelsPage/TaxCountryExceptionListItem/TaxCountryExceptionListItem.tsx index b19c6795bc7..99a8cf4344d 100644 --- a/src/taxes/pages/TaxChannelsPage/TaxCountryExceptionListItem/TaxCountryExceptionListItem.tsx +++ b/src/taxes/pages/TaxChannelsPage/TaxCountryExceptionListItem/TaxCountryExceptionListItem.tsx @@ -1,4 +1,3 @@ -// @ts-strict-ignore import ControlledCheckbox from "@dashboard/components/ControlledCheckbox"; import { Select } from "@dashboard/components/Select"; import { TaxConfigurationUpdateInput } from "@dashboard/graphql"; @@ -30,6 +29,10 @@ const TaxCountryExceptionListItem = ({ }: TaxCountryExceptionListItemProps) => { const classes = useStyles(); + if (!country) { + return null; + } + return ( <> diff --git a/src/taxes/pages/TaxChannelsPage/helpers.tsx b/src/taxes/pages/TaxChannelsPage/helpers.tsx index 58ef6bcd486..a8457af5a58 100644 --- a/src/taxes/pages/TaxChannelsPage/helpers.tsx +++ b/src/taxes/pages/TaxChannelsPage/helpers.tsx @@ -16,8 +16,11 @@ export const getTaxAppId = (taxCalculationStrategy: string) => isStrategyFlatRates(taxCalculationStrategy) ? null : taxCalculationStrategy; export const getSelectedTaxStrategy = ( - currentTaxConfiguration: TaxConfigurationFragment | TaxConfigurationPerCountryFragment, + currentTaxConfiguration: + | TaxConfigurationFragment + | TaxConfigurationPerCountryFragment + | undefined, ) => - isStrategyFlatRates(currentTaxConfiguration?.taxCalculationStrategy) + isStrategyFlatRates(currentTaxConfiguration?.taxCalculationStrategy ?? null) ? TaxCalculationStrategy.FLAT_RATES : (currentTaxConfiguration?.taxAppId ?? "legacy-flow"); diff --git a/src/taxes/pages/TaxClassesPage/form.tsx b/src/taxes/pages/TaxClassesPage/form.tsx index 5f24b815816..123338687cb 100644 --- a/src/taxes/pages/TaxClassesPage/form.tsx +++ b/src/taxes/pages/TaxClassesPage/form.tsx @@ -1,4 +1,3 @@ -// @ts-strict-ignore import { useExitFormDialog } from "@dashboard/components/Form/useExitFormDialog"; import { TaxClassFragment } from "@dashboard/graphql"; import useForm, { FormChange, SubmitPromise } from "@dashboard/hooks/useForm"; @@ -34,7 +33,7 @@ interface TaxClassesFormProps { } function useTaxClassesForm( - taxClass: TaxClassFragment, + taxClass: TaxClassFragment | undefined, onTaxClassCreate: (data: TaxClassesPageFormData) => SubmitPromise, onTaxClassUpdate: (data: TaxClassesPageFormData) => SubmitPromise, disabled: boolean, diff --git a/src/taxes/pages/TaxCountriesPage/TaxCountriesPage.tsx b/src/taxes/pages/TaxCountriesPage/TaxCountriesPage.tsx index f3064a6f737..851f9a5f1d4 100644 --- a/src/taxes/pages/TaxCountriesPage/TaxCountriesPage.tsx +++ b/src/taxes/pages/TaxCountriesPage/TaxCountriesPage.tsx @@ -1,4 +1,3 @@ -// @ts-strict-ignore import { TopNav } from "@dashboard/components/AppLayout/TopNav"; import CardTitle from "@dashboard/components/CardTitle"; import { ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; @@ -68,11 +67,15 @@ const TaxCountriesPage = (props: TaxCountriesPageProps) => { [selectedCountryId, countryTaxesData], ); + if (!currentCountry) { + return null; + } + return ( {({ data, handlers, submit }) => { const filteredRates = data?.filter( - rate => rate.label.search(new RegExp(parseQuery(query), "i")) >= 0, + (rate: { label: string }) => rate.label.search(new RegExp(parseQuery(query), "i")) >= 0, ); return ( @@ -102,7 +105,9 @@ const TaxCountriesPage = (props: TaxCountriesPageProps) => { { + onDeleteConfiguration(countryId as CountryCode); + }} onCountryAdd={() => openDialog("add-country")} /> @@ -156,25 +161,32 @@ const TaxCountriesPage = (props: TaxCountriesPageProps) => { - {filteredRates?.map((rate, rateIndex) => ( - - - {rate.label} - - handlers.handleRateChange(rate.id, e.target.value)} - /> - - - {!isLastElement(filteredRates, rateIndex) && } - - )) ?? } + {filteredRates?.map( + ( + rate: { id: string; label: string; value?: string }, + rateIndex: number, + ) => ( + + + {rate.label} + + + handlers.handleRateChange(rate.id, e.target.value) + } + /> + + + {!isLastElement(filteredRates, rateIndex) && } + + ), + ) ?? } )} diff --git a/src/taxes/pages/TaxCountriesPage/form.tsx b/src/taxes/pages/TaxCountriesPage/form.tsx index 0e905233fc8..9723f228ffa 100644 --- a/src/taxes/pages/TaxCountriesPage/form.tsx +++ b/src/taxes/pages/TaxCountriesPage/form.tsx @@ -1,4 +1,3 @@ -// @ts-strict-ignore import { useExitFormDialog } from "@dashboard/components/Form/useExitFormDialog"; import { TaxClassRateInput, TaxCountryConfigurationFragment } from "@dashboard/graphql"; import useForm, { SubmitPromise } from "@dashboard/hooks/useForm"; @@ -23,8 +22,8 @@ interface TaxCountriesFormProps { function useTaxCountriesForm( country: TaxCountryConfigurationFragment, - onSubmit, - disabled, + onSubmit: (data: TaxClassRateInput[]) => SubmitPromise, + disabled: boolean, ): UseTaxCountriesFormResult { // Initial const intl = useIntl(); @@ -32,12 +31,12 @@ function useTaxCountriesForm( id: item.taxClass?.id ?? null, label: item.taxClass?.name ?? intl.formatMessage(taxesMessages.countryDefaultRate), value: item.rate?.toString() ?? "", - data: null, + data: null as any, })); const { formId, triggerChange } = useForm({}, undefined, { confirmLeave: true, }); - const formset = useFormset(initialFormsetData); + const formset = useFormset(initialFormsetData as any); // Handlers const handleRateChange = (id: string, value: string) => { triggerChange(); diff --git a/src/taxes/utils/data.ts b/src/taxes/utils/data.ts index 5efd0981012..be5f44c4494 100644 --- a/src/taxes/utils/data.ts +++ b/src/taxes/utils/data.ts @@ -1,4 +1,3 @@ -// @ts-strict-ignore import { CountryCode, CountryRateInput, @@ -12,20 +11,21 @@ import { mapMetadataItemToInput } from "@dashboard/utils/maps"; import { TaxClassesPageFormData } from "../types"; export const getTaxClassInitialFormData = (taxClass?: TaxClassFragment): TaxClassesPageFormData => { - const initialCountries = taxClass?.countries - .map(item => ({ - id: item.country.code, - label: item.country.country, - value: item.rate?.toString() ?? "", - data: null, - })) - .sort((a, b) => a.label.localeCompare(b.label)); + const initialCountries = + taxClass?.countries + .map(item => ({ + id: item.country.code, + label: item.country.country, + value: item.rate?.toString() ?? "", + data: null as any, + })) + .sort((a, b) => a.label.localeCompare(b.label)) ?? []; return { - id: taxClass?.id, + id: taxClass?.id ?? "", name: taxClass?.name ?? "", - metadata: taxClass?.metadata?.map(mapMetadataItemToInput), - privateMetadata: taxClass?.privateMetadata?.map(mapMetadataItemToInput), + metadata: taxClass?.metadata?.map(mapMetadataItemToInput) ?? [], + privateMetadata: taxClass?.privateMetadata?.map(mapMetadataItemToInput) ?? [], updateTaxClassRates: initialCountries, }; }; @@ -36,7 +36,7 @@ const createCountryRateInput = ({ id, value }: FormsetAtomicData): CountryRateIn }); export const createTaxClassCreateInput = (data: TaxClassesPageFormData): TaxClassCreateInput => ({ - name: data.name, + name: data.name || "", createCountryRates: data.updateTaxClassRates.flatMap(item => { if (!item.value) { return []; diff --git a/src/taxes/utils/useTaxClassFetchMore.ts b/src/taxes/utils/useTaxClassFetchMore.ts index 9c0c6d55e1a..23fdc94b934 100644 --- a/src/taxes/utils/useTaxClassFetchMore.ts +++ b/src/taxes/utils/useTaxClassFetchMore.ts @@ -1,4 +1,3 @@ -// @ts-strict-ignore import { TaxClassBaseFragment, useTaxClassAssignQuery } from "@dashboard/graphql"; import { FetchMoreProps } from "@dashboard/types"; import { mapEdgesToItems } from "@dashboard/utils/maps"; @@ -21,14 +20,18 @@ export function useTaxClassFetchMore(): UseTaxClassFetchMoreHookResult { first: 20, }, }); - const taxClasses = mapEdgesToItems(data?.taxClasses); - const fetchMoreTaxClasses = { - hasMore: data?.taxClasses?.pageInfo?.hasNextPage, + const taxClasses = mapEdgesToItems(data?.taxClasses) ?? []; + const fetchMoreTaxClasses: FetchMoreProps = { + hasMore: data?.taxClasses?.pageInfo?.hasNextPage ?? false, loading, onFetchMore: () => { loadMore( (prev, next) => { - if (prev.taxClasses.pageInfo.endCursor === next.taxClasses.pageInfo.endCursor) { + if ( + !prev.taxClasses || + !next.taxClasses || + prev.taxClasses.pageInfo.endCursor === next.taxClasses.pageInfo.endCursor + ) { return prev; } diff --git a/src/taxes/utils/utils.ts b/src/taxes/utils/utils.ts index bd4e478969f..8c08aa3a345 100644 --- a/src/taxes/utils/utils.ts +++ b/src/taxes/utils/utils.ts @@ -1,4 +1,3 @@ -// @ts-strict-ignore import { CountryFragment, TaxClassFragment, @@ -29,7 +28,7 @@ export const mapUndefinedTaxRatesToCountries = ( ...config.taxClassCountryRates, ...taxClasses.map(taxClass => ({ taxClass, - rate: undefined, + rate: null, __typename: "TaxClassCountryRate" as const, })), ], @@ -39,16 +38,16 @@ export const mapUndefinedTaxRatesToCountries = ( const parsedCountryRates = taxClassCountryRates.filter(rate => rate.taxClass !== null); parsedCountryRates.unshift( - defaultRate ?? { - rate: undefined, + (defaultRate ?? { + rate: null, taxClass: null, __typename: "TaxClassCountryRate" as const, - }, + }) as any, ); return { ...config, - taxClassCountryRates: parsedCountryRates, + taxClassCountryRates: parsedCountryRates as typeof config.taxClassCountryRates, }; } }) @@ -65,12 +64,12 @@ export const mapUndefinedCountriesToTaxClasses = ( ...taxClass.countries, ...taxConfigurations.map(({ country }) => ({ __typename: "TaxClassCountryRate" as const, - rate: undefined, + rate: null, country, })), ], "country.code", - ), + ) as typeof taxClass.countries, })); export const isLastElement = (arr: any[], index: number): boolean => index === arr.length - 1; diff --git a/src/taxes/views/TaxChannelsList.tsx b/src/taxes/views/TaxChannelsList.tsx index 08fac27743e..6eb643d413f 100644 --- a/src/taxes/views/TaxChannelsList.tsx +++ b/src/taxes/views/TaxChannelsList.tsx @@ -1,4 +1,3 @@ -// @ts-strict-ignore import { useTaxConfigurationsListQuery, useTaxConfigurationUpdateMutation, @@ -38,7 +37,7 @@ const TaxChannelsList = ({ id, params }: TaxChannelsListProps) => { onCompleted: data => { const errors = data?.taxConfigurationUpdate?.errors; - if (errors.length === 0) { + if (errors && errors.length === 0) { notify({ status: "success", text: intl.formatMessage(commonMessages.savedChanges), @@ -50,7 +49,7 @@ const TaxChannelsList = ({ id, params }: TaxChannelsListProps) => { const [openDialog, closeDialog] = createDialogActionHandlers( navigate, params => taxConfigurationListUrl(id, params), - params, + params ?? {}, ); const { data } = useTaxConfigurationsListQuery({ variables: { first: 100 } }); const taxConfigurations = mapEdgesToItems(data?.taxConfigurations); @@ -69,16 +68,16 @@ const TaxChannelsList = ({ id, params }: TaxChannelsListProps) => { return ( handleTabChange(tab as TaxTab)} allCountries={shop?.countries} isDialogOpen={params?.action === "add-country"} - openDialog={openDialog} + openDialog={(action?: string) => openDialog(action as TaxesUrlDialog)} closeDialog={closeDialog} onSubmit={input => taxConfigurationUpdateMutation({ variables: { - id, + id: id ?? "", input, }, }) diff --git a/src/taxes/views/TaxClassesList.tsx b/src/taxes/views/TaxClassesList.tsx index b3052b85b77..a18afc24827 100644 --- a/src/taxes/views/TaxClassesList.tsx +++ b/src/taxes/views/TaxClassesList.tsx @@ -1,4 +1,3 @@ -// @ts-strict-ignore import { TaxClassCreateErrorFragment, TaxClassFragment, @@ -58,7 +57,7 @@ const TaxClassesList = ({ id }: TaxClassesListProps) => { onCompleted: data => { const errors = data?.taxClassDelete?.errors; - if (errors.length === 0) { + if (errors && errors.length === 0) { notify({ status: "success", text: intl.formatMessage(commonMessages.savedChanges), @@ -70,7 +69,7 @@ const TaxClassesList = ({ id }: TaxClassesListProps) => { onCompleted: data => { const errors = data?.taxClassUpdate?.errors; - if (errors.length === 0) { + if (errors && errors.length === 0) { notify({ status: "success", text: intl.formatMessage(commonMessages.savedChanges), @@ -82,7 +81,7 @@ const TaxClassesList = ({ id }: TaxClassesListProps) => { onCompleted: data => { const errors = data?.taxClassCreate?.errors; - if (errors.length === 0) { + if (errors && errors.length === 0) { notify({ status: "success", text: intl.formatMessage(commonMessages.savedChanges), @@ -141,10 +140,10 @@ const TaxClassesList = ({ id }: TaxClassesListProps) => { return undefined; } - const apiTaxClasses = mapEdgesToItems(data?.taxClasses); + const apiTaxClasses = mapEdgesToItems(data?.taxClasses) ?? []; const connectedTaxClasses = isNewTaxClass ? [newTaxClass, ...apiTaxClasses] : apiTaxClasses; const taxClasses = mapUndefinedCountriesToTaxClasses( - countryRatesData.taxCountryConfigurations, + countryRatesData.taxCountryConfigurations ?? [], connectedTaxClasses, ); @@ -167,7 +166,7 @@ const TaxClassesList = ({ id }: TaxClassesListProps) => { }, ); const handleUpdateTaxClass = createMetadataUpdateHandler( - selectedTaxClass, + selectedTaxClass!, updateTaxClass, variables => updateMetadata({ variables }), variables => updatePrivateMetadata({ variables }), @@ -186,8 +185,8 @@ const TaxClassesList = ({ id }: TaxClassesListProps) => { return ( handleTabChange(tab as TaxTab)} + selectedTaxClassId={id ?? ""} savebarState={savebarState} disabled={false} onCreateNewButtonClick={() => { diff --git a/src/taxes/views/TaxCountriesList.tsx b/src/taxes/views/TaxCountriesList.tsx index 573f8bbc3a6..eb465a0c8e0 100644 --- a/src/taxes/views/TaxCountriesList.tsx +++ b/src/taxes/views/TaxCountriesList.tsx @@ -1,4 +1,3 @@ -// @ts-strict-ignore import { CountryCode, TaxCountryConfigurationFragment, @@ -71,7 +70,7 @@ const TaxCountriesList = ({ id, params }: TaxCountriesListProps) => { const [openDialog, closeDialog] = createDialogActionHandlers( navigate, params => taxCountriesListUrl(id, params), - params, + params ?? {}, ); const [newCountry, setNewCountry] = useState(); const { data, refetch, loading: queryInProgress } = useTaxCountriesListQuery(); @@ -79,8 +78,8 @@ const TaxCountriesList = ({ id, params }: TaxCountriesListProps) => { variables: { first: 100 }, }); const taxCountryConfigurations = data?.taxCountryConfigurations; - const taxClasses = mapEdgesToItems(taxClassesData?.taxClasses); - const allCountryTaxes: TaxCountryConfigurationFragment[] = useMemo(() => { + const taxClasses = mapEdgesToItems(taxClassesData?.taxClasses) ?? []; + const allCountryTaxes: TaxCountryConfigurationFragment[] | undefined = useMemo(() => { if (taxClasses && taxCountryConfigurations) { return [ ...(newCountry ? [newCountry] : []), @@ -119,9 +118,9 @@ const TaxCountriesList = ({ id, params }: TaxCountriesListProps) => { <> handleTabChange(tab as TaxTab)} + openDialog={(action?: string) => openDialog(action as TaxesUrlDialog)} onSubmit={async data => { const res = await taxCountryConfigurationUpdateMutation({ variables: { @@ -142,24 +141,24 @@ const TaxCountriesList = ({ id, params }: TaxCountriesListProps) => { {shop?.countries && ( { closeDialog(); const taxClassCountryRates = taxClasses.map(taxClass => ({ __typename: "TaxClassCountryRate" as const, - rate: undefined, + rate: null, taxClass, })); taxClassCountryRates.unshift({ - rate: undefined, - taxClass: null, + rate: null, + taxClass: null as any, __typename: "TaxClassCountryRate" as const, }); setNewCountry({ country: data, - taxClassCountryRates, + taxClassCountryRates: taxClassCountryRates as any, __typename: "TaxCountryConfiguration" as const, }); navigate(taxCountriesListUrl(data.code));