@wise/dynamic-flow-client 3.9.0-experimental-bd037e3 → 3.9.0-experimental-90bdf26

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.
@@ -0,0 +1,156 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ import { jsx as _jsx } from "react/jsx-runtime";
49
+ import { screen, waitFor } from '@testing-library/react';
50
+ import { userEvent } from '@testing-library/user-event';
51
+ import { renderWithProviders } from '../../test-utils';
52
+ import DynamicFlowWise from '../DynamicFlowWise';
53
+ var getDefaultProps = function () { return ({
54
+ flowId: 'flow-id',
55
+ onCompletion: jest.fn(),
56
+ httpClient: jest.fn(),
57
+ onError: jest.fn(),
58
+ onEvent: jest.fn(),
59
+ onLog: jest.fn(),
60
+ }); };
61
+ describe('When the component is re-rendered', function () {
62
+ var initialStep = {
63
+ id: 'name-step',
64
+ title: 'Name Step',
65
+ schemas: [
66
+ {
67
+ $id: '#form',
68
+ type: 'string',
69
+ title: 'Name',
70
+ },
71
+ ],
72
+ layout: [
73
+ {
74
+ type: 'form',
75
+ schemaId: '#form',
76
+ },
77
+ ],
78
+ };
79
+ describe('and the "initialStep" props DOES NOT HAVE the same stable reference', function () {
80
+ it('does NOT re-initialise, hence the "Initiated" tracking event is not triggered a second time', function () { return __awaiter(void 0, void 0, void 0, function () {
81
+ var props, rerender;
82
+ return __generator(this, function (_a) {
83
+ switch (_a.label) {
84
+ case 0:
85
+ props = getDefaultProps();
86
+ rerender = renderWithProviders(_jsx(DynamicFlowWise, __assign({}, props, { initialStep: initialStep }))).rerender;
87
+ return [4 /*yield*/, waitFor(function () {
88
+ return expect(props.onEvent).toHaveBeenCalledWith('Dynamic Flow - Initiated', expect.anything());
89
+ })];
90
+ case 1:
91
+ _a.sent();
92
+ props.onEvent.mockClear();
93
+ rerender(_jsx(DynamicFlowWise, __assign({}, props, { initialStep: __assign({}, initialStep) })));
94
+ return [4 /*yield*/, waitFor(function () { return expect(props.onEvent).not.toHaveBeenCalled(); })];
95
+ case 2:
96
+ _a.sent();
97
+ return [2 /*return*/];
98
+ }
99
+ });
100
+ }); });
101
+ });
102
+ describe('and the "initialAction" props DOES NOT HAVE the same stable reference', function () {
103
+ it('does NOT re-initialise, and it keeps focus on the input field', function () { return __awaiter(void 0, void 0, void 0, function () {
104
+ var props, httpClient, rerender;
105
+ return __generator(this, function (_a) {
106
+ switch (_a.label) {
107
+ case 0:
108
+ props = getDefaultProps();
109
+ httpClient = jest.fn(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
110
+ return [2 /*return*/, Promise.resolve(new Response(JSON.stringify(initialStep)))];
111
+ }); }); });
112
+ rerender = renderWithProviders(_jsx(DynamicFlowWise, __assign({}, props, { httpClient: httpClient, initialAction: { url: '/initial-step', method: 'GET' } }))).rerender;
113
+ return [4 /*yield*/, waitFor(function () { return expect(httpClient).toHaveBeenCalledTimes(1); })];
114
+ case 1:
115
+ _a.sent();
116
+ rerender(_jsx(DynamicFlowWise, __assign({}, props, { httpClient: httpClient, initialAction: { url: '/initial-step', method: 'GET' } })));
117
+ return [4 /*yield*/, wait(10)];
118
+ case 2:
119
+ _a.sent(); // wait for the re-render to complete, give it a change to fail
120
+ return [4 /*yield*/, waitFor(function () { return expect(httpClient).toHaveBeenCalledTimes(1); })];
121
+ case 3:
122
+ _a.sent();
123
+ return [2 /*return*/];
124
+ }
125
+ });
126
+ }); });
127
+ });
128
+ describe('and the "renderers" prop has the same stable reference', function () {
129
+ it('keeps focus on the input field', function () { return __awaiter(void 0, void 0, void 0, function () {
130
+ var props, stableRenderers, rerender;
131
+ return __generator(this, function (_a) {
132
+ switch (_a.label) {
133
+ case 0:
134
+ props = getDefaultProps();
135
+ stableRenderers = [];
136
+ rerender = renderWithProviders(_jsx(DynamicFlowWise, __assign({}, props, { initialStep: initialStep, renderers: stableRenderers }))).rerender;
137
+ return [4 /*yield*/, userEvent.click(screen.getByLabelText('Name'))];
138
+ case 1:
139
+ _a.sent();
140
+ expect(screen.getByLabelText('Name')).toHaveFocus();
141
+ rerender(_jsx(DynamicFlowWise, __assign({}, props, { initialStep: initialStep, renderers: stableRenderers })));
142
+ // focus should be kept after re-render
143
+ expect(screen.getByLabelText('Name')).toHaveFocus();
144
+ return [2 /*return*/];
145
+ }
146
+ });
147
+ }); });
148
+ });
149
+ });
150
+ var wait = function (ms) { return __awaiter(void 0, void 0, void 0, function () {
151
+ return __generator(this, function (_a) {
152
+ return [2 /*return*/, new Promise(function (resolve) {
153
+ setTimeout(resolve, ms);
154
+ })];
155
+ });
156
+ }); };
@@ -0,0 +1,285 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ var __rest = (this && this.__rest) || function (s, e) {
49
+ var t = {};
50
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
51
+ t[p] = s[p];
52
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
53
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
54
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
55
+ t[p[i]] = s[p[i]];
56
+ }
57
+ return t;
58
+ };
59
+ import { validateStep } from '@wise/dynamic-flow-types';
60
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
61
+ import { useIntl } from 'react-intl';
62
+ import { mapStepToComponent } from './domain/mappers/mapStepToComponent';
63
+ import { executeRefresh } from './flow/executeRefresh';
64
+ import { executeSubmission } from './flow/executeSubmission';
65
+ import { getSchemaErrorMessageFunction } from './renderers/getSchemaErrorMessageFunction';
66
+ import { findComponent } from './utils/findComponent';
67
+ import { useStableCallback } from './utils/useStableCallback';
68
+ export function useDynamicFlowCore(props) {
69
+ var _this = this;
70
+ var flowId = props.flowId, initialAction = props.initialAction, initialStep = props.initialStep, _a = props.displayStepTitle, displayStepTitle = _a === void 0 ? true : _a, rest = __rest(props, ["flowId", "initialAction", "initialStep", "displayStepTitle"]);
71
+ var httpClient = useStableCallback(rest.httpClient);
72
+ var onCompletion = useStableCallback(rest.onCompletion);
73
+ var onValueChange = useStableCallback(props.onValueChange);
74
+ var onError = useStableCallback(rest.onError);
75
+ var onEvent = useStableCallback(rest.onEvent);
76
+ var onLog = useStableCallback(rest.onLog);
77
+ var _b = useIntl(), formatMessage = _b.formatMessage, locale = _b.locale;
78
+ var getErrorMessageFunctions = useMemo(function () { return getSchemaErrorMessageFunction(formatMessage, locale); }, [formatMessage, locale]);
79
+ var _c = useState(null), stepComponent = _c[0], setStepComponent = _c[1];
80
+ var stepComponentRef = useRef(null);
81
+ var stepRef = useRef(initialStep !== null && initialStep !== void 0 ? initialStep : null);
82
+ var etagRef = useRef(null);
83
+ var abortControllerRef = useRef(new AbortController());
84
+ var abortCurrentAndGetNewAbortSignal = function () {
85
+ abortControllerRef.current.abort();
86
+ abortControllerRef.current = new AbortController();
87
+ return abortControllerRef.current.signal;
88
+ };
89
+ useEffect(function () {
90
+ // Initialise Flow
91
+ trackCoreEvent('Initiated');
92
+ if (!initialStep && initialAction) {
93
+ void onAction(__assign({ method: 'GET' }, initialAction));
94
+ }
95
+ if (initialStep && !initialAction) {
96
+ initialiseWithStep(initialStep, null);
97
+ trackCoreEvent('Step Shown', { isFirstStep: true });
98
+ }
99
+ // eslint-disable-next-line react-hooks/exhaustive-deps
100
+ }, []);
101
+ var initialiseWithStep = useCallback(function (newStep, etag) {
102
+ var _a, _b, _c;
103
+ (_a = stepComponentRef.current) === null || _a === void 0 ? void 0 : _a.stop();
104
+ stepRef.current = newStep;
105
+ etagRef.current = etag;
106
+ var validationResult = validateStep(newStep);
107
+ if (!validationResult.valid) {
108
+ logEvent('warning', 'Invalid step.', { errors: validationResult.errors });
109
+ }
110
+ var updateComponent = function (id, update) {
111
+ var currentStepComponent = stepComponentRef.current;
112
+ if (currentStepComponent) {
113
+ update(findComponent([currentStepComponent], id));
114
+ setStepComponent(function () {
115
+ var newStepDomainComponent = __assign({}, currentStepComponent);
116
+ stepComponentRef.current = newStepDomainComponent;
117
+ return newStepDomainComponent;
118
+ });
119
+ }
120
+ };
121
+ try {
122
+ var newStepComponent_1 = mapStepToComponent({
123
+ stepLocalValue: (_c = (_b = stepComponentRef.current) === null || _b === void 0 ? void 0 : _b.getLocalValue()) !== null && _c !== void 0 ? _c : null,
124
+ step: newStep,
125
+ displayStepTitle: displayStepTitle,
126
+ loadingState: 'idle',
127
+ updateComponent: updateComponent,
128
+ getErrorMessageFunctions: getErrorMessageFunctions,
129
+ trackEvent: trackEvent,
130
+ logEvent: logEvent,
131
+ httpClient: httpClient,
132
+ onAction: onAction,
133
+ onRefresh: onRefresh,
134
+ onValueChange: onValueChange,
135
+ });
136
+ setStepComponent(function () {
137
+ stepComponentRef.current = newStepComponent_1;
138
+ return newStepComponent_1;
139
+ });
140
+ }
141
+ catch (error) {
142
+ closeWithError(error);
143
+ }
144
+ },
145
+ // eslint-disable-next-line react-hooks/exhaustive-deps
146
+ []);
147
+ var trackEvent = useCallback(function (eventName, properties) {
148
+ var _a, _b, _c, _d;
149
+ var stepId = (_b = (_a = stepRef.current) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : (_c = stepRef.current) === null || _c === void 0 ? void 0 : _c.key;
150
+ var analytics = (_d = stepRef.current) === null || _d === void 0 ? void 0 : _d.analytics;
151
+ var metadata = __assign(__assign(__assign({ flowId: flowId }, (stepId ? { stepId: stepId } : {})), analytics), properties);
152
+ try {
153
+ onEvent === null || onEvent === void 0 ? void 0 : onEvent("Dynamic Flow - ".concat(eventName), __assign({}, metadata));
154
+ }
155
+ catch (_e) { }
156
+ },
157
+ // eslint-disable-next-line react-hooks/exhaustive-deps
158
+ []);
159
+ var trackCoreEvent = trackEvent;
160
+ var logEvent = useCallback(function (level, message, properties) {
161
+ var _a, _b, _c;
162
+ try {
163
+ onLog === null || onLog === void 0 ? void 0 : onLog(level, message, __assign(__assign({}, properties), { flowId: flowId, stepId: (_b = (_a = stepRef.current) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : (_c = stepRef.current) === null || _c === void 0 ? void 0 : _c.key }));
164
+ }
165
+ catch (_d) { }
166
+ },
167
+ // eslint-disable-next-line react-hooks/exhaustive-deps
168
+ []);
169
+ var closeWithError = useCallback(function (error, analytics) {
170
+ trackCoreEvent('Failed', __assign({}, analytics));
171
+ onError(error);
172
+ },
173
+ // eslint-disable-next-line react-hooks/exhaustive-deps
174
+ []);
175
+ var onAction = useCallback(function (action) { return __awaiter(_this, void 0, void 0, function () {
176
+ var model, command, isFirstStep, genericErrorMessage, _a, errors, _b, refreshUrl, _c, errors, error_1;
177
+ var _d, _e, _f;
178
+ return __generator(this, function (_g) {
179
+ switch (_g.label) {
180
+ case 0:
181
+ _g.trys.push([0, 3, , 4]);
182
+ (_d = stepComponentRef.current) === null || _d === void 0 ? void 0 : _d.setLoadingState('loading');
183
+ return [4 /*yield*/, ((_e = stepComponentRef.current) === null || _e === void 0 ? void 0 : _e.getSubmittableValue())];
184
+ case 1:
185
+ model = (_f = (_g.sent())) !== null && _f !== void 0 ? _f : null;
186
+ return [4 /*yield*/, executeSubmission({
187
+ action: action,
188
+ model: model,
189
+ isInitial: stepRef.current === null,
190
+ httpClient: httpClient,
191
+ trackEvent: trackCoreEvent,
192
+ })];
193
+ case 2:
194
+ command = _g.sent();
195
+ switch (command.type) {
196
+ case 'complete': {
197
+ onCompletion(command.result);
198
+ trackCoreEvent('Succeeded');
199
+ break;
200
+ }
201
+ case 'replace-step': {
202
+ isFirstStep = stepRef.current === null;
203
+ initialiseWithStep(command.step, command.etag);
204
+ trackCoreEvent('Step Shown', { isFirstStep: isFirstStep });
205
+ break;
206
+ }
207
+ case 'error': {
208
+ genericErrorMessage = getErrorMessageFunctions().genericErrorWithRetry();
209
+ _a = command.body.errors, errors = _a === void 0 ? { error: genericErrorMessage } : _a;
210
+ if (stepRef.current) {
211
+ initialiseWithStep(__assign(__assign({}, stepRef.current), { errors: errors, model: model }), etagRef.current);
212
+ }
213
+ else {
214
+ closeWithError(new Error('Initial request failed'), {});
215
+ }
216
+ break;
217
+ }
218
+ case 'refresh': {
219
+ _b = command.body, refreshUrl = _b.refreshUrl, _c = _b.errors, errors = _c === void 0 ? {} : _c;
220
+ void onRefresh(undefined, refreshUrl, errors);
221
+ break;
222
+ }
223
+ }
224
+ return [3 /*break*/, 4];
225
+ case 3:
226
+ error_1 = _g.sent();
227
+ closeWithError(error_1);
228
+ return [3 /*break*/, 4];
229
+ case 4: return [2 /*return*/];
230
+ }
231
+ });
232
+ }); }, []);
233
+ var onRefresh = useCallback(function (schemaId, refreshUrl, errorsOverride) {
234
+ if (refreshUrl === void 0) { refreshUrl = ''; }
235
+ return __awaiter(_this, void 0, void 0, function () {
236
+ var model, command, errors, error_2;
237
+ var _a, _b, _c, _d;
238
+ return __generator(this, function (_e) {
239
+ switch (_e.label) {
240
+ case 0:
241
+ _e.trys.push([0, 3, , 4]);
242
+ (_a = stepComponentRef.current) === null || _a === void 0 ? void 0 : _a.setLoadingState('loading');
243
+ return [4 /*yield*/, ((_b = stepComponentRef.current) === null || _b === void 0 ? void 0 : _b.getSubmittableValue())];
244
+ case 1:
245
+ model = (_c = (_e.sent())) !== null && _c !== void 0 ? _c : null;
246
+ return [4 /*yield*/, executeRefresh({
247
+ abortSignal: abortCurrentAndGetNewAbortSignal(),
248
+ url: refreshUrl,
249
+ model: model,
250
+ schemaId: schemaId,
251
+ etag: etagRef.current,
252
+ httpClient: httpClient,
253
+ trackEvent: trackCoreEvent,
254
+ })];
255
+ case 2:
256
+ command = _e.sent();
257
+ switch (command.type) {
258
+ case 'refresh-step':
259
+ {
260
+ errors = errorsOverride !== null && errorsOverride !== void 0 ? errorsOverride : command.step.errors;
261
+ initialiseWithStep(__assign(__assign({}, command.step), { errors: errors }), command.etag);
262
+ }
263
+ break;
264
+ case 'error': {
265
+ closeWithError(new Error('Failed to refresh'), command.body.analytics);
266
+ break;
267
+ }
268
+ case 'noop':
269
+ (_d = stepComponentRef.current) === null || _d === void 0 ? void 0 : _d.setLoadingState('idle');
270
+ break;
271
+ }
272
+ return [3 /*break*/, 4];
273
+ case 3:
274
+ error_2 = _e.sent();
275
+ closeWithError(error_2, undefined);
276
+ return [3 /*break*/, 4];
277
+ case 4: return [2 /*return*/];
278
+ }
279
+ });
280
+ });
281
+ },
282
+ // eslint-disable-next-line react-hooks/exhaustive-deps
283
+ []);
284
+ return { stepComponentRef: stepComponentRef };
285
+ }
@@ -11,6 +11,9 @@ export var isRepeatableComponent = function (component) { return Object.hasOwnPr
11
11
  export var isObjectLocalValue = function (value) {
12
12
  return value != null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof File);
13
13
  };
14
+ export var isArrayLocalValue = function (value) {
15
+ return Array.isArray(value);
16
+ };
14
17
  export var isObjectModel = function (model) {
15
18
  return model != null && typeof model === 'object' && !Array.isArray(model);
16
19
  };
@@ -1,8 +1,9 @@
1
1
  export { makeHttpClient } from './common/makeHttpClient';
2
2
  export { default as translations } from './i18n';
3
3
  export type { Step, Model } from '@wise/dynamic-flow-types';
4
- export type { DynamicFlowWiseProps as DynamicFlowRevampProps, DynamicFlowWisePropsWithInitialAction as DynamicFlowRevampPropsWithInitialAction, DynamicFlowWisePropsWithInitialStep as DynamicFlowRevampPropsWithInitialStep, DynamicFlowController, } from './revamp/types';
4
+ export type { DynamicFlowWiseProps as DynamicFlowRevampProps, DynamicFlowWisePropsWithInitialAction as DynamicFlowRevampPropsWithInitialAction, DynamicFlowWisePropsWithInitialStep as DynamicFlowRevampPropsWithInitialStep, DynamicFragmentController, } from './revamp/types';
5
5
  export { default as DynamicFlowRevamp } from './revamp/DynamicFlowWise';
6
+ export { default as DynamicFragmentWise } from './revamp/DynamicFragmentWise';
6
7
  export type { DynamicFlowProps, InitialAction } from './legacy/dynamic-flow-types';
7
8
  export { convertStepToLayout, inlineReferences } from './legacy/step/layoutStep/utils';
8
9
  export { default as DynamicFlow } from './legacy/dynamicFlow';
@@ -23,4 +23,4 @@ export declare function isFileUploadSchema(schema: {
23
23
  }): schema is FileUploadSchema;
24
24
  export declare const isMultipleFileUploadSchema: (schema: Schema) => schema is MultipleFileUploadSchema;
25
25
  export declare const isMultiSelectConstSchema: (schema: Schema) => schema is MultiSelectSchema;
26
- export declare const getSchemaType: (schema: Schema) => "object" | "array" | "allOf" | "oneOf" | "persistAsync" | "readOnly" | "validationAsync" | "promotedOneOf" | "basic" | null;
26
+ export declare const getSchemaType: (schema: Schema) => "object" | "array" | "allOf" | "oneOf" | "persistAsync" | "validationAsync" | "readOnly" | "promotedOneOf" | "basic" | null;
@@ -1,6 +1,6 @@
1
1
  import { Align, Size } from '@wise/dynamic-flow-types';
2
2
  export { getNavigationOptionMedia } from './getNavigationOptionMedia';
3
- declare const getMargin: (size: Size | undefined) => "" | "m-b-0" | "m-b-1" | "m-b-2" | "m-b-3" | "m-b-5";
3
+ declare const getMargin: (size: Size | undefined) => "" | "m-b-2" | "m-b-3" | "m-b-0" | "m-b-1" | "m-b-5";
4
4
  declare const getTextAlignmentAndMargin: (component: {
5
5
  align?: Align;
6
6
  margin?: Size;
@@ -1,4 +1,2 @@
1
- /// <reference types="react" />
2
- import type { DynamicFlowCoreProps, DynamicFlowController } from './types';
3
- declare const DynamicFlowCore: import("react").ForwardRefExoticComponent<DynamicFlowCoreProps & import("react").RefAttributes<DynamicFlowController>>;
4
- export default DynamicFlowCore;
1
+ import type { DynamicFlowCoreProps } from './types';
2
+ export declare function DynamicFlowCore(props: DynamicFlowCoreProps): JSX.Element;
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
- import type { DynamicFlowWiseProps, DynamicFlowController } from './types';
3
- declare const DynamicFragmentWise: import("react").ForwardRefExoticComponent<DynamicFlowWiseProps & import("react").RefAttributes<DynamicFlowController>>;
4
- export default DynamicFragmentWise;
1
+ import type { DynamicFlowWiseProps } from './types';
2
+ declare function DynamicFlowWise(props: DynamicFlowWiseProps): JSX.Element;
3
+ export default DynamicFlowWise;
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ import type { DynamicFlowWiseProps, DynamicFragmentController } from './types';
3
+ import type { OnValueChange } from './domain/types';
4
+ /**
5
+ * DynamicFragmentWise is like DynamicFlowWise, but it also accepts a ForwardedRef.
6
+ * This ref conforms to the DynamicFragmentController type, containing two functions: `getValue` and `validate`.
7
+ * @experimental This component may be changed in the future without notice.
8
+ */
9
+ declare const DynamicFragmentWise: import("react").ForwardRefExoticComponent<(DynamicFlowWiseProps & {
10
+ onValueChange?: OnValueChange | undefined;
11
+ }) & import("react").RefAttributes<DynamicFragmentController>>;
12
+ export default DynamicFragmentWise;
@@ -15,8 +15,14 @@ type MakeOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
15
15
  export type DynamicFlowWisePropsWithInitialAction = MakeOptional<DynamicFlowCorePropsWithInitialAction, 'renderers'>;
16
16
  export type DynamicFlowWisePropsWithInitialStep = MakeOptional<DynamicFlowCorePropsWithInitialStep, 'renderers'>;
17
17
  export type DynamicFlowWiseProps = DynamicFlowWisePropsWithInitialAction | DynamicFlowWisePropsWithInitialStep;
18
- export type DynamicFlowController = {
18
+ export type DynamicFragmentController = {
19
+ /**
20
+ * Returns the current value of the form, even if it doesn't pass validation.
21
+ */
19
22
  getValue: () => Promise<JsonElement>;
23
+ /**
24
+ * triggers validation in every UI component and returns whether or not the current value is valid.
25
+ */
20
26
  validate: () => boolean;
21
27
  };
22
28
  export type InitialAction = {
@@ -0,0 +1,11 @@
1
+ /// <reference types="react" />
2
+ import type { StepDomainComponent } from './domain/components/StepDomainComponent';
3
+ import type { OnValueChange } from './domain/types';
4
+ import type { DynamicFlowCoreProps } from './types';
5
+ type UseDynamicFlowCoreProps = Omit<DynamicFlowCoreProps, 'renderers'> & {
6
+ onValueChange?: OnValueChange;
7
+ };
8
+ export declare function useDynamicFlowCore(props: UseDynamicFlowCoreProps): {
9
+ stepComponentRef: import("react").MutableRefObject<StepDomainComponent | null>;
10
+ };
11
+ export {};
@@ -1,8 +1,8 @@
1
- import type { AllOfSchema, ArraySchema, ArraySchemaList, ArraySchemaTuple, BooleanSchema, ConstSchema, IntegerSchema, Model, NumberSchema, ObjectSchema, OneOfSchema, Schema, StringSchema, BlobSchema } from '@wise/dynamic-flow-types/build/next';
2
- import type { LocalValue, LocalValueObject, DomainComponent } from '../domain/types';
1
+ import type { AllOfSchema, ArraySchema, ArraySchemaList, ArraySchemaTuple, BlobSchema, BooleanSchema, ConstSchema, IntegerSchema, Model, NumberSchema, ObjectSchema, OneOfSchema, Schema, StringSchema } from '@wise/dynamic-flow-types/build/next';
2
+ import type { PersistAsync } from '@wise/dynamic-flow-types/build/next/feature/PersistAsync';
3
3
  import type { ColumnsComponent } from '../domain/components/ColumnsComponent';
4
4
  import type { RepeatableComponent } from '../domain/components/repeatableComponent/RepeatableComponent';
5
- import type { PersistAsync } from '@wise/dynamic-flow-types/build/next/feature/PersistAsync';
5
+ import type { DomainComponent, LocalValue, LocalValueArray, LocalValueObject } from '../domain/types';
6
6
  type SchemaWithPersistAsync = (ArraySchemaList | ArraySchemaTuple | BooleanSchema | IntegerSchema | NumberSchema | StringSchema) & {
7
7
  persistAsync: PersistAsync;
8
8
  };
@@ -23,6 +23,7 @@ export declare const isHiddenComponent: (component: DomainComponent) => componen
23
23
  };
24
24
  export declare const isRepeatableComponent: (component: DomainComponent) => component is RepeatableComponent;
25
25
  export declare const isObjectLocalValue: (value: LocalValue) => value is LocalValueObject;
26
+ export declare const isArrayLocalValue: (value: LocalValue) => value is LocalValueArray;
26
27
  export declare const isObjectModel: (model: Model) => model is Record<string, import("@wise/dynamic-flow-types/build/next").JsonElement>;
27
28
  export declare const isArrayModel: (model: Model) => model is import("@wise/dynamic-flow-types/build/next").JsonElement[];
28
29
  export declare const isAllOfSchema: (schema: Schema) => schema is AllOfSchema;
@@ -1,5 +1,5 @@
1
1
  import type { Align, Size } from '../../../renderers/types';
2
- declare const getMargin: (size: Size) => "" | "m-b-0" | "m-b-1" | "m-b-2" | "m-b-3" | "m-b-5";
2
+ declare const getMargin: (size: Size) => "" | "m-b-2" | "m-b-3" | "m-b-0" | "m-b-1" | "m-b-5";
3
3
  declare const getTextAlignmentAndMargin: (component: {
4
4
  align: Align;
5
5
  margin: Size;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wise/dynamic-flow-client",
3
- "version": "3.9.0-experimental-bd037e3",
3
+ "version": "3.9.0-experimental-90bdf26",
4
4
  "description": "Dynamic Flow web client",
5
5
  "license": "Apache-2.0",
6
6
  "main": "./build/main.min.js",