@wise/dynamic-flow-client 3.4.1 → 3.5.0-experimental-b041af5

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.
Files changed (134) hide show
  1. package/build/common/httpClientContext/HttpClientContext.js +35 -0
  2. package/build/common/httpClientContext/index.js +1 -0
  3. package/build/common/makeHttpClient/index.js +1 -0
  4. package/build/common/makeHttpClient/makeHttpClient.js +34 -0
  5. package/build/common/messages/generic-error.messages.js +18 -0
  6. package/build/common/messages/help.messages.js +8 -0
  7. package/build/common/messages/multi-file-upload.messages.js +18 -0
  8. package/build/common/messages/multi-select.messages.js +8 -0
  9. package/build/common/messages/paragraph.messages.js +13 -0
  10. package/build/common/messages/repeatable.messages.js +23 -0
  11. package/build/common/messages/validation.array.messages.js +13 -0
  12. package/build/common/messages/validation.messages.js +53 -0
  13. package/build/common/utils/api-utils.js +4 -0
  14. package/build/legacy/common/constants/DateMode.js +4 -0
  15. package/build/legacy/common/constants/FeatureName.js +4 -0
  16. package/build/legacy/common/constants/FormControlType.js +21 -0
  17. package/build/legacy/common/constants/MonthFormat.js +4 -0
  18. package/build/legacy/common/constants/Size.js +7 -0
  19. package/build/legacy/common/constants/index.js +4 -0
  20. package/build/legacy/common/contexts/dynamicFlowContexts/DynamicFlowContexts.js +36 -0
  21. package/build/legacy/common/contexts/dynamicFlowContexts/usePendingPromiseCounter.js +13 -0
  22. package/build/legacy/common/contexts/eventsContext/EventsContext.js +38 -0
  23. package/build/legacy/common/contexts/featureContext/FeatureContext.js +22 -0
  24. package/build/legacy/common/contexts/index.js +3 -0
  25. package/build/legacy/common/contexts/logContext/LogContext.js +44 -0
  26. package/build/legacy/common/hooks/index.js +7 -0
  27. package/build/legacy/common/hooks/useDebouncedFunction/useDebouncedFunction.js +9 -0
  28. package/build/legacy/common/hooks/useExternal/useExternal.js +15 -0
  29. package/build/legacy/common/hooks/useExternalStepPolling/useExternalStepPolling.js +70 -0
  30. package/build/legacy/common/hooks/usePersistAsync/usePersistAsync.js +172 -0
  31. package/build/legacy/common/hooks/usePolling/usePolling.js +51 -0
  32. package/build/legacy/common/hooks/usePrevious/usePrevious.js +8 -0
  33. package/build/legacy/common/hooks/useStepPolling/useStepPolling.js +43 -0
  34. package/build/legacy/common/messages.js +8 -0
  35. package/build/legacy/common/utils/api-utils.js +6 -0
  36. package/build/legacy/common/utils/date-utils.js +22 -0
  37. package/build/legacy/common/utils/debounce.js +38 -0
  38. package/build/legacy/common/utils/file-utils.js +45 -0
  39. package/build/legacy/common/utils/id-utils.js +5 -0
  40. package/build/legacy/common/utils/index.js +11 -0
  41. package/build/legacy/common/utils/is-equal.js +21 -0
  42. package/build/legacy/common/utils/misc-utils.js +4 -0
  43. package/build/legacy/common/utils/mobile-utils.js +23 -0
  44. package/build/legacy/common/utils/model-utils.js +33 -0
  45. package/build/legacy/common/utils/schema-utils.js +113 -0
  46. package/build/legacy/common/utils/step-utils.js +32 -0
  47. package/build/legacy/common/validators/index.js +5 -0
  48. package/build/legacy/common/validators/models/model-utils.js +119 -0
  49. package/build/legacy/common/validators/models/model-validators.js +62 -0
  50. package/build/legacy/common/validators/schemas/schema-validators.js +101 -0
  51. package/build/legacy/common/validators/types/type-validators.js +14 -0
  52. package/build/legacy/common/validators/validationFailures/validation-failures.js +139 -0
  53. package/build/legacy/common/validators/validationFailures/validation-failures.utils.js +40 -0
  54. package/build/legacy/common/validators/values/value-validators.js +6 -0
  55. package/build/legacy/dynamic-flow-types.js +1 -0
  56. package/build/legacy/formControl/FormControl.js +266 -0
  57. package/build/legacy/formControl/index.js +1 -0
  58. package/build/legacy/formControl/utils/getAutocompleteString.js +80 -0
  59. package/build/legacy/formControl/utils/index.js +2 -0
  60. package/build/legacy/formControl/utils/value-utils.js +108 -0
  61. package/build/legacy/jsonSchemaForm/allOfSchema/AllOfSchema.js +50 -0
  62. package/build/legacy/jsonSchemaForm/allOfSchema/index.js +1 -0
  63. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multiSelectSchema/MultiSelectSchema.js +84 -0
  64. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multipleFileUploadSchema/MultipleFileUploadSchema.js +141 -0
  65. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multipleFileUploadSchema/index.js +1 -0
  66. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multipleFileUploadSchema/utils/index.js +2 -0
  67. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multipleFileUploadSchema/utils/upload-utils.js +79 -0
  68. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multipleFileUploadSchema/utils/useFormattedDefaultErrorMessages.js +14 -0
  69. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/repeatableSchema/ItemSummary.js +7 -0
  70. package/build/legacy/jsonSchemaForm/basicTypeSchema/BasicTypeSchema.js +111 -0
  71. package/build/legacy/jsonSchemaForm/basicTypeSchema/index.js +1 -0
  72. package/build/legacy/jsonSchemaForm/controlFeedback/ControlFeedback.js +86 -0
  73. package/build/legacy/jsonSchemaForm/controlFeedback/index.js +1 -0
  74. package/build/legacy/jsonSchemaForm/help/Help.js +20 -0
  75. package/build/legacy/jsonSchemaForm/help/index.js +1 -0
  76. package/build/legacy/jsonSchemaForm/persistAsyncSchema/persistAsyncBasicSchema/PersistAsyncBasicSchema.js +165 -0
  77. package/build/legacy/jsonSchemaForm/schemaFormControl/SchemaFormControl.js +133 -0
  78. package/build/legacy/jsonSchemaForm/schemaFormControl/index.js +1 -0
  79. package/build/legacy/jsonSchemaForm/schemaFormControl/utils/index.js +1 -0
  80. package/build/legacy/jsonSchemaForm/schemaFormControl/utils/mapping-utils.js +107 -0
  81. package/build/legacy/layout/DynamicLayout.js +68 -0
  82. package/build/legacy/layout/alert/DynamicAlert.js +29 -0
  83. package/build/legacy/layout/box/DynamicBox.js +41 -0
  84. package/build/legacy/layout/button/DynamicButton.js +27 -0
  85. package/build/legacy/layout/button/utils.js +45 -0
  86. package/build/legacy/layout/columns/DynamicColumns.js +38 -0
  87. package/build/legacy/layout/decision/DynamicDecision.js +21 -0
  88. package/build/legacy/layout/divider/DynamicDivider.js +9 -0
  89. package/build/legacy/layout/external/DynamicExternal.js +32 -0
  90. package/build/legacy/layout/external/DynamicExternal.messages.js +8 -0
  91. package/build/legacy/layout/form/DynamicForm.js +22 -0
  92. package/build/legacy/layout/heading/DynamicHeading.js +51 -0
  93. package/build/legacy/layout/icon/DynamicIcon.js +17 -0
  94. package/build/legacy/layout/icon/FlagIcon.js +198 -0
  95. package/build/legacy/layout/icon/NamedIcon.js +19 -0
  96. package/build/legacy/layout/image/DynamicImage.js +111 -0
  97. package/build/legacy/layout/index.js +20 -0
  98. package/build/legacy/layout/instructions/DynamicInstructions.js +30 -0
  99. package/build/legacy/layout/list/DynamicStatusList.js +37 -0
  100. package/build/legacy/layout/loadingIndicator/DynamicLoadingIndicator.js +11 -0
  101. package/build/legacy/layout/markdown/DynamicMarkdown.js +23 -0
  102. package/build/legacy/layout/modal/DynamicModal.js +26 -0
  103. package/build/legacy/layout/paragraph/DynamicParagraph.js +46 -0
  104. package/build/legacy/layout/paragraph/useSnackBarIfAvailable.js +9 -0
  105. package/build/legacy/layout/review/DynamicReview.js +58 -0
  106. package/build/legacy/layout/search/DynamicSearch.js +58 -0
  107. package/build/legacy/layout/search/SearchInput.js +17 -0
  108. package/build/legacy/layout/search/SearchResults.js +31 -0
  109. package/build/legacy/layout/search/useSearch.js +137 -0
  110. package/build/legacy/layout/utils/getNavigationOptionMedia.js +28 -0
  111. package/build/legacy/layout/utils/index.js +32 -0
  112. package/build/legacy/step/cameraStep/cameraCapture/CameraCapture.messages.js +58 -0
  113. package/build/legacy/step/cameraStep/cameraCapture/components/bottomBar/BottomBar.js +28 -0
  114. package/build/legacy/step/cameraStep/cameraCapture/components/index.js +3 -0
  115. package/build/legacy/step/cameraStep/cameraCapture/components/orientationLockOverlay/OrientationLockOverlay.js +19 -0
  116. package/build/legacy/step/cameraStep/cameraCapture/components/orientationLockOverlay/OrientationLockOverlay.messages.js +8 -0
  117. package/build/legacy/step/cameraStep/cameraCapture/types/index.js +7 -0
  118. package/build/legacy/step/layoutStep/LayoutStep.js +33 -0
  119. package/build/legacy/step/layoutStep/index.js +1 -0
  120. package/build/legacy/step/layoutStep/utils/index.js +2 -0
  121. package/build/legacy/step/layoutStep/utils/inline-reference-utils.js +105 -0
  122. package/build/legacy/step/layoutStep/utils/layout-utils.js +212 -0
  123. package/build/main.js +4771 -225
  124. package/build/main.min.js +1 -1
  125. package/build/main.mjs +4772 -226
  126. package/build/types/legacy/step/externalConfirmationStep/ExternalConfirmationStep.d.ts +1 -1
  127. package/build/types/revamp/domain/components/StepDomainComponent.d.ts +4 -2
  128. package/build/types/revamp/renderers/step/ExternalConfirmationDialog.d.ts +6 -0
  129. package/build/types/revamp/renderers/{StepRenderer.d.ts → step/StepRenderer.d.ts} +1 -1
  130. package/build/types/revamp/renderers/step/useExternal.d.ts +4 -0
  131. package/build/types/revamp/renderers/stepComponentToProps.d.ts +1 -1
  132. package/build/types/revamp/renderers/types.d.ts +3 -0
  133. package/package.json +13 -13
  134. /package/build/types/{legacy/step/externalConfirmationStep/ExternalConfirmationStep.messages.d.ts → common/messages/external-confirmation.messages.d.ts} +0 -0
