@daltonr/pathwrite-react-native 0.9.0 → 0.10.1

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 CHANGED
@@ -1,8 +1,6 @@
1
1
  # @daltonr/pathwrite-react-native
2
2
 
3
- React Native adapter for `@daltonr/pathwrite-core`. Exposes path state as reactive React state via `useSyncExternalStore`, with stable action callbacks, an optional context provider, and an optional `PathShell` default UI built from React Native primitives.
4
-
5
- Works with Expo (managed and bare workflow) and bare React Native projects. Targets iOS and Android.
3
+ React Native adapter for Pathwrite exposes path engine state via `useSyncExternalStore` with stable callbacks, an optional context provider, and an optional `PathShell` default UI built from React Native primitives.
6
4
 
7
5
  ## Installation
8
6
 
@@ -10,293 +8,191 @@ Works with Expo (managed and bare workflow) and bare React Native projects. Targ
10
8
  npm install @daltonr/pathwrite-core @daltonr/pathwrite-react-native
11
9
  ```
12
10
 
13
- Peer dependencies: `react >= 18.0.0`, `react-native >= 0.72.0`.
14
-
15
- ## Exports
16
-
17
- ```typescript
18
- import {
19
- PathShell, // React Native UI shell
20
- usePath, // Hook — creates a scoped engine
21
- usePathContext, // Hook — reads the nearest PathProvider
22
- PathProvider, // Context provider
23
- // Core types re-exported for convenience:
24
- PathEngine,
25
- PathData,
26
- PathDefinition,
27
- PathEvent,
28
- PathSnapshot,
29
- PathStep,
30
- PathStepContext,
31
- StepChoice,
32
- SerializedPathState,
33
- } from "@daltonr/pathwrite-react-native";
34
- ```
11
+ Peer dependencies: `react-native >= 0.73.0`, `react >= 18.0.0`
35
12
 
36
13
  ---
37
14
 
38
- ## Quick Start — PathShell
39
-
40
- The fastest way to get started. `PathShell` manages the engine lifecycle, renders the active step, and provides navigation buttons. The default header shows numbered step dots (✓ when completed), the current step title, and a progress bar.
15
+ ## Quick start
41
16
 
42
17
  ```tsx
43
- import { PathShell } from "@daltonr/pathwrite-react-native";
44
- import { myPath, INITIAL_DATA } from "./my-path";
45
- import { DetailsStep } from "./DetailsStep";
46
- import { ReviewStep } from "./ReviewStep";
18
+ import { PathShell, usePathContext } from "@daltonr/pathwrite-react-native";
19
+ import type { PathDefinition, PathData } from "@daltonr/pathwrite-core";
20
+ import { View, Text, TextInput, TouchableOpacity } from "react-native";
47
21
 
