Merged PR 2252: refactor(representations): extract journey step-resolution helpers (Slice R3,...

refactor(representations): extract journey step-resolution helpers (Slice R3, behaviour-preserving)

Related work items: #22441
This commit is contained in:
Robert Bond
2026-04-17 06:45:21 +00:00
parent a43eb76e3a
commit d05e54c020
3 changed files with 140 additions and 36 deletions
+41 -34
View File
@@ -33,6 +33,12 @@ import RepLPACapacitySelection from "./representationLPACapacitySelection";
import RepLandOwner from "./representationLandowner";
import RepresentationProgress_enforcement from "./representationProgress/representationProgress_enforcement";
import RepresentationProgress_s78 from "./representationProgress/representationProgress_s78";
import {
getQuestionnaireNextSection,
resolveJourneyStageFlags,
resolveRepresentationControlKey,
resolveSubmitTransition
} from "./utils/stepResolution";
let MakeRepresentation = (props) => {
let { t } = useTranslation();
@@ -105,6 +111,11 @@ let MakeRepresentation = (props) => {
: false;
const isNRW = currentView.caseReference?.isNRW;
const { showCheckStage } = resolveJourneyStageFlags({
"representationSubmit": currentView.representationSubmit,
"representationSubmitConfirmation":
currentView.representationSubmitConfirmation
});
const setRepFileName = (values) => {
if (
@@ -586,19 +597,16 @@ let MakeRepresentation = (props) => {
setCurrentReference
};
const getNormalizedCapacity = () => {
const rawCapacity =
currentView.representationCapacity ||
currentView.caseReference?.repDetails?.representationCapacity ||
"false";
return rawCapacity.toLowerCase();
};
const { controlKey } = resolveRepresentationControlKey({
"isLPA": isLPA,
"representationCapacity": currentView.representationCapacity,
"repDetailsCapacity":
currentView.caseReference?.repDetails?.representationCapacity,
"appealType": appealType,
"normalizeCapacity": normalizeCapacity
});
if (
isLPA &&
(!currentView.representationCapacity ||
currentView.representationCapacity === "")
) {
if (controlKey === "lpa-capacity-selection") {
return (
<RepLPACapacitySelection
{...commonProps}
@@ -616,10 +624,8 @@ let MakeRepresentation = (props) => {
);
}
const capacity = normalizeCapacity(getNormalizedCapacity());
switch (capacity) {
case "appellant": {
switch (controlKey) {
case "capacity-appellant": {
const Component =
appealType === 846040002
? ConsultationAppellant
@@ -634,7 +640,7 @@ let MakeRepresentation = (props) => {
);
}
case "lpa": {
case "capacity-lpa": {
return (
<RepLPA
{...commonProps}
@@ -650,7 +656,7 @@ let MakeRepresentation = (props) => {
);
}
case "agent": {
case "capacity-agent": {
const Component =
appealType === 846040002 ? ConsultationAgent : RepAgent;
return (
@@ -663,7 +669,7 @@ let MakeRepresentation = (props) => {
);
}
case "interestedparty": {
case "capacity-interestedparty": {
const Component =
appealType === 846040002
? ConsultationInterestedPartyPerson
@@ -678,7 +684,7 @@ let MakeRepresentation = (props) => {
);
}
case "landowner": {
case "capacity-landowner": {
return (
<RepLandOwner
{...commonProps}
@@ -1078,19 +1084,20 @@ let MakeRepresentation = (props) => {
: normalizeCapacity(values.representationCapacity);
setRepresentationCapacity(capacity);
} else {
if (repType === "Questionnaire") {
if (
questionnaireCount !== 0 &&
showQuestionnaireSection < questionnaireCount
) {
setShowQuestionnaireSection(
showQuestionnaireSection + 1
);
updateRepresentation(values, false, false);
} else {
updateRepresentation(values, false, false);
setRepresentationSubmit(true);
}
const submitTransition = resolveSubmitTransition({
"representationType": repType,
"showQuestionnaireSection": showQuestionnaireSection,
"questionnaireCount": questionnaireCount
});
if (submitTransition === "advanceQuestionnaire") {
setShowQuestionnaireSection(
getQuestionnaireNextSection(
showQuestionnaireSection,
questionnaireCount
)
);
updateRepresentation(values, false, false);
} else {
updateRepresentation(values, false, false);
setRepresentationSubmit(true);
@@ -1252,7 +1259,7 @@ let MakeRepresentation = (props) => {
return (
<div>
<form onSubmit={handleSubmit(onHandleSubmit)}>
{currentView.representationSubmit ? (
{showCheckStage ? (
<RepCompleteSubmit
formObj={formObj}
capacityOptionsArr={capacityOptionsArr}
@@ -0,0 +1,73 @@
export const resolveJourneyStageFlags = ({
representationSubmit,
representationSubmitConfirmation
}) => {
const showCheckStage =
representationSubmit === true || representationSubmit === "true";
const showCompletionStage =
representationSubmitConfirmation === true ||
representationSubmitConfirmation === "true";
return {
showFormStage: !showCheckStage,
showCheckStage,
showCompletionStage
};
};
export const resolveRepresentationControlKey = ({
isLPA,
representationCapacity,
repDetailsCapacity,
appealType,
normalizeCapacity
}) => {
if (isLPA && (!representationCapacity || representationCapacity === "")) {
return {
controlKey: "lpa-capacity-selection",
normalizedCapacity: ""
};
}
const rawCapacity = representationCapacity || repDetailsCapacity || "false";
const normalizedCapacity = normalizeCapacity(rawCapacity.toLowerCase());
return {
controlKey: `capacity-${normalizedCapacity}`,
normalizedCapacity
};
};
export const resolveSubmitTransition = ({
representationType,
showQuestionnaireSection,
questionnaireCount
}) => {
if (representationType !== "Questionnaire") {
return "goToCheck";
}
if (
questionnaireCount !== 0 &&
showQuestionnaireSection < questionnaireCount
) {
return "advanceQuestionnaire";
}
return "goToCheck";
};
export const getQuestionnaireNextSection = (
currentSection,
questionnaireCount
) => {
if (questionnaireCount !== 0 && currentSection < questionnaireCount) {
return currentSection + 1;
}
return currentSection;
};
export const getQuestionnairePreviousSection = (currentSection) => {
return currentSection > 1 ? currentSection - 1 : currentSection;
};
+26 -2
View File
@@ -6,8 +6,8 @@ Base branch: `refactor`
## Status
Current slice: Slice R2Representation Page Loader Separation
Status: COMPLETE
Current slice: Slice R3Journey Step Resolution Extraction
Status: IMPLEMENTED (manual validation pending)
---
@@ -94,6 +94,30 @@ Isolate step navigation logic.
- next/previous step logic
- validation gating between steps
**Completion notes (this slice):**
- Added pure step-resolution helpers in `components/case/representation/utils/stepResolution.js`:
- `resolveJourneyStageFlags({ representationSubmit, representationSubmitConfirmation })`
- `resolveRepresentationControlKey({ isLPA, representationCapacity, repDetailsCapacity, appealType, normalizeCapacity })`
- `resolveSubmitTransition({ representationType, showQuestionnaireSection, questionnaireCount })`
- `getQuestionnaireNextSection(currentSection, questionnaireCount)`
- `getQuestionnairePreviousSection(currentSection)`
- Updated `components/case/representation/index.js` to call helpers for:
- check-stage flag resolution (`showCheckStage`)
- control key resolution in `whichControl()`
- questionnaire/non-questionnaire submit transition decision
- questionnaire next-section increment calculation
- Preserved behaviour-critical constraints:
- no JSX structure redesign
- no route/query changes
- no payload/Redux shape changes
- no dispatch/API side-effect sequencing changes
- no representation-type availability logic changes (`buildRepsArr` unchanged)
- Validation evidence:
- `npm run lint` completed (warnings only, no new errors).
- `npm run test:reps` re-run completed: **6 passed**.
- Manual APP/IP/Agent/LPA and EN/CY checks: **pending for this slice**.
---
### Slice R4 — Flow Shell Decomposition