@@ -0,0 +1,58 @@
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
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { useMemo, useState } from 'react';
14
+ import { useEventDispatcher } from '../../common/contexts';
15
+ import { debounce } from '../../common/utils';
16
+ import DynamicLoadingIndicator from '../loadingIndicator/DynamicLoadingIndicator';
17
+ import { getMargin } from '../utils';
18
+ import { SearchInput } from './SearchInput';
19
+ import { ErrorResult, SearchResults } from './SearchResults';
20
+ import { useSearch } from './useSearch';
21
+ var DEBOUNCE_TIME = 400;
22
+ function DynamicSearch(_a) {
23
+ var component = _a.component, onAction = _a.onAction;
24
+ var _b = useState(''), query = _b[0], setQuery = _b[1];
25
+ var title = component.title, margin = component.margin, url = component.url, method = component.method, param = component.param, emptyMessage = component.emptyMessage;
26
+ var _c = useSearch({ url: url, method: method, param: param }), status = _c.status, results = _c.results, search = _c.search;
27
+ var onEvent = useEventDispatcher();
28
+ var debouncedSearch = useMemo(function () { return debounce(search, DEBOUNCE_TIME); }, [search]);
29
+ var onSearchStart = function () {
30
+ onEvent('Dynamic Flow - Search Started', {});
31
+ };
32
+ var onChange = function (value) {
33
+ setQuery(value);
34
+ debouncedSearch(value);
35
+ };
36
+ var onResultSelected = function (_a) {
37
+ var type = _a.type, value = _a.value;
38
+ if (type === 'action') {
39
+ onEvent('Dynamic Flow - Search Result Selected', {
40
+ type: 'action',
41
+ actionId: value.id || value.$id
42
+ });
43
+ onAction(value);
44
+ }
45
+ if (type === 'search') {
46
+ setQuery(value.query);
47
+ var url_1 = value.url, method_1 = value.method, param_1 = value.param, query_1 = value.query;
48
+ onEvent('Dynamic Flow - Search Result Selected', { type: 'search' });
49
+ void search(query_1, { url: url_1, method: method_1, param: param_1 });
50
+ }
51
+ };
52
+ var onRetrySearch = function () {
53
+ setQuery(query);
54
+ void search(query);
55
+ };
56
+ return (_jsxs("div", __assign({ className: getMargin(margin || 'md') }, { children: [_jsx(SearchInput, { title: title, value: query, onChange: onChange, onFocus: onSearchStart }), status === 'loading' && (_jsx(DynamicLoadingIndicator, { component: { type: 'loading-indicator', size: 'sm' } })), status === 'error' && _jsx(ErrorResult, { onRetrySearch: onRetrySearch }), status === 'success' && (_jsx(SearchResults, { results: results, emptyMessage: emptyMessage, onSelect: onResultSelected }))] })));
57
+ }
58
+ export default DynamicSearch;
@@ -0,0 +1,17 @@
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
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { Input } from '@transferwise/components';
14
+ export var SearchInput = function (_a) {
15
+ var title = _a.title, value = _a.value, onFocus = _a.onFocus, onChange = _a.onChange;
16
+ return (_jsxs("label", __assign({ className: "control-label d-inline" }, { children: [title, _jsx(Input, { type: "text", value: value, className: "m-t-1", onFocus: onFocus, onChange: function (event) { return onChange(event.currentTarget.value); } })] })));
17
+ };
@@ -0,0 +1,31 @@
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
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { NavigationOption, NavigationOptionsList } from '@transferwise/components';
14
+ import { useIntl } from 'react-intl';
15
+ import messages from '../../../common/messages/generic-error.messages';
16
+ import { getNavigationOptionMedia } from '../utils';
17
+ export function SearchResults(_a) {
18
+ var results = _a.results, emptyMessage = _a.emptyMessage, onSelect = _a.onSelect;
19
+ if (results.length === 0) {
20
+ return _jsx("p", __assign({ className: "m-t-2" }, { children: emptyMessage }));
21
+ }
22
+ return (_jsx(NavigationOptionsList, { children: results.map(function (result) { return (_jsx(NavigationOption, { title: result.title, content: result.description, media: getNavigationOptionMedia(result), showMediaCircle: false, showMediaAtAllSizes: true, onClick: function () { return onSelect(result); } }, JSON.stringify(result))); }) }));
23
+ }
24
+ export function ErrorResult(_a) {
25
+ var onRetrySearch = _a.onRetrySearch;
26
+ var intl = useIntl();
27
+ return (_jsxs("p", __assign({ className: "m-t-2" }, { children: [intl.formatMessage(messages.genericError), "\u00A0", _jsx("a", __assign({ href: "/", onClick: function (e) {
28
+ e.preventDefault();
29
+ onRetrySearch();
30
+ } }, { children: intl.formatMessage(messages.retry) }))] })));
31
+ }
@@ -0,0 +1,137 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ 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;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import { useCallback, useRef, useState } from 'react';
38
+ import { isArray, isObject } from '../../common/validators';
39
+ import { useHttpClient } from '../../../common/httpClientContext';
40
+ var headers = { 'Content-Type': 'application/json' };
41
+ export var useSearch = function (defaultSearchConfig) {
42
+ var _a = useState({
43
+ status: 'idle'
44
+ }), state = _a[0], setState = _a[1];
45
+ var abortControllerRef = useRef(null);
46
+ var httpClient = useHttpClient();
47
+ var search = useCallback(function (query, _a) {
48
+ var _b = _a === void 0 ? defaultSearchConfig : _a, url = _b.url, method = _b.method, param = _b.param;
49
+ return __awaiter(void 0, void 0, void 0, function () {
50
+ var signal, request, response, error_1;
51
+ var _c;
52
+ var _d;
53
+ return __generator(this, function (_e) {
54
+ switch (_e.label) {
55
+ case 0:
56
+ (_d = abortControllerRef.current) === null || _d === void 0 ? void 0 : _d.abort();
57
+ if (!query) {
58
+ setState({ status: 'idle' });
59
+ return [2 /*return*/];
60
+ }
61
+ abortControllerRef.current = new AbortController();
62
+ signal = abortControllerRef.current.signal;
63
+ setState({ status: 'loading' });
64
+ _e.label = 1;
65
+ case 1:
66
+ _e.trys.push([1, 3, , 4]);
67
+ request = method === 'GET'
68
+ ? httpClient(addQueryParameter(url, param, query), {
69
+ method: method,
70
+ signal: signal,
71
+ headers: headers
72
+ })
73
+ : httpClient(url, {
74
+ method: method,
75
+ signal: signal,
76
+ headers: headers,
77
+ body: JSON.stringify((_c = {}, _c[param] = query, _c))
78
+ });
79
+ return [4 /*yield*/, request];
80
+ case 2:
81
+ response = _e.sent();
82
+ void handleResponse(response, query);
83
+ return [3 /*break*/, 4];
84
+ case 3:
85
+ error_1 = _e.sent();
86
+ handleError(error_1, query);
87
+ return [3 /*break*/, 4];
88
+ case 4: return [2 /*return*/];
89
+ }
90
+ });
91
+ });
92
+ },
93
+ // eslint-disable-next-line react-hooks/exhaustive-deps
94
+ [httpClient, JSON.stringify(defaultSearchConfig)]);
95
+ var handleResponse = function (response, query) { return __awaiter(void 0, void 0, void 0, function () {
96
+ var body;
97
+ return __generator(this, function (_a) {
98
+ switch (_a.label) {
99
+ case 0:
100
+ if (!response.ok) return [3 /*break*/, 2];
101
+ return [4 /*yield*/, response.json()["catch"](function () { return null; })];
102
+ case 1:
103
+ body = _a.sent();
104
+ if (isValidResponseBody(body)) {
105
+ setState({ status: 'success', results: body.results });
106
+ return [2 /*return*/];
107
+ }
108
+ _a.label = 2;
109
+ case 2:
110
+ setState({ status: 'error' });
111
+ return [2 /*return*/];
112
+ }
113
+ });
114
+ }); };
115
+ var handleError = function (error, query) {
116
+ if (!isAbortError(error)) {
117
+ setState({ status: 'error' });
118
+ }
119
+ };
120
+ var results = state.status === 'success' ? state.results : [];
121
+ return { status: state.status, results: results, search: search };
122
+ };
123
+ var isValidResponseBody = function (body) {
124
+ return isObject(body) &&
125
+ 'results' in body &&
126
+ isArray(body.results) &&
127
+ body.results.every(function (result) { return isObject(result) && 'title' in result && 'type' in result && 'value' in result; });
128
+ };
129
+ var isAbortError = function (error) {
130
+ return error instanceof DOMException && error.name === 'AbortError';
131
+ };
132
+ var addQueryParameter = function (url, key, value) {
133
+ var _a = url.split('?'), urlBase = _a[0], urlQuery = _a[1];
134
+ var urlQueryParams = new URLSearchParams(urlQuery);
135
+ urlQueryParams.set(key, value);
136
+ return "".concat(urlBase, "?").concat(urlQueryParams.toString());
137
+ };
@@ -0,0 +1,28 @@
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
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ import { Avatar, AvatarType } from '@transferwise/components';
14
+ import DynamicIcon from '../icon/DynamicIcon';
15
+ export var getNavigationOptionMedia = function (_a) {
16
+ var icon = _a.icon, image = _a.image;
17
+ if (icon === null || icon === void 0 ? void 0 : icon.name) {
18
+ return (_jsx(Avatar, __assign({ type: AvatarType.ICON }, { children: _jsx(DynamicIcon, { type: icon.name }) })));
19
+ }
20
+ if (icon === null || icon === void 0 ? void 0 : icon.text) {
21
+ return _jsx(Avatar, __assign({ type: AvatarType.INITIALS }, { children: icon.text }));
22
+ }
23
+ if (image === null || image === void 0 ? void 0 : image.url) {
24
+ var url = image.url, text = image.text;
25
+ return _jsx("img", { src: url, alt: text });
26
+ }
27
+ return null;
28
+ };
@@ -0,0 +1,32 @@
1
+ export { getNavigationOptionMedia } from './getNavigationOptionMedia';
2
+ var getMargin = function (size) {
3
+ switch (size) {
4
+ case 'xs':
5
+ return 'm-b-0';
6
+ case 'sm':
7
+ return 'm-b-1';
8
+ case 'md':
9
+ return 'm-b-2';
10
+ case 'lg':
11
+ return 'm-b-3';
12
+ case 'xl':
13
+ return 'm-b-5';
14
+ default:
15
+ return '';
16
+ }
17
+ };
18
+ var getTextAlignment = function (align) {
19
+ switch (align) {
20
+ case 'right':
21
+ return 'text-xs-right';
22
+ case 'center':
23
+ return 'text-xs-center';
24
+ case 'left':
25
+ default:
26
+ return '';
27
+ }
28
+ };
29
+ var getTextAlignmentAndMargin = function (component) {
30
+ return "".concat(getTextAlignment(component.align), " ").concat(getMargin(component.margin));
31
+ };
32
+ export { getMargin, getTextAlignmentAndMargin };
@@ -0,0 +1,58 @@
1
+ import { defineMessages } from 'react-intl';
2
+ export default defineMessages({
3
+ reviewSubmit: {
4
+ id: 'dynamicFlows.CameraCapture.reviewSubmit',
5
+ defaultMessage: 'Yes, submit',
6
+ description: 'Accept and submit the image taken with the camera'
7
+ },
8
+ reviewRetry: {
9
+ id: 'dynamicFlows.CameraCapture.reviewRetry',
10
+ defaultMessage: 'No, try again',
11
+ description: "Image taken with camera is not good, don't submit, and retake the image"
12
+ },
13
+ reviewInstructions: {
14
+ id: 'dynamicFlows.CameraCapture.reviewInstructions',
15
+ defaultMessage: 'Is your picture clear, readable and complete?',
16
+ description: 'After taking an image with the camera, prompt user to review the image'
17
+ },
18
+ cameraNotSupportedTitle: {
19
+ id: 'dynamicFlows.CameraCapture.CameraNotSupported.title',
20
+ defaultMessage: 'Camera not supported',
21
+ description: 'Title of standalone page prompting that camera is not available on users browser'
22
+ },
23
+ cameraNotSupportedParagraph: {
24
+ id: 'dynamicFlows.CameraCapture.CameraNotSupported.paragraph',
25
+ defaultMessage: "The browser you're using doesn't have support for a camera. Try a different browser, device, or download our mobile app.",
26
+ description: "Further text of standalone page prompting that camera is not available on user's browser"
27
+ },
28
+ noCameraAccessTitle: {
29
+ id: 'dynamicFlows.CameraCapture.NoCameraAccess.title',
30
+ defaultMessage: "We can't access your camera",
31
+ description: 'Title of standalone page prompting missing camera permissions'
32
+ },
33
+ noCameraAccessParagraph: {
34
+ id: 'dynamicFlows.CameraCapture.NoCameraAccess.paragraph',
35
+ defaultMessage: "Enable camera access in your browser's settings to get going again.",
36
+ description: 'Further text of standalone page prompting missing camera permissions'
37
+ },
38
+ noCameraAccessAction: {
39
+ id: 'dynamicFlows.CameraCapture.NoCameraAccess.action',
40
+ defaultMessage: 'Enable camera access',
41
+ description: 'Action to ask for camera permissions again'
42
+ },
43
+ cameraConnectionIssueTitle: {
44
+ id: 'dynamicFlows.CameraCapture.CameraConnectionIssue.title',
45
+ defaultMessage: "We can't access your camera",
46
+ description: 'Title of standalone page prompting that there was an issue connecting to a camera'
47
+ },
48
+ cameraConnectionIssueParagraph: {
49
+ id: 'dynamicFlows.CameraCapture.CameraConnectionIssue.paragraph',
50
+ defaultMessage: "Please check if it is connected and try again.",
51
+ description: 'Further text of standalone page prompting that there was an issue connecting to a camera'
52
+ },
53
+ cameraConnectionIssueAction: {
54
+ id: 'dynamicFlows.CameraCapture.CameraConnectionIssue.action',
55
+ defaultMessage: 'Try again',
56
+ description: 'Action to try using camera again'
57
+ }
58
+ });
@@ -0,0 +1,28 @@
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
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { Button, ControlType, Priority, Size } from '@transferwise/components';
14
+ import { useIntl } from 'react-intl';
15
+ import messages from '../../CameraCapture.messages';
16
+ export var CaptureBottomBar = function (_a) {
17
+ var onCapture = _a.onCapture;
18
+ return (_jsx("div", __assign({ className: "bottom-bar" }, { children: _jsx(CaptureButton, { onClick: onCapture }) })));
19
+ };
20
+ export var ReviewBottomBar = function (_a) {
21
+ var onSubmit = _a.onSubmit, onRetry = _a.onRetry;
22
+ var intl = useIntl();
23
+ return (_jsx("div", __assign({ className: "bottom-bar p-x-2" }, { children: _jsx("div", __assign({ className: "row" }, { children: _jsxs("div", __assign({ className: "col-xs-12 col-md-6 col-md-offset-3" }, { children: [_jsx(Button, __assign({ className: "m-b-1", block: true, size: Size.MEDIUM, type: ControlType.ACCENT, onClick: onSubmit }, { children: intl.formatMessage(messages.reviewSubmit) })), _jsx(Button, __assign({ className: "m-b-2", block: true, size: Size.MEDIUM, type: ControlType.ACCENT, priority: Priority.SECONDARY, onClick: onRetry }, { children: intl.formatMessage(messages.reviewRetry) }))] })) })) })));
24
+ };
25
+ var CaptureButton = function (_a) {
26
+ var onClick = _a.onClick;
27
+ return (_jsx("button", __assign({ type: "button", className: "camera-capture-btn m-b-2", "data-testid": "camera-capture-button", onClick: onClick }, { children: _jsx("span", { className: "camera-capture-btn-inner" }) })));
28
+ };
@@ -0,0 +1,3 @@
1
+ export { CaptureBottomBar } from './bottomBar/BottomBar';
2
+ export { ReviewBottomBar } from './bottomBar/BottomBar';
3
+ export { default as OrientationLockOverlay } from './orientationLockOverlay/OrientationLockOverlay';
@@ -0,0 +1,19 @@
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
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { useIntl } from 'react-intl';
14
+ import messages from './OrientationLockOverlay.messages';
15
+ function OrientationLockOverlay() {
16
+ var intl = useIntl();
17
+ return (_jsxs("div", __assign({ className: "orientation-lock-overlay" }, { children: [_jsx("img", { className: "m-b-3", src: "https://wise.com/public-resources/assets/camera-guidelines/icon-rotate-phone.svg", width: "96", height: "96", alt: "" }), _jsx("p", __assign({ className: "text-center m-b-0" }, { children: intl.formatMessage(messages.text) }))] })));
18
+ }
19
+ export default OrientationLockOverlay;
@@ -0,0 +1,8 @@
1
+ import { defineMessages } from 'react-intl';
2
+ export default defineMessages({
3
+ text: {
4
+ id: 'dynamicFlows.CameraCapture.rotatePhone.text',
5
+ defaultMessage: 'Rotate your phone to portrait view to take a photo',
6
+ description: 'Prompt the user to rotate their phone from landscape to portrait mode when attempting to take a photo'
7
+ }
8
+ });
@@ -0,0 +1,7 @@
1
+ export var CameraMode;
2
+ (function (CameraMode) {
3
+ CameraMode["CAPTURE"] = "CAPTURE";
4
+ CameraMode["REVIEW"] = "REVIEW";
5
+ CameraMode["ERROR"] = "ERROR";
6
+ })(CameraMode || (CameraMode = {}));
7
+ ;
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useDynamicFlow, useEventDispatcher } from '../../common/contexts';
3
+ import { useStepPolling } from '../../common/hooks';
4
+ import { isEmpty } from '../../common/validators';
5
+ import { DynamicLayout } from '../../layout';
6
+ import { convertStepToLayout, inlineReferences } from './utils';
7
+ var getComponents = function (step, options) {
8
+ var _a;
9
+ if (isEmpty(step)) {
10
+ return [];
11
+ }
12
+ var layout = convertStepToLayout(step, options);
13
+ return inlineReferences({
14
+ layout: layout,
15
+ schemas: step.schemas || [],
16
+ actions: step.actions || [],
17
+ model: (_a = step.model) !== null && _a !== void 0 ? _a : null
18
+ });
19
+ };
20
+ var LayoutStep = function (props) {
21
+ var stepSpecification = props.stepSpecification, stepLayoutOptions = props.stepLayoutOptions, submitted = props.submitted, model = props.model, formErrors = props.formErrors, onModelChange = props.onModelChange;
22
+ var components = getComponents(stepSpecification, stepLayoutOptions);
23
+ var _a = useDynamicFlow(), loading = _a.loading, registerPersistAsyncPromise = _a.registerPersistAsyncPromise;
24
+ var onEvent = useEventDispatcher();
25
+ var onAction = !loading
26
+ ? props.onAction
27
+ : function () {
28
+ onEvent('Dynamic Flow - onAction supressed', { reason: 'LayoutStep - loading state' });
29
+ };
30
+ useStepPolling(stepSpecification.polling, onAction);
31
+ return (_jsx(DynamicLayout, { components: components, submitted: submitted, model: model, errors: formErrors, onAction: onAction, onModelChange: onModelChange, onPersistAsync: registerPersistAsyncPromise }));
32
+ };
33
+ export default LayoutStep;
@@ -0,0 +1 @@
1
+ export { default } from './LayoutStep';
@@ -0,0 +1,2 @@
1
+ export { convertStepToLayout } from './layout-utils';
2
+ export { inlineReferences } from './inline-reference-utils';
@@ -0,0 +1,105 @@
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
+ import { convertStepActionToDynamicAction } from './layout-utils';
13
+ export function inlineReferences(_a) {
14
+ var layout = _a.layout, schemas = _a.schemas, actions = _a.actions, model = _a.model;
15
+ if (!layout) {
16
+ return [];
17
+ }
18
+ if (!schemas) {
19
+ return layout;
20
+ }
21
+ return layout.map(function (component) {
22
+ if (component.type === 'form') {
23
+ return inlineFormSchema({ formComponent: component, schemas: schemas });
24
+ }
25
+ if (component.type === 'decision') {
26
+ return inlineDecisionActions({ decisionComponent: component, actions: actions });
27
+ }
28
+ if (component.type === 'button') {
29
+ return inlineAction({ actionComponent: component, actions: actions });
30
+ }
31
+ if (component.type === 'box') {
32
+ return __assign(__assign({}, component), { components: inlineReferences({ layout: component.components, schemas: schemas, actions: actions, model: model }) });
33
+ }
34
+ if (component.type === 'modal') {
35
+ return __assign(__assign({}, component), { components: inlineReferences({
36
+ layout: component.content.components,
37
+ schemas: schemas,
38
+ actions: actions,
39
+ model: model
40
+ }) });
41
+ }
42
+ if (component.type === 'columns') {
43
+ return __assign(__assign({}, component), { left: inlineReferences({ layout: component.left, schemas: schemas, actions: actions, model: model }), right: inlineReferences({ layout: component.right, schemas: schemas, actions: actions, model: model }) });
44
+ }
45
+ return component;
46
+ });
47
+ }
48
+ function inlineFormSchema(_a) {
49
+ var formComponent = _a.formComponent, schemas = _a.schemas;
50
+ if (formComponent.schemaId) {
51
+ return {
52
+ type: 'form',
53
+ margin: formComponent.margin,
54
+ schema: getSchemaById(schemas, formComponent.schemaId)
55
+ };
56
+ }
57
+ if (formComponent.schema && isReference(formComponent.schema) && formComponent.schema.$ref) {
58
+ return {
59
+ type: 'form',
60
+ margin: formComponent.margin,
61
+ schema: getSchemaById(schemas, formComponent.schema.$ref)
62
+ };
63
+ }
64
+ if (formComponent.schema && !isReference(formComponent.schema)) {
65
+ return __assign({}, formComponent);
66
+ }
67
+ throw new Error('Invalid form layout component. Missing "schema" or "schemaId" properties.');
68
+ }
69
+ function inlineDecisionActions(_a) {
70
+ var _b;
71
+ var decisionComponent = _a.decisionComponent, actions = _a.actions;
72
+ var newOptions = (_b = decisionComponent === null || decisionComponent === void 0 ? void 0 : decisionComponent.options) === null || _b === void 0 ? void 0 : _b.map(function (option) {
73
+ return option.action && isReference(option.action)
74
+ ? __assign(__assign({}, option), { action: getActionById(actions, option.action.$ref) }) : option;
75
+ });
76
+ return __assign(__assign({}, decisionComponent), { options: newOptions });
77
+ }
78
+ function inlineAction(_a) {
79
+ var _b;
80
+ var actionComponent = _a.actionComponent, actions = _a.actions;
81
+ if (actionComponent.action &&
82
+ isReference(actionComponent.action) &&
83
+ ((_b = actionComponent.action) === null || _b === void 0 ? void 0 : _b.$ref)) {
84
+ var newAction = getActionById(actions, actionComponent.action.$ref);
85
+ return convertStepActionToDynamicAction(newAction);
86
+ }
87
+ return actionComponent;
88
+ }
89
+ function getSchemaById(schemas, id) {
90
+ var schema = schemas.find(function (schema) { return schema.$id === id; });
91
+ if (!schema) {
92
+ throw new Error("Fatal Error. Schema not found. $id ".concat(id));
93
+ }
94
+ return schema;
95
+ }
96
+ function getActionById(actions, id) {
97
+ var action = actions.find(function (action) { return action.$id === id; });
98
+ if (!action) {
99
+ throw new Error("Fatal Error. Action not found. $id ".concat(id));
100
+ }
101
+ return action;
102
+ }
103
+ function isReference(block) {
104
+ return Object.hasOwnProperty.call(block, '$ref');
105
+ }