48
- export function MyFlow() {
49
- return (
50
- <PathShell
51
- path={myPath}
52
- initialData={INITIAL_DATA}
53
- onComplete={(data) => console.log("Done!", data)}
54
- steps={{
55
- details: <DetailsStep />,
56
- review: <ReviewStep />,
57
- }}
58
- />
59
- );
22
+ interface SignupData extends PathData {
23
+ name: string;
60
24
  }
61
- ```
62
25
 
63
- Inside step components, use `usePathContext()` to read state and dispatch actions:
64
-
65
- ```tsx
66
- import { usePathContext } from "@daltonr/pathwrite-react-native";
67
- import type { MyData } from "./my-path";
68
-
69
- export function DetailsStep() {
70
- const { snapshot, setData } = usePathContext<MyData>();
71
- const name = snapshot?.data.name ?? "";
26
+ const signupPath: PathDefinition<SignupData> = {
27
+ id: "signup",
28
+ steps: [
29
+ { id: "details", title: "Your Details", canMoveNext: ({ data }) => data.name.trim().length >= 2 },
30
+ { id: "review", title: "Review" },
31
+ ],
32
+ };
72
33
 
34
+ function DetailsStep() {
35
+ const { snapshot, setData } = usePathContext<SignupData>();
36
+ if (!snapshot) return null;
73
37
  return (
74
38
  <TextInput
75
- value={name}
39
+ value={snapshot.data.name}
76
40
  onChangeText={(text) => setData("name", text)}
77
41
  placeholder="Your name"
78
42
  />
79
43
  );
80
44
  }
81
- ```
82
-
83
- ---
84
-
85
- ## Option A — `usePath` hook (component-scoped)
86
-
87
- Each call creates an isolated engine. Good when a single screen owns the path.
88
-
89
- ```tsx
90
- import { usePath } from "@daltonr/pathwrite-react-native";
91
- import { myPath } from "./my-path";
92
-
93
- function MyScreen() {
94
- const { snapshot, start, next, previous, setData } = usePath({
95
- onEvent(event) {
96
- if (event.type === "completed") console.log("Done!", event.data);
97
- }
98
- });
99
-
100
- useEffect(() => {
101
- start(myPath, { name: "" });
102
- }, []);
103
45
 
46
+ function ReviewStep() {
47
+ const { snapshot } = usePathContext<SignupData>();
104
48
  if (!snapshot) return null;
105
-
106
- return (
107
- <View>
108
- <Text>{snapshot.stepTitle ?? snapshot.stepId}</Text>
109
- <Text>Step {snapshot.stepIndex + 1} of {snapshot.stepCount}</Text>
110
- <Pressable onPress={previous} disabled={snapshot.isNavigating}>
111
- <Text>Back</Text>
112
- </Pressable>
113
- <Pressable onPress={next} disabled={snapshot.isNavigating || !snapshot.canMoveNext}>
114
- <Text>{snapshot.isLastStep ? "Complete" : "Next"}</Text>
115
- </Pressable>
116
- </View>
117
- );
49
+ return <Text>Signing up as {snapshot.data.name}</Text>;
118
50
  }
119
- ```
120
-
121
- ## Option B — `PathProvider` + `usePathContext` (tree-scoped)
122
-
123
- Share one engine across a component tree — step components read state without prop-drilling.
124
51
 
125
- ```tsx
126
- import { PathProvider } from "@daltonr/pathwrite-react-native";
127
-
128
- // Root — start the path once, then render children
129
- function WizardRoot() {
130
- const { snapshot, start, next } = usePathContext();
131
- useEffect(() => { start(myPath, {}); }, []);
132
- return (
133
- <View>
134
- {snapshot && <Text>Step {snapshot.stepIndex + 1}</Text>}
135
- <Pressable onPress={next}><Text>Next</Text></Pressable>
136
- </View>
137
- );
138
- }
139
-
140
- // Wrap in the provider at the navigation/screen level
141
- export function WizardScreen() {
52
+ export function SignupFlow() {
142
53
  return (
143
- <PathProvider>
144
- <WizardRoot />
145
- </PathProvider>
54
+ <PathShell
55
+ path={signupPath}
56
+ initialData={{ name: "" }}
57
+ onComplete={(data) => console.log("Done!", data)}
58
+ steps={{ details: <DetailsStep />, review: <ReviewStep /> }}
59
+ />
146
60
  );
147
61
  }
148
62
  ```
149
63
 
150
- ---
151
-
152
- ## Path definition
153
-
154
- Path definitions are plain objects — no classes, no decorators, framework-agnostic.
155
-
156
- ```typescript
157
- import type { PathDefinition } from "@daltonr/pathwrite-react-native";
158
-
159
- interface MyData {
160
- name: string;
161
- agreed: boolean;
162
- }
163
-
164
- export const myPath: PathDefinition<MyData> = {
165
- id: "onboarding",
166
- steps: [
167
- {
168
- id: "name",
169
- title: "Your Name",
170
- canMoveNext: ({ data }) => data.name.trim().length >= 2,
171
- },
172
- {
173
- id: "terms",
174
- title: "Terms",
175
- canMoveNext: ({ data }) => data.agreed,
176
- },
177
- {
178
- id: "done",
179
- title: "All Done",
180
- },
181
- ],
182
- };
183
- ```
64
+ Step components call `usePathContext()` to access engine state — no prop drilling needed. `<PathShell>` provides the context automatically.
184
65
 
185
66
  ---
186
67
 
187
- ## Conditional steps — `shouldSkip`
68
+ ## Metro config
188
69
 
189
- Steps with a `shouldSkip` guard are removed from the flow when the guard returns `true`. The progress indicator updates automatically.
70
+ Metro does not follow symlinks by default, so workspace packages installed above the app root are invisible to the bundler. This is the most common setup issue when using Pathwrite in a monorepo. Create or update `metro.config.js` in your React Native or Expo app:
190
71
 
191
- ```typescript
192
- {
193
- id: "address-details",
194
- shouldSkip: ({ data }) => data.deliveryMethod !== "postal",
195
- }
196
- ```
72
+ ```js
73
+ // metro.config.js
74
+ const { getDefaultConfig } = require("expo/metro-config");
75
+ // For bare React Native: const { getDefaultConfig } = require("@react-native/metro-config");
76
+ const path = require("path");
197
77
 
198
- ---
78
+ const projectRoot = __dirname;
79
+ const workspaceRoot = path.resolve(projectRoot, "../../.."); // adjust depth to your repo
199
80
 
200
- ## Conditional forms — `StepChoice`
81
+ const config = getDefaultConfig(projectRoot);
201
82
 
202
- A `StepChoice` step selects one inner step at runtime based on current data. Useful for showing different form variants without branching the path definition.
83
+ // 1. Watch workspace source files outside the app root.
84
+ config.watchFolders = [workspaceRoot];
203
85
 
204
- ```typescript
205
- {
206
- id: "address",
207
- select: ({ data }) => data.country === "US" ? "address-us" : "address-ie",
208
- steps: [
209
- { id: "address-us", title: "US Address" },
210
- { id: "address-ie", title: "Irish Address" },
211
- ],
212
- }
213
- ```
86
+ // 2. Map package names directly to their source directories.
87
+ config.resolver.extraNodeModules = {
88
+ "@daltonr/pathwrite-core": path.resolve(workspaceRoot, "packages/core"),
89
+ "@daltonr/pathwrite-react-native": path.resolve(workspaceRoot, "packages/react-native-adapter"),
90
+ // Add any other workspace packages your app imports here.
91
+ };
214
92
 
215
- The snapshot exposes both `stepId` (the outer choice id, `"address"`) and `formId` (the selected inner step, `"address-us"`). When using `PathShell`, pass both inner step IDs as keys in the `steps` map — the shell resolves the correct one automatically:
93
+ // 3. Restrict node_modules lookup to the app's own folder.
94
+ config.resolver.nodeModulesPaths = [
95
+ path.resolve(projectRoot, "node_modules"),
96
+ ];
97
+
98
+ // 4. Pin react/react-native/scheduler to the app's own copies.
99
+ config.resolver.resolveRequest = (context, moduleName, platform) => {
100
+ if (
101
+ moduleName === "react" || moduleName.startsWith("react/") ||
102
+ moduleName === "react-native" || moduleName.startsWith("react-native/") ||
103
+ moduleName === "scheduler" || moduleName.startsWith("scheduler/")
104
+ ) {
105
+ try {
106
+ return { filePath: require.resolve(moduleName, { paths: [projectRoot] }), type: "sourceFile" };
107
+ } catch { /* fall through */ }
108
+ }
109
+ return context.resolveRequest(context, moduleName, platform);
110
+ };
216
111
 
217
- ```tsx
218
- <PathShell
219
- path={myPath}
220
- steps={{
221
- name: <NameStep />,
222
- "address-us": <USAddressStep />,
223
- "address-ie": <IrishAddressStep />,
224
- done: <DoneStep />,
225
- }}
226
- />
112
+ module.exports = config;
227
113
  ```
228
114
 
229
- ---
115
+ Every new workspace package your app imports must be added to `extraNodeModules`. After changing this file, restart Metro with `npx expo start --clear` (or `npx react-native start --reset-cache` for bare RN).
230
116
 
231
- ## Sub-paths
232
-
233
- Push a sub-path onto the stack from within a step. The parent path resumes from the same step when the sub-path completes.
117
+ ---
234
118
 
235
- ```typescript
236
- const { startSubPath } = usePathContext();
119
+ ## usePath / PathShell
237
120
 
238
- function handleStartSubWizard() {
239
- startSubPath(subWizardPath, {});
240
- }
241
- ```
121
+ The API is identical to `@daltonr/pathwrite-react`. `usePath` creates an engine instance scoped to the calling component; `usePathContext` reads the nearest `PathShell` or `PathProvider` ancestor.
242
122
 
243
- ---
123
+ ### usePath return value
244
124
 
245
- ## PathShell props
125
+ | Field | Type | Description |
126
+ |---|---|---|
127
+ | `snapshot` | `PathSnapshot \| null` | Current state. `null` when no path is active. |
128
+ | `start(definition, data?)` | function | Start a path. |
129
+ | `next()` | function | Advance one step. Completes on the last step. |
130
+ | `previous()` | function | Go back one step. |
131
+ | `cancel()` | function | Cancel the active path or sub-path. |
132
+ | `goToStep(stepId)` | function | Jump to a step by ID, bypassing guards. |
133
+ | `goToStepChecked(stepId)` | function | Jump to a step by ID, checking the current step's guard first. |
134
+ | `setData(key, value)` | function | Update a single data field. Type-checked when `TData` is provided. |
135
+ | `resetStep()` | function | Restore data to step-entry state. |
136
+ | `startSubPath(definition, data?, meta?)` | function | Push a sub-path. |
137
+ | `restart(definition, data?)` | function | Tear down any active path and start fresh. |
138
+
139
+ All returned callbacks are referentially stable.
140
+
141
+ ### PathShell props
246
142
 
247
143
  | Prop | Type | Default | Description |
248
144
  |---|---|---|---|
249
145
  | `path` | `PathDefinition` | required | The path to drive. |
250
- | `steps` | `Record<string, ReactNode>` | required | Map of step ID content. |
146
+ | `steps` | `Record<string, ReactNode>` | required | Map of step ID to content. Keys must exactly match step IDs. |
251
147
  | `initialData` | `PathData` | `{}` | Initial data passed to `engine.start()`. |
252
- | `engine` | `PathEngine` | — | Externally managed engine (e.g., from `restoreOrStart()`). |
148
+ | `engine` | `PathEngine` | — | Externally-managed engine (e.g. from `restoreOrStart()`). |
253
149
  | `autoStart` | `boolean` | `true` | Start the path automatically on mount. |
254
- | `onComplete` | `(data) => void` | — | Called when the path completes. |
255
- | `onCancel` | `(data) => void` | — | Called when the path is cancelled. |
256
- | `onEvent` | `(event) => void` | — | Called for every engine event. |
150
+ | `onComplete` | `(data: PathData) => void` | — | Called when the path completes. |
151
+ | `onCancel` | `(data: PathData) => void` | — | Called when the path is cancelled. |
152
+ | `onEvent` | `(event: PathEvent) => void` | — | Called for every engine event. |
257
153
  | `backLabel` | `string` | `"Previous"` | Label for the back button. |
258
154
  | `nextLabel` | `string` | `"Next"` | Label for the next button. |
259
155
  | `completeLabel` | `string` | `"Complete"` | Label for the next button on the last step. |
260
156
  | `cancelLabel` | `string` | `"Cancel"` | Label for the cancel button. |
261
157
  | `hideCancel` | `boolean` | `false` | Hide the cancel button. |
262
- | `hideProgress` | `boolean` | `false` | Hide the progress header (numbered dots, current step title, and progress bar). Also hidden automatically for single-step top-level paths. |
263
- | `disableBodyScroll` | `boolean` | `false` | Replace the `ScrollView` body wrapper with a plain `View`. Use when the step content contains a `FlatList` or other virtualized list to avoid the "VirtualizedList inside ScrollView" warning. The step is then responsible for its own scroll. |
264
- | `footerLayout` | `"wizard" \| "form" \| "auto"` | `"auto"` | `"wizard"` puts back on the left; `"form"` puts cancel on the left. |
158
+ | `hideProgress` | `boolean` | `false` | Hide the progress header. Also hidden automatically for single-step paths. |
159
+ | `disableBodyScroll` | `boolean` | `false` | Replace the `ScrollView` body with a plain `View`. Use when a step contains a `FlatList` or other virtualized list. |
160
+ | `footerLayout` | `"wizard" \| "form" \| "auto"` | `"auto"` | `"wizard"`: Back on left. `"form"`: Cancel on left, no Back. |
265
161
  | `renderHeader` | `(snapshot) => ReactNode` | — | Replace the default progress header entirely. |
266
- | `renderFooter` | `(snapshot, actions) => ReactNode` | — | Replace the default nav buttons. |
162
+ | `renderFooter` | `(snapshot, actions) => ReactNode` | — | Replace the default navigation buttons. |
267
163
  | `style` | `StyleProp<ViewStyle>` | — | Override for the root `View`. |
268
164
 
269
- ---
165
+ ### PathShellHandle and the restart() ref pattern
270
166
 
271
- ## usePath options and return value
167
+ `PathShell` is a `forwardRef` component that exposes a `PathShellHandle`. Use a ref to call `restart()` imperatively from outside the shell — for example, from a parent screen's header button:
272
168
 
273
- ```typescript
274
- usePath(options?: {
275
- engine?: PathEngine; // Use an externally-managed engine
276
- onEvent?: (event: PathEvent) => void;
277
- })
278
- ```
169
+ ```tsx
170
+ import { useRef } from "react";
171
+ import { PathShell, PathShellHandle } from "@daltonr/pathwrite-react-native";
279
172
 
280
- Returns `UsePathReturn<TData>`:
173
+ export function OnboardingScreen() {
174
+ const shellRef = useRef<PathShellHandle>(null);
281
175
 
282
- | Field | Type | Description |
283
- |---|---|---|
284
- | `snapshot` | `PathSnapshot<TData> \| null` | Current state. `null` when no path is active. |
285
- | `start` | `(path, data?) => void` | Start a path. |
286
- | `startSubPath` | `(path, data?, meta?) => void` | Push a sub-path. |
287
- | `next` | `() => void` | Advance. Completes on the last step. |
288
- | `previous` | `() => void` | Go back. |
289
- | `cancel` | `() => void` | Cancel the active path. |
290
- | `goToStep` | `(stepId) => void` | Jump to a step (no guard check). |
291
- | `goToStepChecked` | `(stepId) => void` | Jump to a step (checks current step guard first). |
292
- | `setData` | `(key, value) => void` | Update one data field. |
293
- | `resetStep` | `() => void` | Restore data to step-entry state. |
294
- | `restart` | `(path, data?) => void` | Tear down and restart fresh. |
176
+ return (
177
+ <PathShell
178
+ ref={shellRef}
179
+ path={myPath}
180
+ initialData={{ name: "" }}
181
+ onComplete={(data) => console.log(data)}
182
+ steps={{ name: <NameStep /> }}
183
+ />
184
+ );
185
+ }
186
+ ```
295
187
 
296
188
  ---
297
189
 
298
- ## Testing
190
+ ## Further reading
299
191
 
300
- Hook tests (`usePath`, `usePathContext`) use `@testing-library/react` in a jsdom environment — no device or simulator required. The hooks are pure React (they use only `useSyncExternalStore`, `useCallback`, `useRef`) and work identically in both RN and web contexts.
192
+ - [React Native getting started guide](../../docs/getting-started/frameworks/react-native.md)
193
+ - [Navigation guide](../../docs/guides/navigation.md)
194
+ - [Full docs](../../docs/README.md)
195
+
196
+ ---
301
197
 
302
- PathShell component tests require `@testing-library/react-native` and a React Native test environment (e.g., Jest with `react-native` preset or Expo's Jest preset).
198
+ © 2026 Devjoy Ltd. MIT License.
package/dist/index.d.ts CHANGED
@@ -38,22 +38,34 @@ export interface UsePathReturn<TData extends PathData = PathData> {
38
38
  resetStep: () => void;
39
39
  /** Tear down any active path and immediately start the given path fresh. */
40
40
  restart: () => void;
41
+ /** Re-runs the operation that set `snapshot.error`. Increments `retryCount` on repeated failure. No-op when there is no pending error. */
42
+ retry: () => void;
43
+ /** Pauses the path with intent to return. Emits `suspended`. All state is preserved. */
44
+ suspend: () => void;
41
45
  }
42
46
  export type PathProviderProps = PropsWithChildren<{
43
47
  onEvent?: (event: PathEvent) => void;
48
+ /**
49
+ * Services object passed through context to all step components.
50
+ * Step components access it via `usePathContext<TData, TServices>()`.
51
+ */
52
+ services?: unknown;
44
53
  }>;
45
54
  export declare function usePath<TData extends PathData = PathData>(options?: UsePathOptions): UsePathReturn<TData>;
46
55
  /**
47
56
  * Provides a single `usePath` instance to all descendants.
48
57
  * Consume with `usePathContext()`.
49
58
  */
50
- export declare function PathProvider({ children, onEvent }: PathProviderProps): ReactElement;
59
+ export declare function PathProvider({ children, onEvent, services }: PathProviderProps): ReactElement;
51
60
  /**
52
- * Access the nearest `PathProvider`'s path instance.
53
- * Throws if used outside of a `<PathProvider>`.
61
+ * Access the nearest `PathProvider`'s path instance and optional services object.
62
+ * Throws if used outside of a `<PathProvider>` or `<PathShell>`.
63
+ *
64
+ * `TData` narrows `snapshot.data`; `TServices` types the `services` value.
54
65
  */
55
- export declare function usePathContext<TData extends PathData = PathData>(): Omit<UsePathReturn<TData>, "snapshot"> & {
66
+ export declare function usePathContext<TData extends PathData = PathData, TServices = unknown>(): Omit<UsePathReturn<TData>, "snapshot"> & {
56
67
  snapshot: PathSnapshot<TData>;
68
+ services: TServices;
57
69
  };
58
70
  export interface PathShellHandle {
59
71
  /** Restart the shell's current path with its original `initialData`, without unmounting. */
@@ -67,6 +79,8 @@ export interface PathShellActions {
67
79
  goToStepChecked: (stepId: string) => void;
68
80
  setData: (key: string, value: unknown) => void;
69
81
  restart: () => void;
82
+ retry: () => void;
83
+ suspend: () => void;
70
84
  }
71
85
  export interface PathShellProps {
72
86
  /** The path definition to drive. */
@@ -91,6 +105,8 @@ export interface PathShellProps {
91
105
  nextLabel?: string;
92
106
  /** Label for the Complete button (last step). Defaults to "Complete". */
93
107
  completeLabel?: string;
108
+ /** Label shown on the Next/Complete button while an async operation is in progress. When undefined, an ActivityIndicator spinner is shown instead. */
109
+ loadingLabel?: string;
94
110
  /** Label for the Cancel button. Defaults to "Cancel". */
95
111
  cancelLabel?: string;
96
112
  /** If true, hide the Cancel button. */
@@ -130,6 +146,11 @@ export interface PathShellProps {
130
146
  * warning. The step is then responsible for managing its own scroll.
131
147
  */
132
148
  disableBodyScroll?: boolean;
149
+ /**
150
+ * Services object passed through context to all step components.
151
+ * Step components access it via `usePathContext<TData, TServices>()`.
152
+ */
153
+ services?: unknown;
133
154
  }
134
155
  /**
135
156
  * Default UI shell for React Native. Renders a progress dot indicator,
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { createContext, createElement, forwardRef, useCallback, useContext, useEffect, useImperativeHandle, useRef, useSyncExternalStore, } from "react";
3
3
  import { View, Text, Pressable, ScrollView, StyleSheet, ActivityIndicator, KeyboardAvoidingView, Platform, } from "react-native";
4
- import { PathEngine, } from "@daltonr/pathwrite-core";
4
+ import { PathEngine, formatFieldKey, errorPhaseMessage, } from "@daltonr/pathwrite-core";
5
5
  // ---------------------------------------------------------------------------
6
6
  // usePath hook
7
7
  // ---------------------------------------------------------------------------
@@ -46,30 +46,34 @@ export function usePath(options) {
46
46
  const setData = useCallback((key, value) => engine.setData(key, value), [engine]);
47
47
  const resetStep = useCallback(() => engine.resetStep(), [engine]);
48
48
  const restart = useCallback(() => engine.restart(), [engine]);
49
- return { snapshot, start, startSubPath, next, previous, cancel, goToStep, goToStepChecked, setData, resetStep, restart };
49
+ const retry = useCallback(() => engine.retry(), [engine]);
50
+ const suspend = useCallback(() => engine.suspend(), [engine]);
51
+ return { snapshot, start, startSubPath, next, previous, cancel, goToStep, goToStepChecked, setData, resetStep, restart, retry, suspend };
50
52
  }
51
- // ---------------------------------------------------------------------------
52
- // Context + Provider
53
- // ---------------------------------------------------------------------------
54
53
  const PathContext = createContext(null);
55
54
  /**
56
55
  * Provides a single `usePath` instance to all descendants.
57
56
  * Consume with `usePathContext()`.
58
57
  */
59
- export function PathProvider({ children, onEvent }) {
58
+ export function PathProvider({ children, onEvent, services }) {
60
59
  const path = usePath({ onEvent });
61
- return createElement(PathContext.Provider, { value: path }, children);
60
+ return createElement(PathContext.Provider, { value: { path, services: services ?? null } }, children);
62
61
  }
63
62
  /**
64
- * Access the nearest `PathProvider`'s path instance.
65
- * Throws if used outside of a `<PathProvider>`.
63
+ * Access the nearest `PathProvider`'s path instance and optional services object.
64
+ * Throws if used outside of a `<PathProvider>` or `<PathShell>`.
65
+ *
66
+ * `TData` narrows `snapshot.data`; `TServices` types the `services` value.
66
67
  */
67
68
  export function usePathContext() {
68
69
  const ctx = useContext(PathContext);
69
70
  if (ctx === null) {
70
71
  throw new Error("usePathContext must be used within a <PathProvider>.");
71
72
  }
72
- return ctx;
73
+ return {
74
+ ...ctx.path,
75
+ services: ctx.services
76
+ };
73
77
  }
74
78
  /**
75
79
  * Default UI shell for React Native. Renders a progress dot indicator,
@@ -87,7 +91,7 @@ export function usePathContext() {
87
91
  * />
88
92
  * ```
89
93
  */
90
- export const PathShell = forwardRef(function PathShell({ path: pathDef, engine: externalEngine, steps, initialData = {}, autoStart = true, onComplete, onCancel, onEvent, backLabel = "Previous", nextLabel = "Next", completeLabel = "Complete", cancelLabel = "Cancel", hideCancel = false, hideProgress = false, footerLayout = "auto", validationDisplay = "summary", renderHeader, renderFooter, style, keyboardVerticalOffset = 0, disableBodyScroll = false, }, ref) {
94
+ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine: externalEngine, steps, initialData = {}, autoStart = true, onComplete, onCancel, onEvent, backLabel = "Previous", nextLabel = "Next", completeLabel = "Complete", loadingLabel, cancelLabel = "Cancel", hideCancel = false, hideProgress = false, footerLayout = "auto", validationDisplay = "summary", renderHeader, renderFooter, style, keyboardVerticalOffset = 0, disableBodyScroll = false, services, }, ref) {
91
95
  const pathReturn = usePath({
92
96
  engine: externalEngine,
93
97
  onEvent(event) {
@@ -98,7 +102,7 @@ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine:
98
102
  onCancel?.(event.data);
99
103
  },
100
104
  });
101
- const { snapshot, start, next, previous, cancel, goToStep, goToStepChecked, setData, restart } = pathReturn;
105
+ const { snapshot, start, next, previous, cancel, goToStep, goToStepChecked, setData, restart, retry, suspend } = pathReturn;
102
106
  useImperativeHandle(ref, () => ({
103
107
  restart: () => restart(),
104
108
  }));
@@ -114,12 +118,15 @@ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine:
114
118
  const stepContent = snapshot
115
119
  ? ((snapshot.formId ? steps[snapshot.formId] : undefined) ?? steps[snapshot.stepId] ?? null)
116
120
  : null;
121
+ const contextValue = { path: pathReturn, services: services ?? null };
117
122
  const actions = {
118
123
  next, previous, cancel, goToStep, goToStepChecked, setData,
119
124
  restart: () => restart(),
125
+ retry: () => retry(),
126
+ suspend: () => suspend(),
120
127
  };
121
128
  if (!snapshot) {
122
- return (_jsx(PathContext.Provider, { value: pathReturn, children: _jsx(View, { style: [styles.shell, style], children: _jsxs(View, { style: styles.emptyState, children: [_jsx(Text, { style: styles.emptyText, children: "No active path." }), !autoStart && (_jsx(Pressable, { style: styles.btnPrimary, onPress: () => start(pathDef, initialData), children: _jsx(Text, { style: styles.btnPrimaryText, children: "Start" }) }))] }) }) }));
129
+ return (_jsx(PathContext.Provider, { value: contextValue, children: _jsx(View, { style: [styles.shell, style], children: _jsxs(View, { style: styles.emptyState, children: [_jsx(Text, { style: styles.emptyText, children: "No active path." }), !autoStart && (_jsx(Pressable, { style: styles.btnPrimary, onPress: () => start(pathDef, initialData), children: _jsx(Text, { style: styles.btnPrimaryText, children: "Start" }) }))] }) }) }));
123
130
  }
124
131
  const resolvedLayout = footerLayout === "auto"
125
132
  ? snapshot.stepCount === 1 && snapshot.nestingLevel === 0
@@ -128,7 +135,7 @@ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine:
128
135
  : footerLayout;
129
136
  const isFormMode = resolvedLayout === "form";
130
137
  const showProgress = !hideProgress && (snapshot.stepCount > 1 || snapshot.nestingLevel > 0);
131
- return (_jsx(PathContext.Provider, { value: pathReturn, children: _jsxs(KeyboardAvoidingView, { style: [styles.shell, style], behavior: Platform.OS === "ios" ? "padding" : undefined, keyboardVerticalOffset: keyboardVerticalOffset, children: [showProgress && (renderHeader
138
+ return (_jsx(PathContext.Provider, { value: contextValue, children: _jsxs(KeyboardAvoidingView, { style: [styles.shell, style], behavior: Platform.OS === "ios" ? "padding" : undefined, keyboardVerticalOffset: keyboardVerticalOffset, children: [showProgress && (renderHeader
132
139
  ? renderHeader(snapshot)
133
140
  : (_jsxs(View, { style: styles.header, children: [_jsx(View, { style: styles.stepper, children: snapshot.steps.map((step, i) => (_jsx(View, { style: [
134
141
  styles.dot,
@@ -140,19 +147,21 @@ export const PathShell = forwardRef(function PathShell({ path: pathDef, engine:
140
147
  return title ? _jsx(Text, { style: styles.stepTitle, children: title }) : null;
141
148
  })(), _jsx(View, { style: styles.track, children: _jsx(View, { style: [styles.trackFill, { width: `${snapshot.progress * 100}%` }] }) })] }))), disableBodyScroll
142
149
  ? _jsx(View, { style: [styles.body, styles.bodyContent], children: stepContent })
143
- : _jsx(ScrollView, { style: styles.body, contentContainerStyle: styles.bodyContent, children: stepContent }), validationDisplay !== "inline" && snapshot.hasAttemptedNext && Object.keys(snapshot.fieldErrors).length > 0 && (_jsx(View, { style: styles.validation, children: Object.entries(snapshot.fieldErrors).map(([key, msg]) => (_jsxs(Text, { style: styles.validationItem, children: [key !== "_" && _jsxs(Text, { style: styles.validationLabel, children: [formatFieldKey(key), ": "] }), msg] }, key))) })), Object.keys(snapshot.fieldWarnings).length > 0 && (_jsx(View, { style: styles.warnings, children: Object.entries(snapshot.fieldWarnings).map(([key, msg]) => (_jsxs(Text, { style: styles.warningItem, children: [key !== "_" && _jsxs(Text, { style: styles.warningLabel, children: [formatFieldKey(key), ": "] }), msg] }, key))) })), renderFooter
144
- ? renderFooter(snapshot, actions)
145
- : (_jsxs(View, { style: styles.footer, children: [_jsxs(View, { style: styles.footerLeft, children: [isFormMode && !hideCancel && (_jsx(Pressable, { style: [styles.btn, styles.btnCancel, snapshot.isNavigating && styles.btnDisabled], onPress: cancel, disabled: snapshot.isNavigating, children: _jsx(Text, { style: styles.btnCancelText, children: cancelLabel }) })), !isFormMode && !snapshot.isFirstStep && (_jsx(Pressable, { style: [styles.btn, styles.btnBack, (snapshot.isNavigating || !snapshot.canMovePrevious) && styles.btnDisabled], onPress: previous, disabled: snapshot.isNavigating || !snapshot.canMovePrevious, children: _jsxs(Text, { style: styles.btnBackText, children: ["\u2190 ", backLabel] }) }))] }), _jsxs(View, { style: styles.footerRight, children: [!isFormMode && !hideCancel && (_jsx(Pressable, { style: [styles.btn, styles.btnCancel, snapshot.isNavigating && styles.btnDisabled], onPress: cancel, disabled: snapshot.isNavigating, children: _jsx(Text, { style: styles.btnCancelText, children: cancelLabel }) })), _jsx(Pressable, { style: [styles.btn, styles.btnPrimary, snapshot.isNavigating && styles.btnDisabled], onPress: next, disabled: snapshot.isNavigating || !snapshot.canMoveNext, children: snapshot.isNavigating
146
- ? _jsx(ActivityIndicator, { size: "small", color: "#ffffff" })
147
- : _jsx(Text, { style: styles.btnPrimaryText, children: snapshot.isLastStep ? completeLabel : `${nextLabel} →` }) })] })] }))] }) }));
150
+ : _jsx(ScrollView, { style: styles.body, contentContainerStyle: styles.bodyContent, children: stepContent }), validationDisplay !== "inline" && snapshot.hasAttemptedNext && Object.keys(snapshot.fieldErrors).length > 0 && (_jsx(View, { style: styles.validation, children: Object.entries(snapshot.fieldErrors).map(([key, msg]) => (_jsxs(Text, { style: styles.validationItem, children: [key !== "_" && _jsxs(Text, { style: styles.validationLabel, children: [formatFieldKey(key), ": "] }), msg] }, key))) })), Object.keys(snapshot.fieldWarnings).length > 0 && (_jsx(View, { style: styles.warnings, children: Object.entries(snapshot.fieldWarnings).map(([key, msg]) => (_jsxs(Text, { style: styles.warningItem, children: [key !== "_" && _jsxs(Text, { style: styles.warningLabel, children: [formatFieldKey(key), ": "] }), msg] }, key))) })), validationDisplay !== "inline" && snapshot.hasAttemptedNext && snapshot.blockingError && (_jsx(Text, { style: styles.blockingError, children: snapshot.blockingError })), snapshot.status === "error" && snapshot.error
151
+ ? (() => {
152
+ const err = snapshot.error;
153
+ const escalated = err.retryCount >= 2;
154
+ return (_jsxs(View, { style: styles.errorPanel, children: [_jsx(Text, { style: styles.errorTitle, children: escalated ? "Still having trouble." : "Something went wrong." }), _jsxs(Text, { style: styles.errorMessage, children: [errorPhaseMessage(err.phase), err.message ? ` ${err.message}` : ""] }), _jsxs(View, { style: styles.errorActions, children: [!escalated && (_jsx(Pressable, { style: [styles.btn, styles.btnRetry], onPress: retry, children: _jsx(Text, { style: styles.btnPrimaryText, children: "Try again" }) })), snapshot.hasPersistence && (_jsx(Pressable, { style: [styles.btn, escalated ? styles.btnRetry : styles.btnSuspend], onPress: suspend, children: _jsx(Text, { style: escalated ? styles.btnPrimaryText : styles.btnCancelText, children: "Save and come back later" }) })), escalated && !snapshot.hasPersistence && (_jsx(Pressable, { style: [styles.btn, styles.btnRetry], onPress: retry, children: _jsx(Text, { style: styles.btnPrimaryText, children: "Try again" }) }))] })] }));
155
+ })()
156
+ : renderFooter
157
+ ? renderFooter(snapshot, actions)
158
+ : (_jsxs(View, { style: styles.footer, children: [_jsxs(View, { style: styles.footerLeft, children: [isFormMode && !hideCancel && (_jsx(Pressable, { style: [styles.btn, styles.btnCancel, snapshot.status !== "idle" && styles.btnDisabled], onPress: cancel, disabled: snapshot.status !== "idle", children: _jsx(Text, { style: styles.btnCancelText, children: cancelLabel }) })), !isFormMode && !snapshot.isFirstStep && (_jsx(Pressable, { style: [styles.btn, styles.btnBack, (snapshot.status !== "idle" || !snapshot.canMovePrevious) && styles.btnDisabled], onPress: previous, disabled: snapshot.status !== "idle" || !snapshot.canMovePrevious, children: _jsxs(Text, { style: styles.btnBackText, children: ["\u2190 ", backLabel] }) }))] }), _jsxs(View, { style: styles.footerRight, children: [!isFormMode && !hideCancel && (_jsx(Pressable, { style: [styles.btn, styles.btnCancel, snapshot.status !== "idle" && styles.btnDisabled], onPress: cancel, disabled: snapshot.status !== "idle", children: _jsx(Text, { style: styles.btnCancelText, children: cancelLabel }) })), _jsx(Pressable, { style: [styles.btn, styles.btnPrimary, snapshot.status !== "idle" && styles.btnDisabled], onPress: next, disabled: snapshot.status !== "idle" || !snapshot.canMoveNext, children: snapshot.status !== "idle" && loadingLabel
159
+ ? _jsx(Text, { style: styles.btnPrimaryText, children: loadingLabel })
160
+ : snapshot.status !== "idle"
161
+ ? _jsx(ActivityIndicator, { size: "small", color: "#ffffff" })
162
+ : _jsx(Text, { style: styles.btnPrimaryText, children: snapshot.isLastStep ? completeLabel : `${nextLabel} →` }) })] })] }))] }) }));
148
163
  });
149
164
  // ---------------------------------------------------------------------------
150
- // Helpers
151
- // ---------------------------------------------------------------------------
152
- function formatFieldKey(key) {
153
- return key.replace(/([A-Z])/g, " $1").replace(/^./, (c) => c.toUpperCase()).trim();
154
- }
155
- // ---------------------------------------------------------------------------
156
165
  // Styles
157
166
  // ---------------------------------------------------------------------------
158
167
  const styles = StyleSheet.create({
@@ -317,5 +326,38 @@ const styles = StyleSheet.create({
317
326
  fontWeight: "500",
318
327
  fontSize: 15,
319
328
  },
329
+ blockingError: {
330
+ fontSize: 13,
331
+ color: "#dc2626",
332
+ marginTop: 4,
333
+ },
334
+ btnRetry: {
335
+ backgroundColor: "#dc2626",
336
+ },
337
+ btnSuspend: {
338
+ backgroundColor: "transparent",
339
+ },
340
+ errorPanel: {
341
+ backgroundColor: "#fef2f2",
342
+ borderRadius: 10,
343
+ borderWidth: 1,
344
+ borderColor: "#fecaca",
345
+ padding: 16,
346
+ gap: 8,
347
+ },
348
+ errorTitle: {
349
+ fontSize: 14,
350
+ fontWeight: "600",
351
+ color: "#dc2626",
352
+ },
353
+ errorMessage: {
354
+ fontSize: 13,
355
+ color: "#6b7280",
356
+ },
357
+ errorActions: {
358
+ flexDirection: "row",
359
+ gap: 8,
360
+ marginTop: 4,
361
+ },
320
362
  });
321
363
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@daltonr/pathwrite-react-native",
3
- "version": "0.9.0",
3
+ "version": "0.10.1",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "React Native adapter for @daltonr/pathwrite-core — hooks, context provider, and optional PathShell default UI.",
@@ -44,7 +44,7 @@
44
44
  "react-native": ">=0.72.0"
45
45
  },
46
46
  "dependencies": {
47
- "@daltonr/pathwrite-core": "^0.9.0"
47
+ "@daltonr/pathwrite-core": "^0.10.1"
48
48
  },
49
49
  "devDependencies": {
50
50
  "react": "^18.3.1",
package/src/index.tsx CHANGED
@@ -28,6 +28,8 @@ import {
28
28
  PathEvent,
29
29
  PathSnapshot,
30
30
  ProgressLayout,
31
+ formatFieldKey,
32
+ errorPhaseMessage,
31
33
  } from "@daltonr/pathwrite-core";
32
34
 
33
35
  // ---------------------------------------------------------------------------
@@ -72,10 +74,19 @@ export interface UsePathReturn<TData extends PathData = PathData> {
72
74
  resetStep: () => void;
73
75
  /** Tear down any active path and immediately start the given path fresh. */
74
76
  restart: () => void;
77
+ /** Re-runs the operation that set `snapshot.error`. Increments `retryCount` on repeated failure. No-op when there is no pending error. */
78
+ retry: () => void;
79
+ /** Pauses the path with intent to return. Emits `suspended`. All state is preserved. */
80
+ suspend: () => void;
75
81
  }
76
82
 
77
83
  export type PathProviderProps = PropsWithChildren<{
78
84
  onEvent?: (event: PathEvent) => void;
85
+ /**
86
+ * Services object passed through context to all step components.
87
+ * Step components access it via `usePathContext<TData, TServices>()`.
88
+ */
89
+ services?: unknown;
79
90
  }>;
80
91
 
81
92
  // ---------------------------------------------------------------------------
@@ -141,35 +152,47 @@ export function usePath<TData extends PathData = PathData>(options?: UsePathOpti
141
152
  ) as UsePathReturn<TData>["setData"];
142
153
  const resetStep = useCallback(() => engine.resetStep(), [engine]);
143
154
  const restart = useCallback(() => engine.restart(), [engine]);
155
+ const retry = useCallback(() => engine.retry(), [engine]);
156
+ const suspend = useCallback(() => engine.suspend(), [engine]);
144
157
 
145
- return { snapshot, start, startSubPath, next, previous, cancel, goToStep, goToStepChecked, setData, resetStep, restart };
158
+ return { snapshot, start, startSubPath, next, previous, cancel, goToStep, goToStepChecked, setData, resetStep, restart, retry, suspend };
146
159
  }
147
160
 
148
161
  // ---------------------------------------------------------------------------
149
162
  // Context + Provider
150
163
  // ---------------------------------------------------------------------------
151
164
 
152
- const PathContext = createContext<UsePathReturn | null>(null);
165
+ interface PathContextValue {
166
+ path: UsePathReturn;
167
+ services: unknown;
168
+ }
169
+
170
+ const PathContext = createContext<PathContextValue | null>(null);
153
171
 
154
172
  /**
155
173
  * Provides a single `usePath` instance to all descendants.
156
174
  * Consume with `usePathContext()`.
157
175
  */
158
- export function PathProvider({ children, onEvent }: PathProviderProps): ReactElement {
176
+ export function PathProvider({ children, onEvent, services }: PathProviderProps): ReactElement {
159
177
  const path = usePath({ onEvent });
160
- return createElement(PathContext.Provider, { value: path }, children);
178
+ return createElement(PathContext.Provider, { value: { path, services: services ?? null } }, children);
161
179
  }
162
180
 
163
181
  /**
164
- * Access the nearest `PathProvider`'s path instance.
165
- * Throws if used outside of a `<PathProvider>`.
182
+ * Access the nearest `PathProvider`'s path instance and optional services object.
183
+ * Throws if used outside of a `<PathProvider>` or `<PathShell>`.
184
+ *
185
+ * `TData` narrows `snapshot.data`; `TServices` types the `services` value.
166
186
  */
167
- export function usePathContext<TData extends PathData = PathData>(): Omit<UsePathReturn<TData>, "snapshot"> & { snapshot: PathSnapshot<TData> } {
187
+ export function usePathContext<TData extends PathData = PathData, TServices = unknown>(): Omit<UsePathReturn<TData>, "snapshot"> & { snapshot: PathSnapshot<TData>; services: TServices } {
168
188
  const ctx = useContext(PathContext);
169
189
  if (ctx === null) {
170
190
  throw new Error("usePathContext must be used within a <PathProvider>.");
171
191
  }
172
- return ctx as Omit<UsePathReturn<TData>, "snapshot"> & { snapshot: PathSnapshot<TData> };
192
+ return {
193
+ ...(ctx.path as unknown as Omit<UsePathReturn<TData>, "snapshot"> & { snapshot: PathSnapshot<TData> }),
194
+ services: ctx.services as TServices
195
+ };
173
196
  }
174
197
 
175
198
  // ---------------------------------------------------------------------------
@@ -189,6 +212,8 @@ export interface PathShellActions {
189
212
  goToStepChecked: (stepId: string) => void;
190
213
  setData: (key: string, value: unknown) => void;
191
214
  restart: () => void;
215
+ retry: () => void;
216
+ suspend: () => void;
192
217
  }
193
218
 
194
219
  export interface PathShellProps {
@@ -214,6 +239,8 @@ export interface PathShellProps {
214
239
  nextLabel?: string;
215
240
  /** Label for the Complete button (last step). Defaults to "Complete". */
216
241
  completeLabel?: string;
242
+ /** Label shown on the Next/Complete button while an async operation is in progress. When undefined, an ActivityIndicator spinner is shown instead. */
243
+ loadingLabel?: string;
217
244
  /** Label for the Cancel button. Defaults to "Cancel". */
218
245
  cancelLabel?: string;
219
246
  /** If true, hide the Cancel button. */
@@ -253,6 +280,11 @@ export interface PathShellProps {
253
280
  * warning. The step is then responsible for managing its own scroll.
254
281
  */
255
282
  disableBodyScroll?: boolean;
283
+ /**
284
+ * Services object passed through context to all step components.
285
+ * Step components access it via `usePathContext<TData, TServices>()`.
286
+ */
287
+ services?: unknown;
256
288
  }
257
289
 
258
290
  /**
@@ -283,6 +315,7 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
283
315
  backLabel = "Previous",
284
316
  nextLabel = "Next",
285
317
  completeLabel = "Complete",
318
+ loadingLabel,
286
319
  cancelLabel = "Cancel",
287
320
  hideCancel = false,
288
321
  hideProgress = false,
@@ -293,6 +326,7 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
293
326
  style,
294
327
  keyboardVerticalOffset = 0,
295
328
  disableBodyScroll = false,
329
+ services,
296
330
  }: PathShellProps, ref): ReactElement {
297
331
  const pathReturn = usePath({
298
332
  engine: externalEngine,
@@ -303,7 +337,7 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
303
337
  },
304
338
  });
305
339
 
306
- const { snapshot, start, next, previous, cancel, goToStep, goToStepChecked, setData, restart } = pathReturn;
340
+ const { snapshot, start, next, previous, cancel, goToStep, goToStepChecked, setData, restart, retry, suspend } = pathReturn;
307
341
 
308
342
  useImperativeHandle(ref, () => ({
309
343
  restart: () => restart(),
@@ -323,14 +357,18 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
323
357
  ? ((snapshot.formId ? steps[snapshot.formId] : undefined) ?? steps[snapshot.stepId] ?? null)
324
358
  : null;
325
359
 
360
+ const contextValue: PathContextValue = { path: pathReturn, services: services ?? null };
361
+
326
362
  const actions: PathShellActions = {
327
363
  next, previous, cancel, goToStep, goToStepChecked, setData,
328
364
  restart: () => restart(),
365
+ retry: () => retry(),
366
+ suspend: () => suspend(),
329
367
  };
330
368
 
331
369
  if (!snapshot) {
332
370
  return (
333
- <PathContext.Provider value={pathReturn}>
371
+ <PathContext.Provider value={contextValue}>
334
372
  <View style={[styles.shell, style]}>
335
373
  <View style={styles.emptyState}>
336
374
  <Text style={styles.emptyText}>No active path.</Text>
@@ -356,7 +394,7 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
356
394
  !hideProgress && (snapshot.stepCount > 1 || snapshot.nestingLevel > 0);
357
395
 
358
396
  return (
359
- <PathContext.Provider value={pathReturn}>
397
+ <PathContext.Provider value={contextValue}>
360
398
  <KeyboardAvoidingView
361
399
  style={[styles.shell, style]}
362
400
  behavior={Platform.OS === "ios" ? "padding" : undefined}
@@ -426,26 +464,68 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
426
464
  </View>
427
465
  )}
428
466
 
429
- {/* Footernavigation or custom */}
430
- {renderFooter
467
+ {/* Blocking error guard returned { allowed: false, reason } */}
468
+ {validationDisplay !== "inline" && snapshot.hasAttemptedNext && snapshot.blockingError && (
469
+ <Text style={styles.blockingError}>{snapshot.blockingError}</Text>
470
+ )}
471
+
472
+ {/* Error panel — replaces footer when an async operation has failed */}
473
+ {snapshot.status === "error" && snapshot.error
474
+ ? (() => {
475
+ const err = snapshot.error!;
476
+ const escalated = err.retryCount >= 2;
477
+ return (
478
+ <View style={styles.errorPanel}>
479
+ <Text style={styles.errorTitle}>
480
+ {escalated ? "Still having trouble." : "Something went wrong."}
481
+ </Text>
482
+ <Text style={styles.errorMessage}>
483
+ {errorPhaseMessage(err.phase)}{err.message ? ` ${err.message}` : ""}
484
+ </Text>
485
+ <View style={styles.errorActions}>
486
+ {!escalated && (
487
+ <Pressable style={[styles.btn, styles.btnRetry]} onPress={retry}>
488
+ <Text style={styles.btnPrimaryText}>Try again</Text>
489
+ </Pressable>
490
+ )}
491
+ {snapshot.hasPersistence && (
492
+ <Pressable
493
+ style={[styles.btn, escalated ? styles.btnRetry : styles.btnSuspend]}
494
+ onPress={suspend}
495
+ >
496
+ <Text style={escalated ? styles.btnPrimaryText : styles.btnCancelText}>
497
+ Save and come back later
498
+ </Text>
499
+ </Pressable>
500
+ )}
501
+ {escalated && !snapshot.hasPersistence && (
502
+ <Pressable style={[styles.btn, styles.btnRetry]} onPress={retry}>
503
+ <Text style={styles.btnPrimaryText}>Try again</Text>
504
+ </Pressable>
505
+ )}
506
+ </View>
507
+ </View>
508
+ );
509
+ })()
510
+ : renderFooter
431
511
  ? renderFooter(snapshot, actions)
432
512
  : (
433
513
  <View style={styles.footer}>
434
514
  <View style={styles.footerLeft}>
435
515
  {isFormMode && !hideCancel && (
436
516
  <Pressable
437
- style={[styles.btn, styles.btnCancel, snapshot.isNavigating && styles.btnDisabled]}
517
+ style={[styles.btn, styles.btnCancel, snapshot.status !== "idle" && styles.btnDisabled]}
438
518
  onPress={cancel}
439
- disabled={snapshot.isNavigating}
519
+ disabled={snapshot.status !== "idle"}
440
520
  >
441
521
  <Text style={styles.btnCancelText}>{cancelLabel}</Text>
442
522
  </Pressable>
443
523
  )}
444
524
  {!isFormMode && !snapshot.isFirstStep && (
445
525
  <Pressable
446
- style={[styles.btn, styles.btnBack, (snapshot.isNavigating || !snapshot.canMovePrevious) && styles.btnDisabled]}
526
+ style={[styles.btn, styles.btnBack, (snapshot.status !== "idle" || !snapshot.canMovePrevious) && styles.btnDisabled]}
447
527
  onPress={previous}
448
- disabled={snapshot.isNavigating || !snapshot.canMovePrevious}
528
+ disabled={snapshot.status !== "idle" || !snapshot.canMovePrevious}
449
529
  >
450
530
  <Text style={styles.btnBackText}>← {backLabel}</Text>
451
531
  </Pressable>
@@ -454,21 +534,23 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
454
534
  <View style={styles.footerRight}>
455
535
  {!isFormMode && !hideCancel && (
456
536
  <Pressable
457
- style={[styles.btn, styles.btnCancel, snapshot.isNavigating && styles.btnDisabled]}
537
+ style={[styles.btn, styles.btnCancel, snapshot.status !== "idle" && styles.btnDisabled]}
458
538
  onPress={cancel}
459
- disabled={snapshot.isNavigating}
539
+ disabled={snapshot.status !== "idle"}
460
540
  >
461
541
  <Text style={styles.btnCancelText}>{cancelLabel}</Text>
462
542
  </Pressable>
463
543
  )}
464
544
  <Pressable
465
- style={[styles.btn, styles.btnPrimary, snapshot.isNavigating && styles.btnDisabled]}
545
+ style={[styles.btn, styles.btnPrimary, snapshot.status !== "idle" && styles.btnDisabled]}
466
546
  onPress={next}
467
- disabled={snapshot.isNavigating || !snapshot.canMoveNext}
547
+ disabled={snapshot.status !== "idle" || !snapshot.canMoveNext}
468
548
  >
469
- {snapshot.isNavigating
470
- ? <ActivityIndicator size="small" color="#ffffff" />
471
- : <Text style={styles.btnPrimaryText}>{snapshot.isLastStep ? completeLabel : `${nextLabel} →`}</Text>
549
+ {snapshot.status !== "idle" && loadingLabel
550
+ ? <Text style={styles.btnPrimaryText}>{loadingLabel}</Text>
551
+ : snapshot.status !== "idle"
552
+ ? <ActivityIndicator size="small" color="#ffffff" />
553
+ : <Text style={styles.btnPrimaryText}>{snapshot.isLastStep ? completeLabel : `${nextLabel} →`}</Text>
472
554
  }
473
555
  </Pressable>
474
556
  </View>
@@ -480,13 +562,7 @@ export const PathShell = forwardRef<PathShellHandle, PathShellProps>(function Pa
480
562
  );
481
563
  });
482
564
 
483
- // ---------------------------------------------------------------------------
484
- // Helpers
485
- // ---------------------------------------------------------------------------
486
565
 
487
- function formatFieldKey(key: string): string {
488
- return key.replace(/([A-Z])/g, " $1").replace(/^./, (c) => c.toUpperCase()).trim();
489
- }
490
566
 
491
567
  // ---------------------------------------------------------------------------
492
568
  // Styles
@@ -654,6 +730,39 @@ const styles = StyleSheet.create({
654
730
  fontWeight: "500",
655
731
  fontSize: 15,
656
732
  },
733
+ blockingError: {
734
+ fontSize: 13,
735
+ color: "#dc2626",
736
+ marginTop: 4,
737
+ },
738
+ btnRetry: {
739
+ backgroundColor: "#dc2626",
740
+ },
741
+ btnSuspend: {
742
+ backgroundColor: "transparent",
743
+ },
744
+ errorPanel: {
745
+ backgroundColor: "#fef2f2",
746
+ borderRadius: 10,
747
+ borderWidth: 1,
748
+ borderColor: "#fecaca",
749
+ padding: 16,
750
+ gap: 8,
751
+ },
752
+ errorTitle: {
753
+ fontSize: 14,
754
+ fontWeight: "600",
755
+ color: "#dc2626",
756
+ },
757
+ errorMessage: {
758
+ fontSize: 13,
759
+ color: "#6b7280",
760
+ },
761
+ errorActions: {
762
+ flexDirection: "row",
763
+ gap: 8,
764
+ marginTop: 4,
765
+ },
657
766
  });
658
767
 
659
768
  // ---------------------------------------------------------------------------