54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
import type { CreateFlowState } from "../../app/(app)/create/types";
|
|
import type { FinalReviewChipEditPatch } from "../../app/(app)/create/components/FinalReviewChipEditModal";
|
|
import { CUSTOM_RULE_FACET_BY_GROUP } from "./customRuleFacets";
|
|
|
|
/**
|
|
* `groupKey` cases mirror {@link CUSTOM_RULE_FACETS} / `TemplateFacetGroupKey`
|
|
* (Linear CR-92 — keep exhaustiveness when adding a facet row).
|
|
*
|
|
* Translate a {@link FinalReviewChipEditPatch} into the `Partial<CreateFlowState>`
|
|
* patch that {@link CreateFlowState}'s update merger should write back. Each
|
|
* group key targets its own `*DetailsById` (or `coreValueDetailsByChipId`)
|
|
* record; the patch always merges the new value onto the existing record so
|
|
* other chips' overrides are preserved.
|
|
*
|
|
* Exported as a pure function so it's unit-testable without React.
|
|
*/
|
|
export function applyFinalReviewChipEditPatch(
|
|
state: CreateFlowState,
|
|
patch: FinalReviewChipEditPatch,
|
|
): Partial<CreateFlowState> {
|
|
const facet = CUSTOM_RULE_FACET_BY_GROUP.get(patch.groupKey);
|
|
if (!facet) {
|
|
throw new Error(
|
|
`applyFinalReviewChipEditPatch: unknown facet group ${patch.groupKey}`,
|
|
);
|
|
}
|
|
const stateKey = facet.detailOverridesStateKey;
|
|
const current = state[stateKey];
|
|
const record =
|
|
current && typeof current === "object"
|
|
? (current as Record<string, unknown>)
|
|
: {};
|
|
const detailPatch: Partial<CreateFlowState> = {
|
|
[stateKey]: {
|
|
...record,
|
|
[patch.overrideKey]: patch.value,
|
|
},
|
|
};
|
|
if (
|
|
patch.groupKey !== "coreValues" &&
|
|
"customMethodCardFieldBlocks" in patch &&
|
|
patch.customMethodCardFieldBlocks !== undefined
|
|
) {
|
|
return {
|
|
...detailPatch,
|
|
customMethodCardFieldBlocksById: {
|
|
...(state.customMethodCardFieldBlocksById ?? {}),
|
|
[patch.overrideKey]: patch.customMethodCardFieldBlocks,
|
|
},
|
|
};
|
|
}
|
|
return detailPatch;
|
|
}
|