@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.
- package/build/common/httpClientContext/HttpClientContext.js +35 -0
- package/build/common/httpClientContext/index.js +1 -0
- package/build/common/makeHttpClient/index.js +1 -0
- package/build/common/makeHttpClient/makeHttpClient.js +34 -0
- package/build/common/messages/generic-error.messages.js +18 -0
- package/build/common/messages/help.messages.js +8 -0
- package/build/common/messages/multi-file-upload.messages.js +18 -0
- package/build/common/messages/paragraph.messages.js +13 -0
- package/build/common/messages/repeatable.messages.js +23 -0
- package/build/common/messages/validation.array.messages.js +13 -0
- package/build/common/messages/validation.messages.js +53 -0
- package/build/common/utils/api-utils.js +4 -0
- package/build/legacy/common/constants/DateMode.js +4 -0
- package/build/legacy/common/constants/FeatureName.js +4 -0
- package/build/legacy/common/constants/FormControlType.js +21 -0
- package/build/legacy/common/constants/MonthFormat.js +4 -0
- package/build/legacy/common/constants/Size.js +7 -0
- package/build/legacy/common/constants/index.js +4 -0
- package/build/legacy/common/contexts/dynamicFlowContexts/DynamicFlowContexts.js +36 -0
- package/build/legacy/common/contexts/dynamicFlowContexts/usePendingPromiseCounter.js +13 -0
- package/build/legacy/common/contexts/eventsContext/EventsContext.js +38 -0
- package/build/legacy/common/contexts/featureContext/FeatureContext.js +22 -0
- package/build/legacy/common/contexts/index.js +3 -0
- package/build/legacy/common/contexts/logContext/LogContext.js +44 -0
- package/build/legacy/common/hooks/index.js +7 -0
- package/build/legacy/common/hooks/useDebouncedFunction/useDebouncedFunction.js +9 -0
- package/build/legacy/common/hooks/useExternal/useExternal.js +15 -0
- package/build/legacy/common/hooks/useExternalStepPolling/useExternalStepPolling.js +70 -0
- package/build/legacy/common/hooks/usePersistAsync/usePersistAsync.js +172 -0
- package/build/legacy/common/hooks/usePolling/usePolling.js +51 -0
- package/build/legacy/common/hooks/usePrevious/usePrevious.js +8 -0
- package/build/legacy/common/hooks/useStepPolling/useStepPolling.js +43 -0
- package/build/legacy/common/messages.js +8 -0
- package/build/legacy/common/utils/api-utils.js +6 -0
- package/build/legacy/common/utils/date-utils.js +22 -0
- package/build/legacy/common/utils/debounce.js +38 -0
- package/build/legacy/common/utils/file-utils.js +45 -0
- package/build/legacy/common/utils/id-utils.js +5 -0
- package/build/legacy/common/utils/index.js +11 -0
- package/build/legacy/common/utils/is-equal.js +21 -0
- package/build/legacy/common/utils/misc-utils.js +4 -0
- package/build/legacy/common/utils/mobile-utils.js +23 -0
- package/build/legacy/common/utils/model-utils.js +33 -0
- package/build/legacy/common/utils/schema-utils.js +97 -0
- package/build/legacy/common/utils/step-utils.js +32 -0
- package/build/legacy/common/validators/index.js +5 -0
- package/build/legacy/common/validators/models/model-utils.js +119 -0
- package/build/legacy/common/validators/models/model-validators.js +62 -0
- package/build/legacy/common/validators/schemas/schema-validators.js +101 -0
- package/build/legacy/common/validators/types/type-validators.js +14 -0
- package/build/legacy/common/validators/validationFailures/validation-failures.js +139 -0
- package/build/legacy/common/validators/validationFailures/validation-failures.utils.js +40 -0
- package/build/legacy/common/validators/values/value-validators.js +6 -0
- package/build/legacy/dynamic-flow-types.js +1 -0
- package/build/legacy/dynamicFlow/BackButton.js +22 -0
- package/build/legacy/dynamicFlow/DynamicFlowStep.js +37 -0
- package/build/legacy/formControl/FormControl.js +266 -0
- package/build/legacy/formControl/index.js +1 -0
- package/build/legacy/formControl/utils/getAutocompleteString.js +80 -0
- package/build/legacy/formControl/utils/index.js +2 -0
- package/build/legacy/formControl/utils/value-utils.js +108 -0
- package/build/legacy/jsonSchemaForm/allOfSchema/AllOfSchema.js +50 -0
- package/build/legacy/jsonSchemaForm/allOfSchema/index.js +1 -0
- package/build/legacy/jsonSchemaForm/arrayTypeSchema/ArraySchema.js +25 -0
- package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/ArrayListSchema.js +30 -0
- package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multipleFileUploadSchema/MultipleFileUploadSchema.js +141 -0
- package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multipleFileUploadSchema/index.js +1 -0
- package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multipleFileUploadSchema/utils/index.js +2 -0
- package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multipleFileUploadSchema/utils/upload-utils.js +79 -0
- package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/multipleFileUploadSchema/utils/useFormattedDefaultErrorMessages.js +14 -0
- package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/repeatableSchema/ItemSummary.js +7 -0
- package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/repeatableSchema/RepeatableSchema.js +134 -0
- package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/repeatableSchema/RepeatableSchemaStep.js +85 -0
- package/build/legacy/jsonSchemaForm/arrayTypeSchema/arrayListSchema/repeatableSchema/utils/summary-utils.js +135 -0
- package/build/legacy/jsonSchemaForm/arrayTypeSchema/index.js +1 -0
- package/build/legacy/jsonSchemaForm/basicTypeSchema/BasicTypeSchema.js +111 -0
- package/build/legacy/jsonSchemaForm/basicTypeSchema/index.js +1 -0
- package/build/legacy/jsonSchemaForm/controlFeedback/ControlFeedback.js +86 -0
- package/build/legacy/jsonSchemaForm/controlFeedback/index.js +1 -0
- package/build/legacy/jsonSchemaForm/help/Help.js +20 -0
- package/build/legacy/jsonSchemaForm/help/index.js +1 -0
- package/build/legacy/jsonSchemaForm/objectSchema/ObjectSchema.js +77 -0
- package/build/legacy/jsonSchemaForm/objectSchema/index.js +1 -0
- package/build/legacy/jsonSchemaForm/oneOfSchema/OneOfSchema.js +155 -0
- package/build/legacy/jsonSchemaForm/oneOfSchema/index.js +1 -0
- package/build/legacy/jsonSchemaForm/oneOfSchema/utils.js +68 -0
- package/build/legacy/jsonSchemaForm/persistAsyncSchema/PersistAsyncSchema.js +26 -0
- package/build/legacy/jsonSchemaForm/persistAsyncSchema/index.js +1 -0
- package/build/legacy/jsonSchemaForm/persistAsyncSchema/persistAsyncBasicSchema/PersistAsyncBasicSchema.js +165 -0
- package/build/legacy/jsonSchemaForm/persistAsyncSchema/persistAsyncBasicSchema/index.js +1 -0
- package/build/legacy/jsonSchemaForm/persistAsyncSchema/persistAsyncBlobSchema/PersistAsyncBlobSchema.js +131 -0
- package/build/legacy/jsonSchemaForm/persistAsyncSchema/persistAsyncBlobSchema/UploadInputAdapter.js +31 -0
- package/build/legacy/jsonSchemaForm/persistAsyncSchema/persistAsyncBlobSchema/index.js +1 -0
- package/build/legacy/jsonSchemaForm/promotedOneOfSchema/PromotedOneOfSchema.js +72 -0
- package/build/legacy/jsonSchemaForm/promotedOneOfSchema/index.js +1 -0
- package/build/legacy/jsonSchemaForm/promotedOneOfSchema/promoted-one-of-utils.js +8 -0
- package/build/legacy/jsonSchemaForm/promotedOneOfSchema/promotedOneOfControl/PromotedOneOfCheckboxControl.js +27 -0
- package/build/legacy/jsonSchemaForm/promotedOneOfSchema/promotedOneOfControl/PromotedOneOfControl.js +31 -0
- package/build/legacy/jsonSchemaForm/promotedOneOfSchema/promotedOneOfControl/PromotedOneOfRadioControl.js +32 -0
- package/build/legacy/jsonSchemaForm/readOnlySchema/ReadOnlySchema.js +54 -0
- package/build/legacy/jsonSchemaForm/readOnlySchema/ReadOnlySchema.messages.js +13 -0
- package/build/legacy/jsonSchemaForm/readOnlySchema/index.js +1 -0
- package/build/legacy/jsonSchemaForm/schemaFormControl/SchemaFormControl.js +133 -0
- package/build/legacy/jsonSchemaForm/schemaFormControl/index.js +1 -0
- package/build/legacy/jsonSchemaForm/schemaFormControl/utils/index.js +1 -0
- package/build/legacy/jsonSchemaForm/schemaFormControl/utils/mapping-utils.js +107 -0
- package/build/legacy/layout/DynamicLayout.js +68 -0
- package/build/legacy/layout/alert/DynamicAlert.js +29 -0
- package/build/legacy/layout/box/DynamicBox.js +41 -0
- package/build/legacy/layout/button/DynamicButton.js +27 -0
- package/build/legacy/layout/button/utils.js +45 -0
- package/build/legacy/layout/columns/DynamicColumns.js +38 -0
- package/build/legacy/layout/decision/DynamicDecision.js +21 -0
- package/build/legacy/layout/divider/DynamicDivider.js +9 -0
- package/build/legacy/layout/external/DynamicExternal.js +32 -0
- package/build/legacy/layout/external/DynamicExternal.messages.js +8 -0
- package/build/legacy/layout/form/DynamicForm.js +22 -0
- package/build/legacy/layout/heading/DynamicHeading.js +51 -0
- package/build/legacy/layout/icon/DynamicIcon.js +17 -0
- package/build/legacy/layout/icon/FlagIcon.js +198 -0
- package/build/legacy/layout/icon/NamedIcon.js +19 -0
- package/build/legacy/layout/image/DynamicImage.js +111 -0
- package/build/legacy/layout/index.js +20 -0
- package/build/legacy/layout/instructions/DynamicInstructions.js +30 -0
- package/build/legacy/layout/list/DynamicStatusList.js +37 -0
- package/build/legacy/layout/loadingIndicator/DynamicLoadingIndicator.js +11 -0
- package/build/legacy/layout/markdown/DynamicMarkdown.js +23 -0
- package/build/legacy/layout/modal/DynamicModal.js +26 -0
- package/build/legacy/layout/paragraph/DynamicParagraph.js +46 -0
- package/build/legacy/layout/paragraph/useSnackBarIfAvailable.js +9 -0
- package/build/legacy/layout/review/DynamicReview.js +58 -0
- package/build/legacy/layout/search/DynamicSearch.js +58 -0
- package/build/legacy/layout/search/SearchInput.js +17 -0
- package/build/legacy/layout/search/SearchResults.js +31 -0
- package/build/legacy/layout/search/useSearch.js +137 -0
- package/build/legacy/layout/utils/getNavigationOptionMedia.js +28 -0
- package/build/legacy/layout/utils/index.js +32 -0
- package/build/legacy/step/cameraStep/CameraStep.js +124 -0
- package/build/legacy/step/cameraStep/cameraCapture/CameraCapture.js +161 -0
- package/build/legacy/step/cameraStep/cameraCapture/CameraCapture.messages.js +58 -0
- package/build/legacy/step/cameraStep/cameraCapture/components/bottomBar/BottomBar.js +28 -0
- package/build/legacy/step/cameraStep/cameraCapture/components/index.js +3 -0
- package/build/legacy/step/cameraStep/cameraCapture/components/orientationLockOverlay/OrientationLockOverlay.js +19 -0
- package/build/legacy/step/cameraStep/cameraCapture/components/orientationLockOverlay/OrientationLockOverlay.messages.js +8 -0
- package/build/legacy/step/cameraStep/cameraCapture/hooks/useFullScreenOrientationLock.js +60 -0
- package/build/legacy/step/cameraStep/cameraCapture/hooks/useVideoConstraints.js +80 -0
- package/build/legacy/step/cameraStep/cameraCapture/index.js +1 -0
- package/build/legacy/step/cameraStep/cameraCapture/overlay/Overlay.js +77 -0
- package/build/legacy/step/cameraStep/cameraCapture/screens/cameraErrorScreen/CameraErrorScreen.js +18 -0
- package/build/legacy/step/cameraStep/cameraCapture/screens/index.js +1 -0
- package/build/legacy/step/cameraStep/cameraCapture/tracking/index.js +109 -0
- package/build/legacy/step/cameraStep/cameraCapture/types/index.js +7 -0
- package/build/legacy/step/cameraStep/cameraCapture/utils/index.js +107 -0
- package/build/legacy/step/cameraStep/index.js +1 -0
- package/build/legacy/step/externalConfirmationStep/ExternalConfirmationStep.js +64 -0
- package/build/legacy/step/externalConfirmationStep/ExternalConfirmationStep.messages.js +23 -0
- package/build/legacy/step/externalConfirmationStep/index.js +1 -0
- package/build/legacy/step/index.js +3 -0
- package/build/legacy/step/layoutStep/LayoutStep.js +33 -0
- package/build/legacy/step/layoutStep/index.js +1 -0
- package/build/legacy/step/layoutStep/utils/index.js +2 -0
- package/build/legacy/step/layoutStep/utils/inline-reference-utils.js +105 -0
- package/build/legacy/step/layoutStep/utils/layout-utils.js +212 -0
- package/build/main.js +13 -28
- package/build/main.min.js +1 -1
- package/build/main.mjs +13 -28
- package/build/types/revamp/domain/features/events.d.ts +1 -1
- package/package.json +2 -2
|
@@ -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,124 @@
|
|
|
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 { jsx as _jsx } from "react/jsx-runtime";
|
|
38
|
+
import { useEffect, useState } from 'react';
|
|
39
|
+
import { useEventDispatcher } from '../../common/contexts';
|
|
40
|
+
import { filterHiddenSchemas, isObjectSchema } from '../../common/utils';
|
|
41
|
+
import CameraCapture from './cameraCapture';
|
|
42
|
+
function blobToBase64(blob) {
|
|
43
|
+
return new Promise(function (resolve, _) {
|
|
44
|
+
// we can safely assume the type of reader.result is string
|
|
45
|
+
// because we're calling reader.readAsDataURL
|
|
46
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/FileReader/result
|
|
47
|
+
var reader = new FileReader();
|
|
48
|
+
reader.onloadend = function () { return resolve(reader.result); };
|
|
49
|
+
reader.readAsDataURL(blob);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function CameraStep(props) {
|
|
53
|
+
var _this = this;
|
|
54
|
+
var step = props.step, model = props.model, onModelChange = props.onModelChange, onAction = props.onAction;
|
|
55
|
+
var onEvent = useEventDispatcher();
|
|
56
|
+
var objectSchema = getObjectSchema(step);
|
|
57
|
+
var cameraSchema = getCameraSchema(step);
|
|
58
|
+
var action = getFirstAction(step);
|
|
59
|
+
var title = cameraSchema.title, image = cameraSchema.image, cameraConfig = cameraSchema.cameraConfig;
|
|
60
|
+
var _a = cameraConfig || {}, assets = _a.assets, direction = _a.direction, instructions = _a.instructions;
|
|
61
|
+
var _b = assets || {}, overlay = _b.overlay, outline = _b.outline;
|
|
62
|
+
var imageUrl = (image || {}).url;
|
|
63
|
+
var _c = useState(false), captureClicked = _c[0], setCaptureClicked = _c[1];
|
|
64
|
+
// We need to wait for model to update before we call onAction()
|
|
65
|
+
useEffect(function () {
|
|
66
|
+
if (captureClicked) {
|
|
67
|
+
onAction(action);
|
|
68
|
+
}
|
|
69
|
+
}, [model]);
|
|
70
|
+
var handleCapture = function (blob) { return __awaiter(_this, void 0, void 0, function () {
|
|
71
|
+
var $id, newValue, newModel;
|
|
72
|
+
var _a;
|
|
73
|
+
return __generator(this, function (_b) {
|
|
74
|
+
switch (_b.label) {
|
|
75
|
+
case 0:
|
|
76
|
+
$id = cameraSchema.$id;
|
|
77
|
+
if (!blob) return [3 /*break*/, 2];
|
|
78
|
+
return [4 /*yield*/, blobToBase64(blob)];
|
|
79
|
+
case 1:
|
|
80
|
+
newValue = _b.sent();
|
|
81
|
+
newModel = (_a = {}, _a[$id || ''] = newValue, _a);
|
|
82
|
+
setCaptureClicked(true);
|
|
83
|
+
onModelChange({
|
|
84
|
+
model: newModel,
|
|
85
|
+
formSchema: objectSchema,
|
|
86
|
+
triggerModel: newValue,
|
|
87
|
+
triggerSchema: cameraSchema
|
|
88
|
+
});
|
|
89
|
+
_b.label = 2;
|
|
90
|
+
case 2: return [2 /*return*/];
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}); };
|
|
94
|
+
return (_jsx(CameraCapture, { overlay: overlay, outline: outline, title: title, imageUrl: imageUrl, instructions: instructions, direction: direction, onEvent: onEvent, onCapture: function (blob) {
|
|
95
|
+
void handleCapture(blob);
|
|
96
|
+
} }));
|
|
97
|
+
}
|
|
98
|
+
export default CameraStep;
|
|
99
|
+
function getObjectSchema(step) {
|
|
100
|
+
var nonHiddenSchemas = filterHiddenSchemas(step.schemas || []);
|
|
101
|
+
var objectSchema = nonHiddenSchemas[0];
|
|
102
|
+
if (!objectSchema || !isObjectSchema(objectSchema)) {
|
|
103
|
+
throw new Error('The first schema in a camera step is expected to be of type object and have at least one property with a schema...');
|
|
104
|
+
}
|
|
105
|
+
return objectSchema;
|
|
106
|
+
}
|
|
107
|
+
function getCameraSchema(step) {
|
|
108
|
+
var objectSchema = getObjectSchema(step);
|
|
109
|
+
var firstProperty = Object.values(objectSchema.properties)[0];
|
|
110
|
+
if (!firstProperty) {
|
|
111
|
+
throw new Error('The first schema in a camera step is expected to be of type object and have at least one property with a schema...');
|
|
112
|
+
}
|
|
113
|
+
return firstProperty;
|
|
114
|
+
}
|
|
115
|
+
function getFirstAction(step) {
|
|
116
|
+
var _a, _b;
|
|
117
|
+
if (!step.schemas || ((_a = filterHiddenSchemas(step.schemas)) === null || _a === void 0 ? void 0 : _a.length) !== 1) {
|
|
118
|
+
throw new Error('camera step expects 1 non-hidden object schema');
|
|
119
|
+
}
|
|
120
|
+
if (((_b = step === null || step === void 0 ? void 0 : step.actions) === null || _b === void 0 ? void 0 : _b.length) !== 1) {
|
|
121
|
+
throw new Error('camera step expects 1 action');
|
|
122
|
+
}
|
|
123
|
+
return step.actions[0];
|
|
124
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
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, jsxs as _jsxs } from "react/jsx-runtime";
|
|
49
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
50
|
+
import { useIntl } from 'react-intl';
|
|
51
|
+
import Webcam from 'react-webcam';
|
|
52
|
+
import { isMobile } from '../../../common/utils/mobile-utils';
|
|
53
|
+
import messages from './CameraCapture.messages';
|
|
54
|
+
import { CaptureBottomBar, ReviewBottomBar, OrientationLockOverlay } from './components';
|
|
55
|
+
import { CameraErrorScreen } from './screens';
|
|
56
|
+
import { useFullScreenOrientationLock } from './hooks/useFullScreenOrientationLock';
|
|
57
|
+
import { useVideoConstraints } from './hooks/useVideoConstraints';
|
|
58
|
+
import Overlay from './overlay/Overlay';
|
|
59
|
+
import { trackCameraFeedStarted, trackCameraError } from './tracking';
|
|
60
|
+
import { CameraMode } from './types';
|
|
61
|
+
import { generateCanvasFromVideo, isSelfieCamera } from './utils';
|
|
62
|
+
function CameraCapture(_a) {
|
|
63
|
+
var _this = this;
|
|
64
|
+
var _b = _a.direction, direction = _b === void 0 ? 'back' : _b, _c = _a.overlay, overlay = _c === void 0 ? '' : _c, _d = _a.outline, outline = _d === void 0 ? '' : _d, _e = _a.imageUrl, imageUrl = _e === void 0 ? '' : _e, _f = _a.title, title = _f === void 0 ? '' : _f, _g = _a.instructions, instructions = _g === void 0 ? '' : _g, _h = _a.showReview, showReview = _h === void 0 ? false : _h, onCapture = _a.onCapture, onEvent = _a.onEvent;
|
|
65
|
+
var _j = useState(CameraMode.CAPTURE), mode = _j[0], setMode = _j[1];
|
|
66
|
+
var _k = useState(), cameraError = _k[0], setCameraError = _k[1];
|
|
67
|
+
var _l = useState(false), isVideoMirrored = _l[0], setIsVideoMirrored = _l[1];
|
|
68
|
+
var _m = useState(false), ready = _m[0], setReady = _m[1];
|
|
69
|
+
var _o = useState(), reviewImage = _o[0], setReviewImage = _o[1];
|
|
70
|
+
var webcamReference = useRef(null);
|
|
71
|
+
var videoConstraints = useVideoConstraints(direction).videoConstraints;
|
|
72
|
+
var shouldLockOrientation = useMemo(function () { return !!(isMobile() && mode === CameraMode.CAPTURE); }, [mode]);
|
|
73
|
+
var _p = useFullScreenOrientationLock(shouldLockOrientation, onEvent), enterFullScreen = _p.enterFullScreen, exitFullScreen = _p.exitFullScreen;
|
|
74
|
+
var intl = useIntl();
|
|
75
|
+
var handleCapture = useCallback(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
76
|
+
var canvas;
|
|
77
|
+
var _a, _b, _c, _d, _e, _f;
|
|
78
|
+
return __generator(this, function (_g) {
|
|
79
|
+
switch (_g.label) {
|
|
80
|
+
case 0:
|
|
81
|
+
if (!(((_a = webcamReference === null || webcamReference === void 0 ? void 0 : webcamReference.current) === null || _a === void 0 ? void 0 : _a.video) && ((_c = (_b = webcamReference === null || webcamReference === void 0 ? void 0 : webcamReference.current) === null || _b === void 0 ? void 0 : _b.video) === null || _c === void 0 ? void 0 : _c.readyState) >= 3)) return [3 /*break*/, 2];
|
|
82
|
+
(_e = (_d = webcamReference === null || webcamReference === void 0 ? void 0 : webcamReference.current) === null || _d === void 0 ? void 0 : _d.video) === null || _e === void 0 ? void 0 : _e.pause();
|
|
83
|
+
return [4 /*yield*/, generateCanvasFromVideo((_f = webcamReference === null || webcamReference === void 0 ? void 0 : webcamReference.current) === null || _f === void 0 ? void 0 : _f.video)];
|
|
84
|
+
case 1:
|
|
85
|
+
canvas = _g.sent();
|
|
86
|
+
canvas === null || canvas === void 0 ? void 0 : canvas.toBlob(function (blob) {
|
|
87
|
+
if (blob) {
|
|
88
|
+
if (showReview) {
|
|
89
|
+
var source = window.URL.createObjectURL(blob);
|
|
90
|
+
setReviewImage({ source: source, blob: blob });
|
|
91
|
+
setMode(CameraMode.REVIEW);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
onCapture(blob);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}, 'image/jpeg', 0.92);
|
|
98
|
+
_g.label = 2;
|
|
99
|
+
case 2: return [2 /*return*/];
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}); }, [webcamReference, showReview, setReviewImage, setMode, onCapture, isVideoMirrored]);
|
|
103
|
+
var handleUserMediaError = useCallback(function (error) {
|
|
104
|
+
setMode(CameraMode.ERROR);
|
|
105
|
+
if (error instanceof DOMException) {
|
|
106
|
+
switch (error === null || error === void 0 ? void 0 : error.name) {
|
|
107
|
+
case 'NotAllowedError':
|
|
108
|
+
setCameraError({
|
|
109
|
+
title: intl.formatMessage(messages.noCameraAccessTitle),
|
|
110
|
+
description: intl.formatMessage(messages.noCameraAccessParagraph),
|
|
111
|
+
actionButton: intl.formatMessage(messages.noCameraAccessAction),
|
|
112
|
+
onAction: handleRetryCameraAccess
|
|
113
|
+
});
|
|
114
|
+
trackCameraError('Dynamic Flow - Camera Permission Denied', onEvent, error);
|
|
115
|
+
return;
|
|
116
|
+
case 'NotFoundError':
|
|
117
|
+
case 'OverconstrainedError':
|
|
118
|
+
case 'AbortError':
|
|
119
|
+
case 'NotReadableError':
|
|
120
|
+
setCameraError({
|
|
121
|
+
title: intl.formatMessage(messages.cameraConnectionIssueTitle),
|
|
122
|
+
description: intl.formatMessage(messages.cameraConnectionIssueParagraph),
|
|
123
|
+
actionButton: intl.formatMessage(messages.cameraConnectionIssueAction),
|
|
124
|
+
onAction: handleRetryCameraAccess
|
|
125
|
+
});
|
|
126
|
+
trackCameraError('Dynamic Flow - Camera Not Accessible', onEvent, error);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
setCameraError({
|
|
131
|
+
title: intl.formatMessage(messages.cameraNotSupportedTitle),
|
|
132
|
+
description: intl.formatMessage(messages.cameraNotSupportedParagraph)
|
|
133
|
+
});
|
|
134
|
+
trackCameraError('Dynamic Flow - Camera Not Supported', onEvent, error);
|
|
135
|
+
}, [intl, onEvent]);
|
|
136
|
+
var handleUserMedia = useCallback(function (stream) {
|
|
137
|
+
enterFullScreen();
|
|
138
|
+
setReady(true);
|
|
139
|
+
setIsVideoMirrored(isSelfieCamera(stream));
|
|
140
|
+
void trackCameraFeedStarted(onEvent, { direction: direction }, stream);
|
|
141
|
+
}, [setIsVideoMirrored, onEvent, direction, enterFullScreen]);
|
|
142
|
+
var handleReviewSubmit = function () {
|
|
143
|
+
onCapture((reviewImage === null || reviewImage === void 0 ? void 0 : reviewImage.blob) || null);
|
|
144
|
+
};
|
|
145
|
+
var handleReviewRetry = function () {
|
|
146
|
+
setMode(CameraMode.CAPTURE);
|
|
147
|
+
setReviewImage(undefined);
|
|
148
|
+
};
|
|
149
|
+
var handleRetryCameraAccess = function () { return setMode(CameraMode.CAPTURE); };
|
|
150
|
+
useEffect(function () {
|
|
151
|
+
if (mode !== CameraMode.CAPTURE) {
|
|
152
|
+
exitFullScreen();
|
|
153
|
+
}
|
|
154
|
+
}, [mode, exitFullScreen]);
|
|
155
|
+
var captureScreen = (_jsxs("div", __assign({ className: "camera-capture" }, { children: [videoConstraints && (_jsx(Webcam, { ref: webcamReference, audio: false, videoConstraints: videoConstraints, mirrored: isVideoMirrored, onUserMediaError: handleUserMediaError, onUserMedia: handleUserMedia })), _jsx(Overlay, { overlay: overlay, outline: outline, imageUrl: imageUrl, title: title, instructions: instructions }), shouldLockOrientation && _jsx(OrientationLockOverlay, {}), ready && (_jsx(CaptureBottomBar, { onCapture: function () {
|
|
156
|
+
void handleCapture();
|
|
157
|
+
} }))] })));
|
|
158
|
+
var reviewScreen = (_jsxs("div", __assign({ className: "camera-capture" }, { children: [_jsx("img", { className: "review-image", src: reviewImage === null || reviewImage === void 0 ? void 0 : reviewImage.source, alt: "" }), _jsx(Overlay, { overlay: overlay, imageUrl: imageUrl, title: title, instructions: instructions, reviewInstructions: intl.formatMessage(messages.reviewInstructions) }), _jsx(ReviewBottomBar, { onSubmit: handleReviewSubmit, onRetry: handleReviewRetry })] })));
|
|
159
|
+
return (_jsxs("section", { children: [mode === CameraMode.CAPTURE && captureScreen, mode === CameraMode.REVIEW && reviewScreen, mode === CameraMode.ERROR && cameraError && _jsx(CameraErrorScreen, __assign({}, cameraError))] }));
|
|
160
|
+
}
|
|
161
|
+
export default CameraCapture;
|
|
@@ -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
|
+
});
|