From 2916ab3c4007d490cac68e5083699f0dc8d52cbe Mon Sep 17 00:00:00 2001 From: Thomas Heartman Date: Mon, 21 Jul 2025 11:38:02 +0200 Subject: [PATCH] Propagate change request constraint id mapper --- .../useChangeRequest/useChangeRequest.ts | 38 +++++-------------- .../usePendingChangeRequests.ts | 30 ++++++++++++++- .../utils/addConstraintIdsToFeatureChange.ts | 31 +++++++++++++++ 3 files changed, 68 insertions(+), 31 deletions(-) create mode 100644 frontend/src/utils/addConstraintIdsToFeatureChange.ts diff --git a/frontend/src/hooks/api/getters/useChangeRequest/useChangeRequest.ts b/frontend/src/hooks/api/getters/useChangeRequest/useChangeRequest.ts index 4434f3372f..eafd015db6 100644 --- a/frontend/src/hooks/api/getters/useChangeRequest/useChangeRequest.ts +++ b/frontend/src/hooks/api/getters/useChangeRequest/useChangeRequest.ts @@ -3,38 +3,11 @@ import { formatApiPath } from 'utils/formatPath'; import handleErrorResponses from '../httpErrorResponseHandler.js'; import type { ChangeRequestType, - IChangeRequestAddStrategy, IChangeRequestFeature, - IChangeRequestUpdateStrategy, IFeatureChange, } from 'component/changeRequest/changeRequest.types'; import { useMemo } from 'react'; -import { constraintId } from 'constants/constraintId.js'; -import { v4 as uuidv4 } from 'uuid'; - -const isAddStrategyChange = ( - change: IFeatureChange, -): change is IChangeRequestAddStrategy => change.action === 'addStrategy'; -const isUpdateStrategyChange = ( - change: IFeatureChange, -): change is IChangeRequestUpdateStrategy => change.action === 'updateStrategy'; - -const addConstraintIdsToFeatureChange = (change: IFeatureChange) => { - if (isAddStrategyChange(change) || isUpdateStrategyChange(change)) { - const { constraints, ...rest } = change.payload; - return { - ...change, - payload: { - ...rest, - constraints: constraints.map((constraint) => ({ - ...constraint, - [constraintId]: uuidv4(), - })), - }, - } as IFeatureChange; - } - return change; -}; +import { addConstraintIdsToFeatureChange } from 'utils/addConstraintIdsToFeatureChange.js'; export const useChangeRequest = (projectId: string, id: string) => { const { data, error, mutate } = useSWR( @@ -60,8 +33,15 @@ export const useChangeRequest = (projectId: string, id: string) => { ); }, [JSON.stringify(features)]); + const mappedData = data + ? { + ...dataProps, + features: featuresWithConstraintIds, + } + : data; + return { - data: { ...dataProps, features: featuresWithConstraintIds }, + data: mappedData, loading: !error && !data, refetchChangeRequest: () => mutate(), error, diff --git a/frontend/src/hooks/api/getters/usePendingChangeRequests/usePendingChangeRequests.ts b/frontend/src/hooks/api/getters/usePendingChangeRequests/usePendingChangeRequests.ts index 0c8334993a..40c98de2bd 100644 --- a/frontend/src/hooks/api/getters/usePendingChangeRequests/usePendingChangeRequests.ts +++ b/frontend/src/hooks/api/getters/usePendingChangeRequests/usePendingChangeRequests.ts @@ -1,7 +1,12 @@ import { formatApiPath } from 'utils/formatPath'; import handleErrorResponses from '../httpErrorResponseHandler.js'; -import type { ChangeRequestType } from 'component/changeRequest/changeRequest.types'; +import type { + ChangeRequestType, + IFeatureChange, +} from 'component/changeRequest/changeRequest.types'; import { useEnterpriseSWR } from '../useEnterpriseSWR/useEnterpriseSWR.js'; +import { useMemo } from 'react'; +import { addConstraintIdsToFeatureChange } from 'utils/addConstraintIdsToFeatureChange.js'; const fetcher = (path: string) => { return fetch(path) @@ -16,8 +21,29 @@ export const usePendingChangeRequests = (project: string) => { fetcher, ); + const mappedData: typeof data = useMemo( + () => + data?.map((changeRequest) => { + const { features, ...rest } = changeRequest || {}; + const featuresWithConstraintIds = + features?.map((feature) => { + const changes: IFeatureChange[] = feature.changes.map( + addConstraintIdsToFeatureChange, + ); + + return { + ...feature, + changes, + }; + }) ?? []; + + return { ...rest, features: featuresWithConstraintIds }; + }), + [JSON.stringify(data)], + ); + return { - data, + mappedData, loading: !error && !data, refetch: mutate, error, diff --git a/frontend/src/utils/addConstraintIdsToFeatureChange.ts b/frontend/src/utils/addConstraintIdsToFeatureChange.ts new file mode 100644 index 0000000000..6e398b754a --- /dev/null +++ b/frontend/src/utils/addConstraintIdsToFeatureChange.ts @@ -0,0 +1,31 @@ +import type { + IFeatureChange, + IChangeRequestAddStrategy, + IChangeRequestUpdateStrategy, +} from 'component/changeRequest/changeRequest.types'; +import { constraintId } from 'constants/constraintId'; +import { v4 as uuidv4 } from 'uuid'; + +const isAddStrategyChange = ( + change: IFeatureChange, +): change is IChangeRequestAddStrategy => change.action === 'addStrategy'; +const isUpdateStrategyChange = ( + change: IFeatureChange, +): change is IChangeRequestUpdateStrategy => change.action === 'updateStrategy'; + +export const addConstraintIdsToFeatureChange = (change: IFeatureChange) => { + if (isAddStrategyChange(change) || isUpdateStrategyChange(change)) { + const { constraints, ...rest } = change.payload; + return { + ...change, + payload: { + ...rest, + constraints: constraints.map((constraint) => ({ + ...constraint, + [constraintId]: uuidv4(), + })), + }, + } as IFeatureChange; + } + return change; +};