@myriadcodelabs/uiflow 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -5
- package/dist/flow.d.ts +36 -2
- package/dist/flow.d.ts.map +1 -1
- package/dist/flow.js +51 -4
- package/dist/flow.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@ A flow is:
|
|
|
19
19
|
|
|
20
20
|
A step is either:
|
|
21
21
|
- UI step: `input`, `view`, `onOutput`
|
|
22
|
-
- Action step: `input`, `action`, `onOutput`
|
|
22
|
+
- Action step: `input`, `action`, `onOutput` (optional `render` policy)
|
|
23
23
|
|
|
24
24
|
Transition rule:
|
|
25
25
|
- `onOutput` returns next step name (string) to move forward
|
|
@@ -228,6 +228,8 @@ export function FlashcardsScreen({ deckId }: { deckId: string }) {
|
|
|
228
228
|
- Validates `start` exists in `steps`.
|
|
229
229
|
- Supports optional `channelTransitions` mapping (`channelKey -> resolver`).
|
|
230
230
|
- A resolver receives `{ data, currentStep, events, channelKey }` and returns `nextStep | void` (sync/async).
|
|
231
|
+
- Supports optional `createInitialData()` for flow-local default data.
|
|
232
|
+
- Supports optional `normalizeInitialData(data)` to normalize either caller input or flow-created defaults.
|
|
231
233
|
- Returns flow definition consumed by `FlowRunner`.
|
|
232
234
|
|
|
233
235
|
Example:
|
|
@@ -259,10 +261,22 @@ const flow = defineFlow(
|
|
|
259
261
|
|
|
260
262
|
Props:
|
|
261
263
|
- `flow`: flow definition
|
|
262
|
-
- `initialData
|
|
264
|
+
- `initialData?`: optional mutable per-flow data object
|
|
263
265
|
- `eventChannels?`: optional channels map
|
|
264
266
|
- `eventChannelsStrategy?`: `"sticky"` (default) or `"replace"`
|
|
265
267
|
|
|
268
|
+
Initialization behavior:
|
|
269
|
+
- If `initialData` is provided, runner uses it.
|
|
270
|
+
- Else runner uses `flow.createInitialData()` (if provided).
|
|
271
|
+
- If neither exists, runner throws.
|
|
272
|
+
- If `flow.normalizeInitialData` exists, it is applied to whichever data source is used.
|
|
273
|
+
|
|
274
|
+
Action-step render policy:
|
|
275
|
+
- Default: action step renders nothing while running.
|
|
276
|
+
- Per action step, you can override with:
|
|
277
|
+
- `render: { mode: "preserve-previous" }`
|
|
278
|
+
- `render: { mode: "fallback", view: SavingView }`
|
|
279
|
+
|
|
266
280
|
### `createFlowChannel(initial)`
|
|
267
281
|
Creates channel with:
|
|
268
282
|
- `get()`
|
|
@@ -291,9 +305,12 @@ UI steps emit events with:
|
|
|
291
305
|
- `"replace"`: uses the latest incoming channel instances.
|
|
292
306
|
4. Channel emissions trigger re-render for subscribed runners.
|
|
293
307
|
5. If `channelTransitions[channelKey]` exists, channel `emit` runs that resolver and transitions when a valid step is returned.
|
|
294
|
-
6.
|
|
295
|
-
7.
|
|
296
|
-
8. `
|
|
308
|
+
6. Action steps render `null` by default while running.
|
|
309
|
+
7. `render.mode = "preserve-previous"` keeps previous UI step rendered while the action is running.
|
|
310
|
+
8. `render.mode = "fallback"` renders the action step fallback view while the action is running.
|
|
311
|
+
9. Errors in `onOutput`, action steps, or channel transition resolvers are logged (`console.error`) and not rethrown.
|
|
312
|
+
10. Returning unknown step or `void` does not change current step.
|
|
313
|
+
11. `initialData` is shallow-copied at runner initialization.
|
|
297
314
|
|
|
298
315
|
## Pitfalls to avoid
|
|
299
316
|
|
|
@@ -303,6 +320,7 @@ UI steps emit events with:
|
|
|
303
320
|
4. Mixing `view` and `action` in the same step.
|
|
304
321
|
5. Returning transition targets that do not exist.
|
|
305
322
|
6. Using static values in `channelTransitions`; each channel entry must be a resolver function.
|
|
323
|
+
7. Assuming action steps auto-render a loading placeholder without configuring `render`.
|
|
306
324
|
|
|
307
325
|
## Next.js notes
|
|
308
326
|
|
package/dist/flow.d.ts
CHANGED
|
@@ -41,6 +41,20 @@ export interface UiStep<D extends FlowData = FlowData, I = any, O = any> {
|
|
|
41
41
|
}>;
|
|
42
42
|
onOutput: (data: D, output: O, events?: EventChannels) => string | void | Promise<string | void>;
|
|
43
43
|
}
|
|
44
|
+
export type ActionRenderMode = "preserve-previous" | "fallback";
|
|
45
|
+
export interface ActionFallbackViewProps<D extends FlowData = FlowData, I = any> {
|
|
46
|
+
input: I;
|
|
47
|
+
data: D;
|
|
48
|
+
events?: EventChannels;
|
|
49
|
+
step: string;
|
|
50
|
+
busy: boolean;
|
|
51
|
+
}
|
|
52
|
+
export type ActionRenderConfig<D extends FlowData = FlowData, I = any> = {
|
|
53
|
+
mode: "preserve-previous";
|
|
54
|
+
} | {
|
|
55
|
+
mode: "fallback";
|
|
56
|
+
view: React.ComponentType<ActionFallbackViewProps<D, I>>;
|
|
57
|
+
};
|
|
44
58
|
/**
|
|
45
59
|
* Action (logic) step:
|
|
46
60
|
* - Prepares `args` from `data`
|
|
@@ -52,6 +66,13 @@ export interface ActionStep<D extends FlowData = FlowData, I = any, O = any> {
|
|
|
52
66
|
input: (data: D, events?: EventChannels) => I;
|
|
53
67
|
action: (input: I, data: D, events?: EventChannels) => O | Promise<O>;
|
|
54
68
|
onOutput: (data: D, output: O, events?: EventChannels) => string | void | Promise<string | void>;
|
|
69
|
+
/**
|
|
70
|
+
* Optional action-time render behavior.
|
|
71
|
+
* - preserve-previous: keep previous UI step rendered while action runs.
|
|
72
|
+
* - fallback: render the provided fallback view while action runs.
|
|
73
|
+
* If omitted, action step renders nothing by default.
|
|
74
|
+
*/
|
|
75
|
+
render?: ActionRenderConfig<D, I>;
|
|
55
76
|
}
|
|
56
77
|
/**
|
|
57
78
|
* A flow step is either:
|
|
@@ -71,6 +92,8 @@ export interface FlowDefinition<D extends FlowData = FlowData> {
|
|
|
71
92
|
steps: FlowSteps<D>;
|
|
72
93
|
start: string;
|
|
73
94
|
channelTransitions?: Record<string, ChannelTransitionResolver<D>>;
|
|
95
|
+
createInitialData?: () => D;
|
|
96
|
+
normalizeInitialData?: (data: D) => D;
|
|
74
97
|
}
|
|
75
98
|
/**
|
|
76
99
|
* Options when defining a flow.
|
|
@@ -83,6 +106,17 @@ export interface DefineFlowOptions<D extends FlowData = FlowData> {
|
|
|
83
106
|
* that returns target step name (or void to stay).
|
|
84
107
|
*/
|
|
85
108
|
channelTransitions?: Record<string, ChannelTransitionResolver<D>>;
|
|
109
|
+
/**
|
|
110
|
+
* Optional factory for flow-local default data.
|
|
111
|
+
* Use this to keep internal flow flags/state owned by the flow definition.
|
|
112
|
+
*/
|
|
113
|
+
createInitialData?: () => D;
|
|
114
|
+
/**
|
|
115
|
+
* Optional normalizer applied to whichever data source is used:
|
|
116
|
+
* - caller-provided FlowRunner initialData, or
|
|
117
|
+
* - createInitialData() output
|
|
118
|
+
*/
|
|
119
|
+
normalizeInitialData?: (data: D) => D;
|
|
86
120
|
}
|
|
87
121
|
/**
|
|
88
122
|
* Main entry point to define a flow.
|
|
@@ -90,7 +124,7 @@ export interface DefineFlowOptions<D extends FlowData = FlowData> {
|
|
|
90
124
|
export declare function defineFlow<D extends FlowData = FlowData>(steps: FlowSteps<D>, options: DefineFlowOptions<D>): FlowDefinition<D>;
|
|
91
125
|
export interface FlowRunnerProps<D extends FlowData = FlowData> {
|
|
92
126
|
flow: FlowDefinition<D>;
|
|
93
|
-
initialData
|
|
127
|
+
initialData?: D;
|
|
94
128
|
eventChannels?: EventChannels;
|
|
95
129
|
/**
|
|
96
130
|
* How FlowRunner treats incoming eventChannels across parent re-renders.
|
|
@@ -105,5 +139,5 @@ export interface FlowRunnerProps<D extends FlowData = FlowData> {
|
|
|
105
139
|
* - manages transitions
|
|
106
140
|
* - renders UI steps
|
|
107
141
|
*/
|
|
108
|
-
export declare function FlowRunner<D extends FlowData = FlowData>(props: Readonly<FlowRunnerProps<D>>): import("react/jsx-runtime").JSX.Element;
|
|
142
|
+
export declare function FlowRunner<D extends FlowData = FlowData>(props: Readonly<FlowRunnerProps<D>>): import("react/jsx-runtime").JSX.Element | null;
|
|
109
143
|
//# sourceMappingURL=flow.d.ts.map
|
package/dist/flow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../src/flow.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAS3D,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAE9C,MAAM,WAAW,WAAW,CAAC,CAAC;IAE1B,GAAG,EAAE,MAAM,CAAC,CAAC;IAGb,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAGnC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;CACnD;AAID,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AAI7D,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAiB/D;AAMD;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE3C,MAAM,WAAW,wBAAwB,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ;IACnE,IAAI,EAAE,CAAC,CAAC;IACR,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,yBAAyB,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAC/D,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAErF;;;GAGG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACjC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG;IACnE,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,aAAa,KAAK,CAAC,CAAC;IAC9C,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC;IACjE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,aAAa,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACpG;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG;IACvE,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,aAAa,KAAK,CAAC,CAAC;IAC9C,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,aAAa,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACtE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,aAAa,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../src/flow.tsx"],"names":[],"mappings":"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"}
|
package/dist/flow.js
CHANGED
|
@@ -31,6 +31,8 @@ export function defineFlow(steps, options) {
|
|
|
31
31
|
steps,
|
|
32
32
|
start: options.start,
|
|
33
33
|
channelTransitions: options.channelTransitions,
|
|
34
|
+
createInitialData: options.createInitialData,
|
|
35
|
+
normalizeInitialData: options.normalizeInitialData,
|
|
34
36
|
};
|
|
35
37
|
}
|
|
36
38
|
/**
|
|
@@ -72,13 +74,31 @@ export function FlowRunner(props) {
|
|
|
72
74
|
return candidate;
|
|
73
75
|
};
|
|
74
76
|
const resolvedEventChannels = getResolvedChannels();
|
|
77
|
+
const resolveInitialData = () => {
|
|
78
|
+
const provided = initialData;
|
|
79
|
+
let candidate;
|
|
80
|
+
if (provided !== undefined) {
|
|
81
|
+
candidate = provided;
|
|
82
|
+
}
|
|
83
|
+
else if (flow.createInitialData) {
|
|
84
|
+
candidate = flow.createInitialData();
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
throw new Error("FlowRunner: initialData is required unless flow.createInitialData is provided.");
|
|
88
|
+
}
|
|
89
|
+
if (flow.normalizeInitialData) {
|
|
90
|
+
return flow.normalizeInitialData(candidate);
|
|
91
|
+
}
|
|
92
|
+
return candidate;
|
|
93
|
+
};
|
|
75
94
|
// We keep data and currentStep in state so React re-renders on change.
|
|
76
95
|
const [state, setState] = useState({
|
|
77
96
|
currentStep: flow.start,
|
|
78
|
-
data: { ...
|
|
97
|
+
data: { ...resolveInitialData() },
|
|
79
98
|
});
|
|
80
99
|
const [busy, setBusy] = useState(false); // for action steps
|
|
81
100
|
const isMountedRef = useRef(true);
|
|
101
|
+
const previousUiStepRef = useRef(undefined);
|
|
82
102
|
// NEW:
|
|
83
103
|
// This state is never used directly.
|
|
84
104
|
// It only exists to force a re-render when event channels change.
|
|
@@ -147,6 +167,9 @@ export function FlowRunner(props) {
|
|
|
147
167
|
const step = flow.steps[currentStep];
|
|
148
168
|
// If the step is an action (no view), run it in an effect.
|
|
149
169
|
const isActionStep = step.action && !step.view;
|
|
170
|
+
if (!isActionStep && step && step.view) {
|
|
171
|
+
previousUiStepRef.current = currentStep;
|
|
172
|
+
}
|
|
150
173
|
useEffect(() => {
|
|
151
174
|
if (!isActionStep)
|
|
152
175
|
return;
|
|
@@ -179,10 +202,34 @@ export function FlowRunner(props) {
|
|
|
179
202
|
// -----------------------
|
|
180
203
|
// ACTION STEP HANDLING
|
|
181
204
|
// -----------------------
|
|
182
|
-
// If it's an action step, show a simple placeholder or nothing.
|
|
183
205
|
if (isActionStep) {
|
|
184
|
-
|
|
185
|
-
|
|
206
|
+
const actionStep = step;
|
|
207
|
+
const actionRender = actionStep.render;
|
|
208
|
+
if (actionRender?.mode === "preserve-previous") {
|
|
209
|
+
const previousUiStepName = previousUiStepRef.current;
|
|
210
|
+
const previousStep = previousUiStepName
|
|
211
|
+
? flow.steps[previousUiStepName]
|
|
212
|
+
: undefined;
|
|
213
|
+
const isPreviousUiStep = !!previousStep && !!previousStep.view;
|
|
214
|
+
if (isPreviousUiStep) {
|
|
215
|
+
const uiStep = previousStep;
|
|
216
|
+
const ViewComponent = uiStep.view;
|
|
217
|
+
const input = uiStep.input(data, resolvedEventChannels);
|
|
218
|
+
const outputHandle = {
|
|
219
|
+
emit: () => {
|
|
220
|
+
// While action is active, previous view stays visual-only.
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
return _jsx(ViewComponent, { input: input, output: outputHandle });
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (actionRender && actionRender.mode === "fallback") {
|
|
227
|
+
const FallbackView = actionRender.view;
|
|
228
|
+
const input = actionStep.input(data, resolvedEventChannels);
|
|
229
|
+
return (_jsx(FallbackView, { input: input, data: data, events: resolvedEventChannels, step: currentStep, busy: busy }));
|
|
230
|
+
}
|
|
231
|
+
// Default action rendering behavior is intentionally empty.
|
|
232
|
+
return null;
|
|
186
233
|
}
|
|
187
234
|
// -----------------------
|
|
188
235
|
// UI STEP HANDLING
|
package/dist/flow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../src/flow.tsx"],"names":[],"mappings":";AAAA,uDAAuD;AACvD,gDAAgD;AAEhD,eAAe;AACf,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AA0B3D,wCAAwC;AACxC,6EAA6E;AAC7E,MAAM,UAAU,iBAAiB,CAAI,OAAU;IAC3C,IAAI,KAAK,GAAG,OAAO,CAAC;IACpB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IAExC,OAAO;QACH,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK;QAEhB,IAAI,EAAE,CAAC,MAAkB,EAAE,EAAE;YACzB,KAAK,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAE,MAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC/E,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB;QAC5D,CAAC;QAED,SAAS,EAAE,CAAC,QAAoB,EAAE,EAAE;YAChC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;KACJ,CAAC;AACN,CAAC;
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../src/flow.tsx"],"names":[],"mappings":"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"}
|