Skip to content

Commit 35b96cd

Browse files
committed
refactor: improve service task handling and error management
- Remove DisplayErrorProvider in favor of toast notifications - Support service task navigation on process next failure - Add generic typing to HttpClientError - Export useGetInstanceDataQuery for wider usage
1 parent 0f8abe4 commit 35b96cd

File tree

6 files changed

+27
-42
lines changed

6 files changed

+27
-42
lines changed

src/core/errorHandling/DisplayErrorProvider.tsx

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/features/instance/InstanceContext.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,12 @@ export function useInstanceDataQueryDef(
126126

127127
function useGetInstanceDataQuery(
128128
hasResultFromInstantiation: boolean,
129-
partyId: string | undefined,
129+
instanceOwnerPartyId: string | undefined,
130130
instanceGuid: string | undefined,
131131
enablePolling: boolean = false,
132132
enabled: boolean = true,
133133
) {
134-
const queryDef = useInstanceDataQueryDef(hasResultFromInstantiation, partyId, instanceGuid);
134+
const queryDef = useInstanceDataQueryDef(hasResultFromInstantiation, instanceOwnerPartyId, instanceGuid);
135135

136136
const utils = useQuery({
137137
...queryDef,

src/features/instance/useProcessNext.tsx

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { toast } from 'react-toastify';
44
import { useMutation, useQueryClient } from '@tanstack/react-query';
55

66
import { ContextNotProvided } from 'src/core/contexts/context';
7-
import { useDisplayError } from 'src/core/errorHandling/DisplayErrorProvider';
87
import { useApplicationMetadata } from 'src/features/applicationMetadata/ApplicationMetadataProvider';
98
import { useHasPendingScans } from 'src/features/attachments/useHasPendingScans';
109
import { invalidateFormDataQueries } from 'src/features/formData/useFormDataQuery';
@@ -18,10 +17,10 @@ import { useOnFormSubmitValidation } from 'src/features/validation/callbacks/onF
1817
import { Validation } from 'src/features/validation/validationContext';
1918
import { TaskKeys, useNavigateToTask } from 'src/hooks/useNavigatePage';
2019
import { doProcessNext } from 'src/queries/queries';
21-
import { ELEMENT_TYPE, type IActionType, type IProcess } from 'src/types/shared';
2220
import { isAtLeastVersion } from 'src/utils/versionCompare';
2321
import type { ApplicationMetadata } from 'src/features/applicationMetadata/types';
2422
import type { BackendValidationIssue } from 'src/features/validation';
23+
import type { IActionType, IProcess, ProblemDetails } from 'src/types/shared';
2524
import type { HttpClientError } from 'src/utils/network/sharedNetworking';
2625

2726
interface ProcessNextProps {
@@ -31,15 +30,14 @@ interface ProcessNextProps {
3130
export function useProcessNext() {
3231
const reFetchInstanceData = useStrictInstanceRefetch();
3332
const language = useCurrentLanguage();
34-
const { refetch: refetchProcessData } = useProcessQuery();
33+
const { data: process, refetch: refetchProcessData } = useProcessQuery();
3534
const navigateToTask = useNavigateToTask();
3635
const instanceId = useLaxInstanceId();
3736
const onFormSubmitValidation = useOnFormSubmitValidation();
3837
const updateInitialValidations = useUpdateInitialValidations();
3938
const setShowAllBackendErrors = Validation.useSetShowAllBackendErrors();
4039
const onSubmitFormValidation = useOnFormSubmitValidation();
4140
const applicationMetadata = useApplicationMetadata();
42-
const displayError = useDisplayError();
4341
const queryClient = useQueryClient();
4442
const hasPendingScans = useHasPendingScans();
4543

@@ -93,17 +91,20 @@ export function useProcessNext() {
9391
}
9492
}
9593
},
96-
onError: async (error: HttpClientError) => {
94+
onError: async (error: HttpClientError<ProblemDetails | undefined>) => {
9795
window.logError('Process next failed:\n', error);
98-
const { data: process } = await refetchProcessData();
99-
const currentTask = process?.currentTask;
100-
const isCurrentTaskServiceTask = currentTask && currentTask.elementType === ELEMENT_TYPE.SERVICE_TASK;
96+
const { data: newProcess } = await refetchProcessData();
97+
const newCurrentTask = newProcess?.currentTask;
10198

102-
if (isCurrentTaskServiceTask) {
103-
navigateToTask(currentTask.elementId);
104-
} else {
105-
displayError(error);
99+
if (newCurrentTask?.elementId && newCurrentTask?.elementId !== process?.currentTask?.elementId) {
100+
await reFetchInstanceData();
101+
navigateToTask(newCurrentTask.elementId);
106102
}
103+
104+
toast(<Lang id={error.response?.data?.detail ?? error.message ?? 'process_error.submit_error_please_retry'} />, {
105+
type: 'error',
106+
autoClose: false,
107+
});
107108
},
108109
});
109110

src/index.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import { KeepAliveProvider } from 'src/core/auth/KeepAliveProvider';
2222
import { AppQueriesProvider } from 'src/core/contexts/AppQueriesProvider';
2323
import { ProcessingProvider } from 'src/core/contexts/processingContext';
2424
import { TaskStoreProvider } from 'src/core/contexts/taskStoreContext';
25-
import { DisplayErrorProvider } from 'src/core/errorHandling/DisplayErrorProvider';
2625
import { ApplicationMetadataProvider } from 'src/features/applicationMetadata/ApplicationMetadataProvider';
2726
import { ApplicationSettingsProvider } from 'src/features/applicationSettings/ApplicationSettingsProvider';
2827
import { UiConfigProvider } from 'src/features/form/layout/UiConfigContext';
@@ -107,11 +106,9 @@ function Root() {
107106
<KeepAliveProvider>
108107
<HelmetProvider>
109108
<TaskStoreProvider>
110-
<DisplayErrorProvider>
111-
<ProcessingProvider>
112-
<App />
113-
</ProcessingProvider>
114-
</DisplayErrorProvider>
109+
<ProcessingProvider>
110+
<App />
111+
</ProcessingProvider>
115112
</TaskStoreProvider>
116113
<ToastContainer
117114
position='top-center'

src/layout/Button/ButtonComponent.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { getComponentFromMode } from 'src/layout/Button/getComponentFromMode';
1212
import { ComponentStructureWrapper } from 'src/layout/ComponentStructureWrapper';
1313
import { alignStyle } from 'src/layout/RepeatingGroup/Container/RepeatingGroupContainer';
1414
import { ProcessTaskType } from 'src/types';
15+
import { ELEMENT_TYPE } from 'src/types/shared';
1516
import { useItemWhenType } from 'src/utils/layout/useNodeItem';
1617
import type { PropsFromGenericComponent } from 'src/layout';
1718
import type { CompInternal } from 'src/layout/layout';
@@ -27,7 +28,9 @@ export const ButtonComponent = ({ baseComponentId, ...componentProps }: PropsFro
2728
const props: IButtonProvidedProps = { baseComponentId, ...componentProps, ...item };
2829

2930
const currentTaskType = useTaskTypeFromBackend();
30-
const { actions, write } = useProcessQuery().data?.currentTask || {};
31+
const { data: process } = useProcessQuery();
32+
const currentTask = process?.currentTask;
33+
const { actions, write, elementType: currentElementType } = currentTask ?? {};
3134
const attachmentState = useAttachmentState();
3235
const { mutate: processNext, isPending: isProcessingNext } = useProcessNext();
3336
const { mutate: processConfirm, isPending: isConfirming } = useProcessConfirm();
@@ -52,8 +55,10 @@ export const ButtonComponent = ({ baseComponentId, ...componentProps }: PropsFro
5255
}
5356

5457
function submitTask() {
58+
const isServiceTask = currentElementType === ELEMENT_TYPE.SERVICE_TASK;
59+
5560
setReturnToView?.(undefined);
56-
if (currentTaskType === ProcessTaskType.Data) {
61+
if (currentTaskType === ProcessTaskType.Data || isServiceTask) {
5762
processNext();
5863
} else if (currentTaskType === ProcessTaskType.Confirm) {
5964
processConfirm();

src/utils/network/sharedNetworking.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import axios from 'axios';
22
import type { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';
33

4-
export type HttpClientError = AxiosError;
4+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
5+
export type HttpClientError<T = unknown, D = any> = AxiosError<T, D>;
56

67
export async function httpGet<T>(url: string, options?: AxiosRequestConfig): Promise<T> {
78
const response: AxiosResponse = await axios.get(url, {

0 commit comments

Comments
 (0)