Skip to content

Commit acd1e22

Browse files
committed
feat: reworked final submission & added step resolution for edit & revision
1 parent 4b8d1a2 commit acd1e22

File tree

17 files changed

+224
-427
lines changed

17 files changed

+224
-427
lines changed

apps/kyb-app/src/components/layouts/AppShell/Navigation.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export const Navigation = () => {
2525
) + 1;
2626

2727
const isFirstStep = currentPageNumber === 1;
28-
const isDisabled = uiState.isFinalSubmitted || uiState.isSyncing;
28+
const isDisabled = uiState.isSyncing;
2929

3030
const onPrevious = useCallback(async () => {
3131
if (!isFirstStep) {

apps/kyb-app/src/components/organisms/DynamicUI/StateManager/StateManager.tsx

Lines changed: 93 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,36 @@ import {
66
StateManagerContext,
77
StateManagerProps,
88
} from '@/components/organisms/DynamicUI/StateManager/types';
9-
import { useMemo } from 'react';
9+
import { WorkflowBrowserSDK } from '@ballerine/workflow-browser-sdk';
10+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
11+
12+
const initializeStateMachine = ({
13+
workflowId,
14+
definition,
15+
definitionType,
16+
extensions,
17+
additionalContext,
18+
initialContext,
19+
initialState,
20+
}: Omit<StateManagerProps, 'children'> & { initialState: string }) => {
21+
const initialMachineState = {
22+
...initialContext,
23+
state: initialState,
24+
};
25+
26+
const machine = createStateMachine(
27+
workflowId,
28+
definition,
29+
definitionType,
30+
extensions,
31+
initialMachineState,
32+
additionalContext,
33+
);
34+
35+
machine.overrideContext(initialMachineState);
36+
37+
return machine;
38+
};
1039

1140
export const StateManager = ({
1241
definition,
@@ -18,27 +47,75 @@ export const StateManager = ({
1847
config,
1948
additionalContext,
2049
}: StateManagerProps) => {
21-
const machine = useMemo(() => {
22-
const initialMachineState = {
23-
...initialContext,
24-
state: initialContext?.collectionFlow?.state?.currentStep,
25-
};
26-
27-
const machine = createStateMachine(
50+
const [stateMachine, setStateMachine] = useState<WorkflowBrowserSDK>(() =>
51+
initializeStateMachine({
2852
workflowId,
2953
definition,
3054
definitionType,
3155
extensions,
32-
initialMachineState,
3356
additionalContext,
34-
);
57+
initialContext,
58+
initialState: initialContext?.collectionFlow?.state?.currentStep!,
59+
}),
60+
);
61+
62+
const prevAdditionalContextRef = useRef(additionalContext);
63+
64+
useEffect(() => {
65+
if (prevAdditionalContextRef.current !== additionalContext) {
66+
setStateMachine(prev =>
67+
initializeStateMachine({
68+
workflowId,
69+
definition,
70+
definitionType,
71+
extensions,
72+
additionalContext,
73+
initialContext: prev.getSnapshot().context,
74+
initialState: prev.getSnapshot().value,
75+
}),
76+
);
77+
78+
prevAdditionalContextRef.current = additionalContext;
79+
}
80+
}, [
81+
prevAdditionalContextRef,
82+
additionalContext,
83+
stateMachine,
84+
workflowId,
85+
definition,
86+
definitionType,
87+
extensions,
88+
initialContext,
89+
]);
3590

36-
machine.overrideContext(initialMachineState);
91+
const reinitializeStateMachineWithNewState = useCallback(
92+
(newState: string) => {
93+
setStateMachine(prev => {
94+
const prevContext = prev.getSnapshot().context;
3795

38-
return machine;
39-
}, [additionalContext]);
96+
return initializeStateMachine({
97+
workflowId,
98+
definition,
99+
definitionType,
100+
extensions,
101+
additionalContext,
102+
initialContext: prevContext,
103+
initialState: newState,
104+
});
105+
});
106+
},
107+
[
108+
additionalContext,
109+
stateMachine,
110+
workflowId,
111+
definition,
112+
definitionType,
113+
extensions,
114+
initialContext,
115+
],
116+
);
40117

41-
const { machineApi } = useMachineLogic(machine, additionalContext);
118+
const { machineApi } = useMachineLogic(stateMachine, additionalContext);
42119
const {
43120
contextPayload,
44121
isPluginLoading,
@@ -61,6 +138,7 @@ export const StateManager = ({
61138
setContext,
62139
getContext,
63140
getState,
141+
setCollectionFlowState: reinitializeStateMachineWithNewState,
64142
},
65143
state,
66144
payload: contextPayload,
@@ -79,6 +157,7 @@ export const StateManager = ({
79157
invokePlugin,
80158
setContext,
81159
getContext,
160+
reinitializeStateMachineWithNewState,
82161
]);
83162

84163
const child = useMemo(

apps/kyb-app/src/components/organisms/DynamicUI/StateManager/hooks/useStateLogic/useStateLogic.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ export const useStateLogic = (machineApi: StateMachineAPI, initialContext = {})
2121
const contextRef = useRef<State>(contextPayload);
2222
const { helpers } = useDynamicUIContext();
2323

24+
useEffect(() => {
25+
setState(prev => ({
26+
...prev,
27+
machineState: machineApi.getState(),
28+
payload: machineApi.getContext() as CollectionFlowContext,
29+
}));
30+
console.log('new state', machineApi.getState());
31+
}, [machineApi]);
32+
2433
useEffect(() => {
2534
const ctx = machineApi.getContext();
2635

apps/kyb-app/src/components/organisms/DynamicUI/StateManager/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import { MachineConfig } from 'xstate';
1010
export type State = MachineConfig<AnyObject, AnyObject, any>;
1111

1212
export interface StateManagerContext {
13-
stateApi: StateMachineAPI;
13+
stateApi: StateMachineAPI & {
14+
setCollectionFlowState: (state: string) => void;
15+
};
1416
state: string;
1517
payload: CollectionFlowContext;
1618
config?: CollectionFlowConfig;

apps/kyb-app/src/components/organisms/DynamicUI/hooks/useUIStateLogic/types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,5 @@ import { UIElementsState } from '@/components/organisms/DynamicUI/hooks/useUISta
33
export interface UIState {
44
isLoading: boolean;
55
isRevision?: boolean;
6-
isFinalSubmitted?: boolean;
76
elements: UIElementsState;
87
}

0 commit comments

Comments
 (0)