@wise/dynamic-flow-client 3.3.2 → 3.4.0-experimental-ed080a1

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 (168) 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/paragraph.messages.js +13 -0
  9. package/build/common/messages/repeatable.messages.js +23 -0
  10. package/build/common/messages/validation.array.messages.js +13 -0
  11. package/build/common/messages/validation.messages.js +53 -0
  12. package/build/common/utils/api-utils.js +4 -0
  13. package/build/legacy/common/constants/DateMode.js +4 -0
  14. package/build/legacy/common/constants/FeatureName.js +4 -0
  15. package/build/legacy/common/constants/FormControlType.js +21 -0
  16. package/build/legacy/common/constants/MonthFormat.js +4 -0
  17. package/build/legacy/common/constants/Size.js +7 -0
  18. package/build/legacy/common/constants/index.js +4 -0
  19. package/build/legacy/common/contexts/dynamicFlowContexts/DynamicFlowContexts.js +36 -0
  20. package/build/legacy/common/contexts/dynamicFlowContexts/usePendingPromiseCounter.js +13 -0
  21. package/build/legacy/common/contexts/eventsContext/EventsContext.js +38 -0
  22. package/build/legacy/common/contexts/featureContext/FeatureContext.js +22 -0
  23. package/build/legacy/common/contexts/index.js +3 -0
  24. package/build/legacy/common/contexts/logContext/LogContext.js +44 -0
  25. package/build/legacy/common/hooks/index.js +7 -0
  26. package/build/legacy/common/hooks/useDebouncedFunction/useDebouncedFunction.js +9 -0
  27. package/build/legacy/common/hooks/useExternal/useExternal.js +15 -0
  28. package/build/legacy/common/hooks/useExternalStepPolling/useExternalStepPolling.js +70 -0
  29. package/build/legacy/common/hooks/usePersistAsync/usePersistAsync.js +172 -0
  30. package/build/legacy/common/hooks/usePolling/usePolling.js +51 -0
  31. package/build/legacy/common/hooks/usePrevious/usePrevious.js +8 -0
  32. package/build/legacy/common/hooks/useStepPolling/useStepPolling.js +43 -0
  33. package/build/legacy/common/messages.js +8 -0
  34. package/build/legacy/common/utils/api-utils.js +6 -0
  35. package/build/legacy/common/utils/date-utils.js +22 -0
  36. package/build/legacy/common/utils/debounce.js +38 -0
  37. package/build/legacy/common/utils/file-utils.js +45 -0
  38. package/build/legacy/common/utils/id-utils.js +5 -0
  39. package/build/legacy/common/utils/index.js +11 -0
  40. package/build/legacy/common/utils/is-equal.js +21 -0
  41. package/build/legacy/common/utils/misc-utils.js +4 -0
  42. package/build/legacy/common/utils/mobile-utils.js +23 -0
  43. package/build/legacy/common/utils/model-utils.js +33 -0
  44. package/build/legacy/common/utils/schema-utils.js +97 -0
  45. package/build/legacy/common/utils/step-utils.js +32 -0
  46. package/build/legacy/common/validators/index.js +5 -0
  47. package/build/legacy/common/validators/models/model-utils.js +119 -0
  48. package/build/legacy/common/validators/models/model-validators.js +62 -0
  49. package/build/legacy/common/validators/schemas/schema-validators.js +101 -0
  50. package/build/legacy/common/validators/types/type-validators.js +14 -0
  51. package/build/legacy/common/validators/validationFailures/validation-failures.js +139 -0
  52. package/build/legacy/common/validators/validationFailures/validation-failures.utils.js +40 -0
  53. package/build/legacy/common/validators/values/value-validators.js +6 -0
  54. package/build/legacy/dynamic-flow-types.js +1 -0
  55. package/build/legacy/dynamicFlow/BackButton.js +22 -0
  56. package/build/legacy/dynamicFlow/DynamicFlowStep.js +37 -0
  57. package/build/legacy/formControl/FormControl.js +266 -0
  58. package/build/legacy/formControl/index.js +1 -0
  59. package/build/legacy/formControl/utils/getAutocompleteString.js +80 -0
  60. package/build/legacy/formControl/utils/index.js +2 -0
  61. package/build/legacy/formControl/utils/value-utils.js +108 -0
  62. package/build/legacy/jsonSchemaForm/allOfSchema/AllOfSchema.js +50 -0
  63. package/build/legacy/jsonSchemaForm/allOfSchema/index.js +1 -0
  64. package/build/legacy/jsonSchemaForm/arrayTypeSchema/ArraySchema.js +25 -0
  65. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/ArrayListSchema.js +30 -0
  66. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multipleFileUploadSchema/MultipleFileUploadSchema.js +141 -0
  67. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multipleFileUploadSchema/index.js +1 -0
  68. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multipleFileUploadSchema/utils/index.js +2 -0
  69. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multipleFileUploadSchema/utils/upload-utils.js +79 -0
  70. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multipleFileUploadSchema/utils/useFormattedDefaultErrorMessages.js +14 -0
  71. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/repeatableSchema/ItemSummary.js +7 -0
  72. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/repeatableSchema/RepeatableSchema.js +134 -0
  73. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/repeatableSchema/RepeatableSchemaStep.js +85 -0
  74. package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/repeatableSchema/utils/summary-utils.js +135 -0
  75. package/build/legacy/jsonSchemaForm/arrayTypeSchema/index.js +1 -0
  76. package/build/legacy/jsonSchemaForm/basicTypeSchema/BasicTypeSchema.js +111 -0
  77. package/build/legacy/jsonSchemaForm/basicTypeSchema/index.js +1 -0
  78. package/build/legacy/jsonSchemaForm/controlFeedback/ControlFeedback.js +86 -0
  79. package/build/legacy/jsonSchemaForm/controlFeedback/index.js +1 -0
  80. package/build/legacy/jsonSchemaForm/help/Help.js +20 -0
  81. package/build/legacy/jsonSchemaForm/help/index.js +1 -0
  82. package/build/legacy/jsonSchemaForm/objectSchema/ObjectSchema.js +77 -0
  83. package/build/legacy/jsonSchemaForm/objectSchema/index.js +1 -0
  84. package/build/legacy/jsonSchemaForm/oneOfSchema/OneOfSchema.js +155 -0
  85. package/build/legacy/jsonSchemaForm/oneOfSchema/index.js +1 -0
  86. package/build/legacy/jsonSchemaForm/oneOfSchema/utils.js +68 -0
  87. package/build/legacy/jsonSchemaForm/persistAsyncSchema/PersistAsyncSchema.js +26 -0
  88. package/build/legacy/jsonSchemaForm/persistAsyncSchema/index.js +1 -0
  89. package/build/legacy/jsonSchemaForm/persistAsyncSchema/persistAsyncBasicSchema/PersistAsyncBasicSchema.js +165 -0
  90. package/build/legacy/jsonSchemaForm/persistAsyncSchema/persistAsyncBasicSchema/index.js +1 -0
  91. package/build/legacy/jsonSchemaForm/persistAsyncSchema/persistAsyncBlobSchema/PersistAsyncBlobSchema.js +131 -0
  92. package/build/legacy/jsonSchemaForm/persistAsyncSchema/persistAsyncBlobSchema/UploadInputAdapter.js +31 -0
  93. package/build/legacy/jsonSchemaForm/persistAsyncSchema/persistAsyncBlobSchema/index.js +1 -0
  94. package/build/legacy/jsonSchemaForm/promotedOneOfSchema/PromotedOneOfSchema.js +72 -0
  95. package/build/legacy/jsonSchemaForm/promotedOneOfSchema/index.js +1 -0
  96. package/build/legacy/jsonSchemaForm/promotedOneOfSchema/promoted-one-of-utils.js +8 -0
  97. package/build/legacy/jsonSchemaForm/promotedOneOfSchema/promotedOneOfControl/PromotedOneOfCheckboxControl.js +27 -0
  98. package/build/legacy/jsonSchemaForm/promotedOneOfSchema/promotedOneOfControl/PromotedOneOfControl.js +31 -0
  99. package/build/legacy/jsonSchemaForm/promotedOneOfSchema/promotedOneOfControl/PromotedOneOfRadioControl.js +32 -0
  100. package/build/legacy/jsonSchemaForm/readOnlySchema/ReadOnlySchema.js +54 -0
  101. package/build/legacy/jsonSchemaForm/readOnlySchema/ReadOnlySchema.messages.js +13 -0
  102. package/build/legacy/jsonSchemaForm/readOnlySchema/index.js +1 -0
  103. package/build/legacy/jsonSchemaForm/schemaFormControl/SchemaFormControl.js +133 -0
  104. package/build/legacy/jsonSchemaForm/schemaFormControl/index.js +1 -0
  105. package/build/legacy/jsonSchemaForm/schemaFormControl/utils/index.js +1 -0
  106. package/build/legacy/jsonSchemaForm/schemaFormControl/utils/mapping-utils.js +107 -0
  107. package/build/legacy/layout/DynamicLayout.js +68 -0
  108. package/build/legacy/layout/alert/DynamicAlert.js +29 -0
  109. package/build/legacy/layout/box/DynamicBox.js +41 -0
  110. package/build/legacy/layout/button/DynamicButton.js +27 -0
  111. package/build/legacy/layout/button/utils.js +45 -0
  112. package/build/legacy/layout/columns/DynamicColumns.js +38 -0
  113. package/build/legacy/layout/decision/DynamicDecision.js +21 -0
  114. package/build/legacy/layout/divider/DynamicDivider.js +9 -0
  115. package/build/legacy/layout/external/DynamicExternal.js +32 -0
  116. package/build/legacy/layout/external/DynamicExternal.messages.js +8 -0
  117. package/build/legacy/layout/form/DynamicForm.js +22 -0
  118. package/build/legacy/layout/heading/DynamicHeading.js +51 -0
  119. package/build/legacy/layout/icon/DynamicIcon.js +17 -0
  120. package/build/legacy/layout/icon/FlagIcon.js +198 -0
  121. package/build/legacy/layout/icon/NamedIcon.js +19 -0
  122. package/build/legacy/layout/image/DynamicImage.js +111 -0
  123. package/build/legacy/layout/index.js +20 -0
  124. package/build/legacy/layout/instructions/DynamicInstructions.js +30 -0
  125. package/build/legacy/layout/list/DynamicStatusList.js +37 -0
  126. package/build/legacy/layout/loadingIndicator/DynamicLoadingIndicator.js +11 -0
  127. package/build/legacy/layout/markdown/DynamicMarkdown.js +23 -0
  128. package/build/legacy/layout/modal/DynamicModal.js +26 -0
  129. package/build/legacy/layout/paragraph/DynamicParagraph.js +46 -0
  130. package/build/legacy/layout/paragraph/useSnackBarIfAvailable.js +9 -0
  131. package/build/legacy/layout/review/DynamicReview.js +58 -0
  132. package/build/legacy/layout/search/DynamicSearch.js +58 -0
  133. package/build/legacy/layout/search/SearchInput.js +17 -0
  134. package/build/legacy/layout/search/SearchResults.js +31 -0
  135. package/build/legacy/layout/search/useSearch.js +137 -0
  136. package/build/legacy/layout/utils/getNavigationOptionMedia.js +28 -0
  137. package/build/legacy/layout/utils/index.js +32 -0
  138. package/build/legacy/step/cameraStep/CameraStep.js +124 -0
  139. package/build/legacy/step/cameraStep/cameraCapture/CameraCapture.js +161 -0
  140. package/build/legacy/step/cameraStep/cameraCapture/CameraCapture.messages.js +58 -0
  141. package/build/legacy/step/cameraStep/cameraCapture/components/bottomBar/BottomBar.js +28 -0
  142. package/build/legacy/step/cameraStep/cameraCapture/components/index.js +3 -0
  143. package/build/legacy/step/cameraStep/cameraCapture/components/orientationLockOverlay/OrientationLockOverlay.js +19 -0
  144. package/build/legacy/step/cameraStep/cameraCapture/components/orientationLockOverlay/OrientationLockOverlay.messages.js +8 -0
  145. package/build/legacy/step/cameraStep/cameraCapture/hooks/useFullScreenOrientationLock.js +60 -0
  146. package/build/legacy/step/cameraStep/cameraCapture/hooks/useVideoConstraints.js +80 -0
  147. package/build/legacy/step/cameraStep/cameraCapture/index.js +1 -0
  148. package/build/legacy/step/cameraStep/cameraCapture/overlay/Overlay.js +77 -0
  149. package/build/legacy/step/cameraStep/cameraCapture/screens/cameraErrorScreen/CameraErrorScreen.js +18 -0
  150. package/build/legacy/step/cameraStep/cameraCapture/screens/index.js +1 -0
  151. package/build/legacy/step/cameraStep/cameraCapture/tracking/index.js +109 -0
  152. package/build/legacy/step/cameraStep/cameraCapture/types/index.js +7 -0
  153. package/build/legacy/step/cameraStep/cameraCapture/utils/index.js +107 -0
  154. package/build/legacy/step/cameraStep/index.js +1 -0
  155. package/build/legacy/step/externalConfirmationStep/ExternalConfirmationStep.js +64 -0
  156. package/build/legacy/step/externalConfirmationStep/ExternalConfirmationStep.messages.js +23 -0
  157. package/build/legacy/step/externalConfirmationStep/index.js +1 -0
  158. package/build/legacy/step/index.js +3 -0
  159. package/build/legacy/step/layoutStep/LayoutStep.js +33 -0
  160. package/build/legacy/step/layoutStep/index.js +1 -0
  161. package/build/legacy/step/layoutStep/utils/index.js +2 -0
  162. package/build/legacy/step/layoutStep/utils/inline-reference-utils.js +105 -0
  163. package/build/legacy/step/layoutStep/utils/layout-utils.js +212 -0
  164. package/build/main.js +13 -28
  165. package/build/main.min.js +1 -1
  166. package/build/main.mjs +13 -28
  167. package/build/types/revamp/domain/features/events.d.ts +1 -1
  168. package/package.json +2 -2
@@ -0,0 +1,133 @@
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 { useEffect } from 'react';
14
+ import { FormControlType } from '../../common/constants';
15
+ import { isOneOfSchema, isStringSchema } from '../../common/utils';
16
+ import { getValidBasicModelOrNull, isNull, isUndefined } from '../../common/validators';
17
+ import FormControl from '../../formControl';
18
+ import { mapConstSchemaToOption, mapSchemaToUploadOptions } from './utils';
19
+ import { useLogger } from '../../common/contexts';
20
+ var isNativeInput = function (propsSchemaType) {
21
+ return propsSchemaType === 'string' || propsSchemaType === 'number';
22
+ };
23
+ export var getControlType = function (schema) {
24
+ if (isOneOfSchema(schema)) {
25
+ if (schema.control === FormControlType.TAB && schema.oneOf.length > 3) {
26
+ return FormControlType.SELECT;
27
+ }
28
+ return schema.control || FormControlType.SELECT;
29
+ }
30
+ if (isStringSchema(schema)) {
31
+ return getStringSchemaControlType(schema);
32
+ }
33
+ // We should really check if the control is known, but I don't want to break behaviour so I'm leaving it as is for now
34
+ if ('control' in schema && schema.control) {
35
+ return schema.control;
36
+ }
37
+ if (schema.type === 'boolean') {
38
+ return 'checkbox';
39
+ }
40
+ if (schema.type === 'integer') {
41
+ return 'number';
42
+ }
43
+ return schema.type;
44
+ };
45
+ export var getStringSchemaControlType = function (_a) {
46
+ var format = _a.format, control = _a.control;
47
+ if (control) {
48
+ return stringControlToFormControlType[control] || control;
49
+ }
50
+ if (format) {
51
+ return stringFormatToFormControlType[format] || 'text';
52
+ }
53
+ return 'text';
54
+ };
55
+ var stringControlToFormControlType = {
56
+ 'date-lookup': 'date-lookup',
57
+ password: 'password',
58
+ textarea: 'textarea',
59
+ email: 'email',
60
+ numeric: 'numeric',
61
+ 'phone-number': 'tel'
62
+ };
63
+ var stringFormatToFormControlType = {
64
+ date: 'date',
65
+ // Legacy formats
66
+ email: 'email',
67
+ base64url: 'file',
68
+ password: 'password',
69
+ 'phone-number': 'tel'
70
+ };
71
+ var getOptions = function (schema, controlType) {
72
+ if (schema.oneOf) {
73
+ return schema.oneOf.map(function (childSchema) { return mapConstSchemaToOption(childSchema, controlType); });
74
+ }
75
+ return null;
76
+ };
77
+ function SchemaFormControl(props) {
78
+ var id = props.id, schema = props.schema, value = props.value, disabled = props.disabled, onChange = props.onChange, onFocus = props.onFocus, onBlur = props.onBlur, onSearchChange = props.onSearchChange, describedBy = props.describedBy;
79
+ var log = useLogger();
80
+ var getSanitisedValue = function (value) {
81
+ return isNativeInput(schema.type) && (isNull(value) || isUndefined(value)) ? '' : value;
82
+ };
83
+ var onModelChange = function (value, type, metadata) {
84
+ onChange(getValidBasicModelOrNull(value, schema), type, metadata);
85
+ };
86
+ var controlType = getControlType(schema);
87
+ useEffect(function () {
88
+ warnIfInvalidSchema(schema, log, controlType);
89
+ // eslint-disable-next-line react-hooks/exhaustive-deps
90
+ }, [JSON.stringify(schema), log, controlType]);
91
+ var options = schema.values || getOptions(schema, controlType);
92
+ var events = {
93
+ onFocus: onFocus,
94
+ onBlur: onBlur,
95
+ onSearchChange: onSearchChange,
96
+ onChange: onModelChange
97
+ };
98
+ var safeValue = getSanitisedValue(value);
99
+ var controlProps = {
100
+ id: id,
101
+ name: id,
102
+ label: schema.title,
103
+ options: options || [],
104
+ placeholder: schema.placeholder,
105
+ autoComplete: !schema.help,
106
+ autocompleteHint: schema.autocompleteHint,
107
+ disabled: disabled || schema.disabled,
108
+ displayPattern: schema.displayFormat,
109
+ // TODO: LOW avoid type assertion below
110
+ uploadProps: mapSchemaToUploadOptions(schema),
111
+ describedBy: describedBy
112
+ };
113
+ return (_jsx("div", __assign({ "aria-describedby": describedBy }, { children: _jsx(FormControl, __assign({ type: controlType, value: safeValue }, events, controlProps)) })));
114
+ }
115
+ SchemaFormControl.defaultProps = {
116
+ value: null,
117
+ onFocus: null,
118
+ onBlur: null,
119
+ onSearchChange: null,
120
+ disabled: false
121
+ };
122
+ var warnIfInvalidSchema = function (schema, log, controlType) {
123
+ if (isOneOfSchema(schema) && schema.oneOf.length === 2 && !schema.control) {
124
+ log.warning('Deprecation warning', 'A oneOf schema with 2 options and no control type currently renders as a "radio" but will be changed to render as a "select". Please specify control radio to retain the existing behaviour.');
125
+ }
126
+ if (controlType === 'file') {
127
+ log.warning('Deprecation warning', 'Please use a persist-async blob schema instead of string with base64url for file uploads. The base64url does not perform well on low end devices. Support for this schema will be removed in a later release.');
128
+ }
129
+ if (schema.values) {
130
+ log.warning('Deprecated schema', 'Schema.values is a legacy approach. Please use oneOf.');
131
+ }
132
+ };
133
+ export default SchemaFormControl;
@@ -0,0 +1 @@
1
+ export { default } from './SchemaFormControl';
@@ -0,0 +1 @@
1
+ export * from './mapping-utils';
@@ -0,0 +1,107 @@
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 { Flag } from '@wise/art';
15
+ import { isArray, isNull, isUndefined } from '../../../common/validators';
16
+ import DynamicIcon, { isValidIconName } from '../../../layout/icon/DynamicIcon';
17
+ import { isFlagIcon } from '../../../layout/icon/FlagIcon';
18
+ var mapConstSchemaToOption = function (schema, controlType) {
19
+ switch (controlType) {
20
+ case 'select':
21
+ return mapConstSchemaToSelectOption(schema);
22
+ case 'radio':
23
+ default:
24
+ return mapConstSchemaToRadioOption(schema);
25
+ }
26
+ };
27
+ var mapConstSchemaToRadioOption = function (schema) { return (__assign(__assign(__assign({
28
+ // TODO: LOW avoid type assertion -- using || '' would fail some tests
29
+ label: schema.title, value: schema["const"] }, getRadioOptionDescription(schema.title, schema.description)), getAvatarPropertyForRadioOption(schema)), getDisabled(schema.disabled))); };
30
+ var mapConstSchemaToSelectOption = function (schema) { return (__assign(__assign(__assign(__assign(__assign({
31
+ // TODO: LOW avoid type assertion -- using || '' would fail some tests
32
+ label: schema.title, value: schema["const"] }, getOptionDescription(schema.title, schema.description)), getIconPropertyForSelectOption(schema.icon)), mapImage(schema.image)), getDisabled(schema.disabled)), mapKeywordsToSearchStrings(schema.keywords))); };
33
+ var mapKeywordsToSearchStrings = function (searchStrings) {
34
+ return isArray(searchStrings) ? { searchStrings: searchStrings } : {};
35
+ };
36
+ var mapImage = function (image) {
37
+ if (image === null || image === void 0 ? void 0 : image.url) {
38
+ return {
39
+ icon: (_jsx("div", __assign({ className: "media" }, { children: _jsx("div", __assign({ className: "np-option__no-media-circle" }, { children: _jsx("img", { src: image.url, alt: image.name || '' }) })) }))),
40
+ hideIconInTrigger: true
41
+ };
42
+ }
43
+ return null;
44
+ };
45
+ var getIconPropertyForSelectOption = function (icon) {
46
+ if ((icon === null || icon === void 0 ? void 0 : icon.name) && isFlagIcon(icon.name)) {
47
+ return {
48
+ icon: _jsx(Flag, { code: icon.name.substring(5), intrinsicSize: 24 })
49
+ };
50
+ }
51
+ if ((icon === null || icon === void 0 ? void 0 : icon.name) && isValidIconName(icon.name)) {
52
+ return {
53
+ icon: _jsx(DynamicIcon, { type: icon.name })
54
+ };
55
+ }
56
+ if (icon === null || icon === void 0 ? void 0 : icon.text) {
57
+ return {
58
+ icon: _jsx("span", { children: icon.text })
59
+ };
60
+ }
61
+ return null;
62
+ };
63
+ var getAvatarPropertyForRadioOption = function (_a) {
64
+ var image = _a.image, icon = _a.icon;
65
+ if (image === null || image === void 0 ? void 0 : image.url) {
66
+ return {
67
+ avatar: (_jsx(Avatar, __assign({ type: AvatarType.THUMBNAIL }, { children: _jsx("img", { src: image.url, alt: "" }) })))
68
+ };
69
+ }
70
+ if ((icon === null || icon === void 0 ? void 0 : icon.name) && isValidIconName(icon.name)) {
71
+ return {
72
+ avatar: (_jsx(Avatar, __assign({ type: AvatarType.ICON }, { children: _jsx(DynamicIcon, { type: icon.name }) })))
73
+ };
74
+ }
75
+ if (icon === null || icon === void 0 ? void 0 : icon.text) {
76
+ return {
77
+ avatar: _jsx(Avatar, __assign({ type: AvatarType.INITIALS }, { children: icon.text }))
78
+ };
79
+ }
80
+ return null;
81
+ };
82
+ var mapSchemaToUploadOptions = function (_a) {
83
+ var accepts = _a.accepts;
84
+ return (__assign({}, (isArray(accepts) && { usAccept: accepts.join(',') })));
85
+ };
86
+ var getOptionDescription = function (title, description) {
87
+ if (title && description) {
88
+ if ((title + description).length > 50) {
89
+ return { secondary: description };
90
+ }
91
+ return { note: description };
92
+ }
93
+ return undefined;
94
+ };
95
+ var getRadioOptionDescription = function (title, description) {
96
+ if (title && description) {
97
+ return { note: description };
98
+ }
99
+ return undefined;
100
+ };
101
+ var getDisabled = function (disabled) {
102
+ if (!isUndefined(disabled) && !isNull(disabled)) {
103
+ return { disabled: disabled };
104
+ }
105
+ return undefined;
106
+ };
107
+ export { mapConstSchemaToOption, getAvatarPropertyForRadioOption, mapSchemaToUploadOptions };
@@ -0,0 +1,68 @@
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, Fragment as _Fragment } from "react/jsx-runtime";
13
+ import { DynamicAlert, DynamicBox, DynamicButton, DynamicColumns, DynamicDecision, DynamicDivider, DynamicExternal, DynamicForm, DynamicHeading, DynamicImage, DynamicInfo, DynamicInstructions, DynamicStatusList, DynamicLoadingIndicator, DynamicMarkdown, DynamicParagraph, DynamicReview, DynamicSearch, DynamicModal, } from '.';
14
+ import { HttpClientProviderFromBaseUrl, useHasHttpClientProvider, } from '../../common/httpClientContext';
15
+ var getKey = function (component) { return JSON.stringify(component); };
16
+ function DynamicLayout(props) {
17
+ var components = props.components, model = props.model, submitted = props.submitted, errors = props.errors, onModelChange = props.onModelChange, onAction = props.onAction, onPersistAsync = props.onPersistAsync, baseUrl = props.baseUrl;
18
+ var renderComponent = function (component) {
19
+ switch (component.type) {
20
+ case 'heading':
21
+ return _jsx(DynamicHeading, { component: component }, getKey(component));
22
+ case 'paragraph':
23
+ return _jsx(DynamicParagraph, { component: component }, getKey(component));
24
+ case 'image':
25
+ return _jsx(DynamicImage, { component: component }, getKey(component));
26
+ case 'alert':
27
+ return _jsx(DynamicAlert, { component: component }, getKey(component));
28
+ case 'review':
29
+ return _jsx(DynamicReview, { component: component, onAction: onAction }, getKey(component));
30
+ case 'divider':
31
+ return _jsx(DynamicDivider, { component: component }, getKey(component));
32
+ case 'info':
33
+ return _jsx(DynamicInfo, { component: component }, getKey(component));
34
+ case 'instructions':
35
+ return _jsx(DynamicInstructions, { component: component }, getKey(component));
36
+ case 'markdown':
37
+ return _jsx(DynamicMarkdown, { component: component }, getKey(component));
38
+ case 'columns':
39
+ return (_jsx(DynamicColumns, { component: component, model: model, submitted: submitted, errors: errors, onModelChange: onModelChange, onAction: onAction, onPersistAsync: onPersistAsync }, getKey(component)));
40
+ case 'form':
41
+ return (_jsx(DynamicForm, { component: component, model: model, submitted: submitted, errors: errors, onModelChange: onModelChange, onPersistAsync: onPersistAsync }, getKey(__assign(__assign({}, component), { errors: errors !== null && errors !== void 0 ? errors : null }))));
42
+ case 'button':
43
+ return _jsx(DynamicButton, { component: component, onAction: onAction }, getKey(component));
44
+ case 'box':
45
+ return (_jsx(DynamicBox, { component: component, model: model, submitted: submitted, errors: errors, onModelChange: onModelChange, onAction: onAction, onPersistAsync: onPersistAsync }, getKey(component)));
46
+ case 'decision':
47
+ return (_jsx(DynamicDecision, { component: component, onAction: onAction }, getKey(component)));
48
+ case 'external':
49
+ return (_jsx(DynamicExternal, { component: component, onAction: onAction }, getKey(component)));
50
+ case 'list':
51
+ case 'status-list':
52
+ return (_jsx(DynamicStatusList, { component: component, onAction: onAction }, getKey(component)));
53
+ case 'loading-indicator':
54
+ return _jsx(DynamicLoadingIndicator, { component: component }, getKey(component));
55
+ case 'search':
56
+ return _jsx(DynamicSearch, { component: component, onAction: onAction }, getKey(component));
57
+ case 'modal':
58
+ return (_jsx(DynamicModal, { component: component, model: model, submitted: submitted, errors: errors, onModelChange: onModelChange, onAction: onAction, onPersistAsync: onPersistAsync }, getKey(component)));
59
+ default:
60
+ return _jsx("div", {}, getKey(component));
61
+ }
62
+ };
63
+ if (useHasHttpClientProvider() || baseUrl == null) {
64
+ return _jsx(_Fragment, { children: components.map(renderComponent) });
65
+ }
66
+ return (_jsx(HttpClientProviderFromBaseUrl, __assign({ baseUrl: baseUrl }, { children: components.map(renderComponent) })));
67
+ }
68
+ export default DynamicLayout;
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Alert } from '@transferwise/components';
3
+ import { getMargin } from '../utils';
4
+ var DynamicAlert = function (props) {
5
+ var alert = props.component;
6
+ return (_jsx(Alert, { type: mapContextToAlertType(legacy_mapContext(alert.context)), className: getMargin(alert.margin), message: alert.markdown }));
7
+ };
8
+ var legacy_mapContext = function (context) {
9
+ switch (context) {
10
+ case 'success':
11
+ return 'positive';
12
+ case 'failure':
13
+ return 'negative';
14
+ case 'warning':
15
+ return 'warning';
16
+ case 'info':
17
+ case 'primary':
18
+ return 'neutral';
19
+ default:
20
+ return context;
21
+ }
22
+ };
23
+ var mapContextToAlertType = function (context) {
24
+ if (!context || !['neutral', 'warning', 'negative', 'positive'].includes(context)) {
25
+ return 'neutral';
26
+ }
27
+ return context;
28
+ };
29
+ export default DynamicAlert;
@@ -0,0 +1,41 @@
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 { DynamicLayout } from '..';
14
+ import { getMargin } from '../utils';
15
+ var DynamicBox = function (props) {
16
+ var box = props.component;
17
+ var margin = getMargin(box.margin || box.border ? 'lg' : 'xs');
18
+ if (!box.width || box.width === 'xl') {
19
+ return (_jsx("div", __assign({ className: margin + getBorderClass(box.border) }, { children: _jsx(DynamicLayout, { components: box.components, model: props.model, submitted: props.submitted, errors: props.errors, onModelChange: props.onModelChange, onAction: props.onAction, onPersistAsync: props.onPersistAsync }) })));
20
+ }
21
+ return (_jsx("div", __assign({ className: "row" }, { children: _jsx("div", __assign({ className: margin + getBoxWidthClasses(box) }, { children: _jsx("div", __assign({ className: getBorderClass(box.border) }, { children: _jsx(DynamicLayout, { components: box.components, model: props.model, submitted: props.submitted, errors: props.errors, onModelChange: props.onModelChange, onAction: props.onAction, onPersistAsync: props.onPersistAsync }) })) })) })));
22
+ };
23
+ var getBorderClass = function (border) {
24
+ return border ? ' well p-b-0' : '';
25
+ };
26
+ var getBoxWidthClasses = function (component) {
27
+ switch (component.width) {
28
+ case 'xs':
29
+ return ' col-md-4 col-md-offset-4';
30
+ case 'sm':
31
+ return ' col-md-6 col-md-offset-3 col-lg-4 col-lg-offset-4';
32
+ case 'md':
33
+ return ' col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3';
34
+ case 'lg':
35
+ return ' col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2';
36
+ case 'xl':
37
+ default:
38
+ return ' col-xs-12';
39
+ }
40
+ };
41
+ export default DynamicBox;
@@ -0,0 +1,27 @@
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 { Button } from '@transferwise/components';
14
+ import { useDynamicFlow } from '../../common/contexts';
15
+ import { getMargin } from '../utils';
16
+ import { getButtonPriority, getButtonType, getButtonSize } from './utils';
17
+ function DynamicButton(props) {
18
+ var _a;
19
+ var component = props.component, onAction = props.onAction;
20
+ var componentAction = component.action; // there should be no $ref at this point
21
+ var type = getButtonType(component);
22
+ var priority = getButtonPriority(component);
23
+ var loading = useDynamicFlow().loading;
24
+ var className = getMargin(component.margin || 'md');
25
+ return (_jsx(Button, __assign({ size: getButtonSize(component.size), type: priority === 'tertiary' ? undefined : type, priority: priority, block: true, className: className, disabled: loading || component.disabled || componentAction.disabled, onClick: function () { return onAction(componentAction); } }, { children: (_a = component.title) !== null && _a !== void 0 ? _a : componentAction.title })));
26
+ }
27
+ export default DynamicButton;
@@ -0,0 +1,45 @@
1
+ var priorities = {
2
+ primary: 'primary',
3
+ secondary: 'secondary',
4
+ link: 'tertiary',
5
+ positive: 'primary',
6
+ negative: 'primary'
7
+ };
8
+ export var getButtonPriority = function (component) {
9
+ var _a;
10
+ var actionType = component.action.type;
11
+ return (_a = component.control) !== null && _a !== void 0 ? _a : (actionType ? priorities[actionType] : 'secondary');
12
+ };
13
+ var contextToType = {
14
+ positive: 'positive',
15
+ negative: 'negative',
16
+ neutral: 'accent',
17
+ warning: 'accent'
18
+ };
19
+ var actionTypeToType = {
20
+ primary: 'accent',
21
+ secondary: 'accent',
22
+ link: 'accent',
23
+ positive: 'positive',
24
+ negative: 'negative'
25
+ };
26
+ export var getButtonType = function (component) {
27
+ if (component.context) {
28
+ return contextToType[component.context];
29
+ }
30
+ var actionType = component.action.type;
31
+ return actionType ? actionTypeToType[actionType] : 'accent';
32
+ };
33
+ export var getButtonSize = function (size) {
34
+ switch (size) {
35
+ case 'xs':
36
+ case 'sm':
37
+ return 'sm';
38
+ case 'lg':
39
+ case 'xl':
40
+ return 'lg';
41
+ case 'md':
42
+ default:
43
+ return 'md';
44
+ }
45
+ };
@@ -0,0 +1,38 @@
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 { DynamicLayout } from '..';
14
+ import { getMargin } from '../utils';
15
+ var DynamicColumns = function (props) {
16
+ var columns = props.component;
17
+ var _a = getWidth(columns.bias), leftWidth = _a.leftWidth, rightWidth = _a.rightWidth;
18
+ return (_jsxs("div", __assign({ className: "".concat(getMargin(columns.margin || 'xs'), " row") }, { children: [_jsx("div", __assign({ className: "".concat(leftWidth, " m-b-0") }, { children: _jsx(DynamicLayout, { components: columns.left, model: props.model, submitted: props.submitted, errors: props.errors, onModelChange: props.onModelChange, onAction: props.onAction, onPersistAsync: props.onPersistAsync }) })), _jsx("div", __assign({ className: "".concat(rightWidth, " m-b-0") }, { children: _jsx(DynamicLayout, { components: columns.right, model: props.model, submitted: props.submitted, errors: props.errors, onModelChange: props.onModelChange, onAction: props.onAction, onPersistAsync: props.onPersistAsync }) }))] })));
19
+ };
20
+ var getWidth = function (bias) {
21
+ if (bias === 'left') {
22
+ return {
23
+ leftWidth: 'col-md-8',
24
+ rightWidth: 'col-md-4'
25
+ };
26
+ }
27
+ if (bias === 'right') {
28
+ return {
29
+ leftWidth: 'col-md-4',
30
+ rightWidth: 'col-md-8'
31
+ };
32
+ }
33
+ return {
34
+ leftWidth: 'col-md-6',
35
+ rightWidth: 'col-md-6'
36
+ };
37
+ };
38
+ export default DynamicColumns;
@@ -0,0 +1,21 @@
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 { NavigationOption, NavigationOptionsList } from '@transferwise/components';
14
+ import { getNavigationOptionMedia, getMargin } from '../utils';
15
+ import { useDynamicFlow } from '../../common/contexts';
16
+ function DynamicDecision(_a) {
17
+ var component = _a.component, onAction = _a.onAction;
18
+ var loading = useDynamicFlow().loading;
19
+ return (_jsx("div", __assign({ className: getMargin(component.margin) }, { children: _jsx(NavigationOptionsList, { children: component.options.map(function (option) { return (_jsx(NavigationOption, { title: option.title, content: option.description, disabled: loading || option.disabled, media: getNavigationOptionMedia(option), showMediaCircle: false, showMediaAtAllSizes: true, onClick: function () { return onAction(option.action); } }, JSON.stringify(option))); }) }) })));
20
+ }
21
+ export default DynamicDecision;
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { getMargin } from '../utils';
3
+ var DynamicDivider = function (_a) {
4
+ var component = _a.component;
5
+ var margin = getMargin(component.margin);
6
+ var className = "m-t-0 ".concat(margin);
7
+ return _jsx("hr", { className: className });
8
+ };
9
+ export default DynamicDivider;
@@ -0,0 +1,32 @@
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, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { Button, Loader, Size } from '@transferwise/components';
14
+ import { useCallback, useEffect } from 'react';
15
+ import { useIntl } from 'react-intl';
16
+ import { useExternalStepPolling } from '../../common/hooks';
17
+ import messages from './DynamicExternal.messages';
18
+ /** @deprecated - No longer supported, use the external feature instead */
19
+ var DynamicExternal = function (_a) {
20
+ var component = _a.component, onAction = _a.onAction;
21
+ var requestUrl = component.requestUrl, responseHandlers = component.responseHandlers, polling = component.polling, retryTitle = component.retryTitle;
22
+ var intl = useIntl();
23
+ var openExternalUrl = useCallback(function () { return window.open(requestUrl, 'df-external-window'); }, [requestUrl]);
24
+ useEffect(function () {
25
+ openExternalUrl();
26
+ }, [openExternalUrl]);
27
+ var pollingConfiguration = polling && responseHandlers
28
+ ? __assign(__assign({}, polling), { responseHandlers: responseHandlers }) : undefined;
29
+ useExternalStepPolling(pollingConfiguration, onAction);
30
+ return (_jsxs(_Fragment, { children: [_jsx(Loader, { size: Size.LARGE, classNames: { 'tw-loader': 'tw-loader m-x-auto' } }), _jsx("br", {}), _jsx(Button, __assign({ priority: "tertiary", block: true, onClick: openExternalUrl }, { children: retryTitle || intl.formatMessage(messages.retryTitle) }))] }));
31
+ };
32
+ export default DynamicExternal;
@@ -0,0 +1,8 @@
1
+ import { defineMessages } from 'react-intl';
2
+ export default defineMessages({
3
+ retryTitle: {
4
+ id: 'dynamicFlows.DynamicExternal.retryTitle',
5
+ defaultMessage: 'Reopen window',
6
+ description: ''
7
+ }
8
+ });
@@ -0,0 +1,22 @@
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 GenericSchema from '../../jsonSchemaForm/genericSchema';
14
+ import { getMargin } from '../utils';
15
+ function DynamicForm(_a) {
16
+ var component = _a.component, _b = _a.model, model = _b === void 0 ? null : _b, _c = _a.errors, errors = _c === void 0 ? null : _c, submitted = _a.submitted, onModelChange = _a.onModelChange, onPersistAsync = _a.onPersistAsync;
17
+ var formSchema = component.schema; // There should be no $ref, nor schemaId at this point
18
+ return (_jsx("div", __assign({ className: getMargin(component.margin || 'md') }, { children: _jsx(GenericSchema, { schema: formSchema, model: model, errors: errors, submitted: submitted, onChange: function (parameters) {
19
+ onModelChange(__assign({ formSchema: formSchema }, parameters));
20
+ }, onPersistAsync: onPersistAsync }) })));
21
+ }
22
+ export default DynamicForm;
@@ -0,0 +1,51 @@
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 { Display } from '@transferwise/components';
14
+ import classNames from 'classnames';
15
+ import { getTextAlignmentAndMargin } from '../utils';
16
+ var DynamicHeading = function (props) {
17
+ var _a = props.component, text = _a.text, _b = _a.size, size = _b === void 0 ? 'md' : _b, _c = _a.align, align = _c === void 0 ? 'left' : _c, _d = _a.margin, margin = _d === void 0 ? 'md' : _d, control = _a.control;
18
+ var classes = classNames(getTextAlignmentAndMargin({ align: align, margin: margin }));
19
+ return control === 'display' ? (_jsx(DisplayHeading, { size: size, text: text, classes: classes })) : (_jsx(StandardHeading, { size: size, text: text, classes: classes }));
20
+ };
21
+ var StandardHeading = function (_a) {
22
+ var size = _a.size, text = _a.text, classes = _a.classes;
23
+ switch (size) {
24
+ case 'xs':
25
+ return _jsx("h5", __assign({ className: classes }, { children: text }));
26
+ case 'sm':
27
+ return _jsx("h4", __assign({ className: classes }, { children: text }));
28
+ case 'lg':
29
+ return _jsx("h2", __assign({ className: classes }, { children: text }));
30
+ case 'xl':
31
+ return _jsx("h1", __assign({ className: classes }, { children: text }));
32
+ case 'md':
33
+ default:
34
+ return _jsx("h3", __assign({ className: classes }, { children: text }));
35
+ }
36
+ };
37
+ var DisplayHeading = function (_a) {
38
+ var size = _a.size, text = _a.text, classes = _a.classes;
39
+ switch (size) {
40
+ case 'xs':
41
+ case 'sm':
42
+ return (_jsx(Display, __assign({ type: "display-small", className: classes }, { children: text })));
43
+ case 'xl':
44
+ case 'lg':
45
+ return (_jsx(Display, __assign({ type: "display-large", className: classes }, { children: text })));
46
+ case 'md':
47
+ default:
48
+ return (_jsx(Display, __assign({ type: "display-medium", className: classes }, { children: text })));
49
+ }
50
+ };
51
+ export default DynamicHeading;