@opexa/portal-components 0.0.487 → 0.0.489
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/dist/client/hooks/useCreateMemberVerificationMutation.js +1 -0
- package/dist/components/KYC/KYCReminder.lazy.js +5 -2
- package/dist/components/KYC/KYCSumsub.js +118 -114
- package/dist/components/KYC/KycOpenOnHomeMount.js +3 -1
- package/dist/constants/EnvVar.d.ts +1 -1
- package/dist/services/queries.d.ts +1 -1
- package/dist/services/queries.js +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/ui/AlertDialog/AlertDialog.d.ts +88 -88
- package/dist/ui/AlertDialog/alertDialog.recipe.d.ts +8 -8
- package/dist/ui/Badge/Badge.d.ts +12 -12
- package/dist/ui/Badge/badge.anatomy.d.ts +1 -1
- package/dist/ui/Badge/badge.recipe.d.ts +3 -3
- package/dist/ui/Carousel/Carousel.d.ts +72 -72
- package/dist/ui/Carousel/carousel.recipe.d.ts +8 -8
- package/dist/ui/Checkbox/Checkbox.d.ts +23 -23
- package/dist/ui/Checkbox/checkbox.recipe.d.ts +3 -3
- package/dist/ui/Clipboard/Clipboard.d.ts +18 -18
- package/dist/ui/Clipboard/clipboard.recipe.d.ts +3 -3
- package/dist/ui/Collapsible/Collapsible.d.ts +20 -20
- package/dist/ui/Collapsible/collapsible.recipe.d.ts +5 -5
- package/dist/ui/Combobox/Combobox.d.ts +42 -42
- package/dist/ui/Combobox/combobox.recipe.d.ts +3 -3
- package/dist/ui/DatePicker/DatePicker.d.ts +72 -72
- package/dist/ui/DatePicker/datePicker.recipe.d.ts +3 -3
- package/dist/ui/Dialog/Dialog.d.ts +33 -33
- package/dist/ui/Dialog/dialog.recipe.d.ts +3 -3
- package/dist/ui/Drawer/Drawer.d.ts +33 -33
- package/dist/ui/Drawer/drawer.recipe.d.ts +3 -3
- package/dist/ui/Menu/Menu.d.ts +144 -144
- package/dist/ui/Menu/menu.recipe.d.ts +8 -8
- package/dist/ui/PasswordInput/PasswordInput.d.ts +18 -18
- package/dist/ui/PasswordInput/passwordInput.recipe.d.ts +3 -3
- package/dist/ui/Progress/Progress.d.ts +27 -27
- package/dist/ui/Progress/progress.recipe.d.ts +3 -3
- package/dist/ui/QrCode/QrCode.d.ts +25 -25
- package/dist/ui/QrCode/qrCode.recipe.d.ts +5 -5
- package/dist/ui/SegmentGroup/SegmentGroup.d.ts +18 -18
- package/dist/ui/SegmentGroup/segmentGroup.recipe.d.ts +3 -3
- package/dist/ui/Select/Select.d.ts +45 -45
- package/dist/ui/Select/select.recipe.d.ts +3 -3
- package/dist/ui/Table/Table.d.ts +21 -21
- package/dist/ui/Table/table.anatomy.d.ts +1 -1
- package/dist/ui/Table/table.recipe.d.ts +3 -3
- package/dist/ui/Tabs/Tabs.d.ts +15 -15
- package/dist/ui/Tabs/tabs.recipe.d.ts +3 -3
- package/package.json +1 -1
|
@@ -28,6 +28,7 @@ export const useCreateMemberVerificationMutation = (config) => {
|
|
|
28
28
|
status: 'UNVERIFIED',
|
|
29
29
|
selfieImage: { id: data.selfieImage ?? '', status: 'UPLOADING' },
|
|
30
30
|
idFrontImage: { id: data.idFrontImage ?? '', status: 'UPLOADING' },
|
|
31
|
+
sumsubVerified: false,
|
|
31
32
|
};
|
|
32
33
|
});
|
|
33
34
|
queryClient.setQueryData(getAccountQueryKey(), (prev) => {
|
|
@@ -42,12 +42,15 @@ export function KYCReminder(props) {
|
|
|
42
42
|
isNil(verification?.selfieImage) ||
|
|
43
43
|
isEmpty(verification?.selfieImage) ||
|
|
44
44
|
isNil(verification?.idFrontImage) ||
|
|
45
|
-
isEmpty(verification?.idFrontImage)
|
|
45
|
+
isEmpty(verification?.idFrontImage) ||
|
|
46
|
+
!isVerificationLocked;
|
|
46
47
|
return (_jsx(Dialog.Root, { open: !sessionLoading &&
|
|
47
48
|
!accountLoading &&
|
|
48
49
|
!verificationLoading &&
|
|
49
50
|
globalStore.kycReminder.open &&
|
|
50
|
-
|
|
51
|
+
(enabled
|
|
52
|
+
? true
|
|
53
|
+
: !isVerificationLocked && !globalStore.kyc.open) &&
|
|
51
54
|
session?.status === 'authenticated' &&
|
|
52
55
|
hasMissingData, onOpenChange: (details) => {
|
|
53
56
|
globalStore.kycReminder.setOpen(details.open);
|
|
@@ -5,8 +5,8 @@ import { useEffect, useState } from 'react';
|
|
|
5
5
|
import { useShallow } from 'zustand/shallow';
|
|
6
6
|
import { useGenerateSumsubVerificationTokenMutation } from '../../client/hooks/useGenerateSumsubVerificationTokenMutation.js';
|
|
7
7
|
import { useGlobalStore } from '../../client/hooks/useGlobalStore.js';
|
|
8
|
+
import { useMemberVerificationQuery } from '../../client/hooks/useMemberVerificationQuery.js';
|
|
8
9
|
import { Spinner02Icon } from '../../icons/Spinner02Icon.js';
|
|
9
|
-
import { XIcon } from '../../icons/XIcon.js';
|
|
10
10
|
import { Dialog } from '../../ui/Dialog/index.js';
|
|
11
11
|
import { Portal } from '../../ui/Portal/index.js';
|
|
12
12
|
import { getQueryClient } from '../../utils/getQueryClient.js';
|
|
@@ -14,6 +14,11 @@ import { getAccountQueryKey, getMemberVerificationQueryKey, getProfileCompletion
|
|
|
14
14
|
import { KYCReminder } from './KYCReminder.js';
|
|
15
15
|
export function KYCSumsub(props) {
|
|
16
16
|
const [open, setOpen] = useGlobalStore(useShallow((ctx) => [ctx.kyc.open, ctx.kyc.setOpen]));
|
|
17
|
+
const memberVerification = useMemberVerificationQuery();
|
|
18
|
+
const isVerified = memberVerification.data?.status === 'VERIFIED' ||
|
|
19
|
+
memberVerification.data?.sumsubVerified === true ||
|
|
20
|
+
memberVerification.data?.status === 'APPROVED' ||
|
|
21
|
+
memberVerification.data?.status === 'PENDING';
|
|
17
22
|
const { mutate, mutateAsync, reset, isPending, isIdle } = useGenerateSumsubVerificationTokenMutation();
|
|
18
23
|
const [token, setToken] = useState('');
|
|
19
24
|
useEffect(() => {
|
|
@@ -31,124 +36,123 @@ export function KYCSumsub(props) {
|
|
|
31
36
|
isIdle,
|
|
32
37
|
mutate,
|
|
33
38
|
]);
|
|
34
|
-
return (_jsxs(_Fragment, { children: [_jsx(Dialog.Root, { open: open, onOpenChange: (details) => {
|
|
39
|
+
return (_jsxs(_Fragment, { children: [_jsx(Dialog.Root, { open: open && !isVerified, onOpenChange: (details) => {
|
|
35
40
|
setOpen(details.open);
|
|
36
41
|
}, lazyMount: true, unmountOnExit: true, closeOnEscape: false, closeOnInteractOutside: false, onExitComplete: () => {
|
|
37
42
|
reset();
|
|
38
43
|
setToken('');
|
|
39
|
-
}, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, {}), _jsx(Dialog.Positioner, { className: "flex items-center justify-center lg:block", children:
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
{
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
"reviewStatus": "completed",
|
|
78
|
-
"priority": 0
|
|
79
|
-
}
|
|
44
|
+
}, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, {}), _jsx(Dialog.Positioner, { className: "flex items-center justify-center lg:block", children: _jsx(Dialog.Content, { className: "mx-auto flex h-full w-[calc(100%-2rem)] flex-col items-center justify-center overflow-y-auto rounded-md bg-transparent p-0 lg:mt-3 lg:block lg:h-auto lg:w-[600px]", children: isPending ? (_jsx("div", { className: "w-full rounded-md bg-[#20252c] px-4 py-12", children: _jsx(Spinner02Icon, { className: "mx-auto size-8" }) })) : (_jsx("div", { className: "max-h-[calc(96dvh-2rem)] w-full overflow-y-auto lg:h-auto lg:max-h-[unset]", children: _jsx(Sumsub, { accessToken: token, expirationHandler: async () => {
|
|
45
|
+
const token = await mutateAsync();
|
|
46
|
+
return token;
|
|
47
|
+
}, config: {
|
|
48
|
+
lang: 'en',
|
|
49
|
+
theme: 'dark',
|
|
50
|
+
}, options: {
|
|
51
|
+
debug: process.env.NODE_ENV === 'development',
|
|
52
|
+
addViewportTag: false,
|
|
53
|
+
adaptIframeHeight: true,
|
|
54
|
+
enableScrollIntoView: true,
|
|
55
|
+
}, onMessage: (type, payload) => {
|
|
56
|
+
/*
|
|
57
|
+
|
|
58
|
+
------------------------
|
|
59
|
+
REJECTED
|
|
60
|
+
------------------------
|
|
61
|
+
|
|
62
|
+
{
|
|
63
|
+
"type": "idCheck.onApplicantStatusChanged",
|
|
64
|
+
"payload": {
|
|
65
|
+
"reviewId": "toJnn",
|
|
66
|
+
"attemptId": "ooaKO",
|
|
67
|
+
"attemptCnt": 1,
|
|
68
|
+
"elapsedSincePendingMs": 1072,
|
|
69
|
+
"elapsedSinceQueuedMs": 1072,
|
|
70
|
+
"reprocessing": true,
|
|
71
|
+
"levelName": "id-and-liveness",
|
|
72
|
+
"levelAutoCheckMode": null,
|
|
73
|
+
"createDate": "2025-07-18 02:08:16+0000",
|
|
74
|
+
"reviewDate": "2025-07-18 02:08:17+0000",
|
|
75
|
+
"reviewResult": {
|
|
76
|
+
"moderationComment": "We couldn’t verify your...",
|
|
77
|
+
"reviewAnswer": "RED",
|
|
78
|
+
"reviewRejectType": "FINAL"
|
|
79
|
+
},
|
|
80
|
+
"reviewStatus": "completed",
|
|
81
|
+
"priority": 0
|
|
80
82
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
------------------------
|
|
86
|
+
APPROVED
|
|
87
|
+
------------------------
|
|
88
|
+
|
|
89
|
+
{
|
|
90
|
+
"type": "idCheck.onApplicantStatusChanged",
|
|
91
|
+
"payload": {
|
|
92
|
+
"reviewId": "RCAdU",
|
|
93
|
+
"attemptId": "iaOXv",
|
|
94
|
+
"attemptCnt": 1,
|
|
95
|
+
"elapsedSincePendingMs": 1956,
|
|
96
|
+
"elapsedSinceQueuedMs": 1956,
|
|
97
|
+
"reprocessing": true,
|
|
98
|
+
"levelName": "id-and-selfie",
|
|
99
|
+
"levelAutoCheckMode": null,
|
|
100
|
+
"createDate": "2025-07-18 02:17:52+0000",
|
|
101
|
+
"reviewDate": "2025-07-18 02:17:54+0000",
|
|
102
|
+
"reviewResult": {
|
|
103
|
+
"reviewAnswer": "GREEN"
|
|
104
|
+
},
|
|
105
|
+
"reviewStatus": "completed",
|
|
106
|
+
"priority": 0
|
|
105
107
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
*/
|
|
111
|
+
console.log({
|
|
112
|
+
type,
|
|
113
|
+
payload,
|
|
114
|
+
});
|
|
115
|
+
const queryClient = getQueryClient();
|
|
116
|
+
if (type === 'idCheck.onApplicantStatusChanged' &&
|
|
117
|
+
isObject(payload) &&
|
|
118
|
+
'reviewStatus' in payload &&
|
|
119
|
+
payload.reviewStatus === 'completed' &&
|
|
120
|
+
'reviewResult' in payload &&
|
|
121
|
+
isObject(payload.reviewResult) &&
|
|
122
|
+
'reviewAnswer' in payload.reviewResult &&
|
|
123
|
+
payload.reviewResult.reviewAnswer === 'GREEN') {
|
|
124
|
+
queryClient.setQueryData(getMemberVerificationQueryKey(), (prev) => ({
|
|
125
|
+
id: '',
|
|
126
|
+
address: '',
|
|
127
|
+
nationality: '',
|
|
128
|
+
natureOfWork: '',
|
|
129
|
+
placeOfBirth: '',
|
|
130
|
+
sourceOfIncome: '',
|
|
131
|
+
permanentAddress: '',
|
|
132
|
+
selfieImage: { id: '', url: '', status: 'READY' },
|
|
133
|
+
idFrontImage: { id: '', url: '', status: 'READY' },
|
|
134
|
+
...(prev ?? {}),
|
|
135
|
+
status: 'APPROVED',
|
|
136
|
+
sumsubVerified: true,
|
|
137
|
+
}));
|
|
138
|
+
queryClient.setQueryData(getAccountQueryKey(), (prev) => {
|
|
139
|
+
if (!prev)
|
|
140
|
+
return prev;
|
|
141
|
+
return {
|
|
142
|
+
...prev,
|
|
143
|
+
verified: true,
|
|
144
|
+
};
|
|
111
145
|
});
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
nationality: '',
|
|
125
|
-
natureOfWork: '',
|
|
126
|
-
placeOfBirth: '',
|
|
127
|
-
sourceOfIncome: '',
|
|
128
|
-
permanentAddress: '',
|
|
129
|
-
selfieImage: { id: '', url: '', status: 'READY' },
|
|
130
|
-
idFrontImage: { id: '', url: '', status: 'READY' },
|
|
131
|
-
...(prev ?? {}),
|
|
132
|
-
status: 'APPROVED',
|
|
133
|
-
}));
|
|
134
|
-
queryClient.setQueryData(getAccountQueryKey(), (prev) => {
|
|
135
|
-
if (!prev)
|
|
136
|
-
return prev;
|
|
137
|
-
return {
|
|
138
|
-
...prev,
|
|
139
|
-
verified: true,
|
|
140
|
-
};
|
|
141
|
-
});
|
|
142
|
-
queryClient.setQueryData(getProfileCompletionQueryKey(), (prev) => {
|
|
143
|
-
if (!prev)
|
|
144
|
-
return prev;
|
|
145
|
-
return {
|
|
146
|
-
...prev,
|
|
147
|
-
accountVerification: true,
|
|
148
|
-
};
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
}, onError: (error) => {
|
|
152
|
-
console.warn(error);
|
|
153
|
-
}, className: "block max-h-full w-full overflow-y-auto rounded-md", force: true }) }))] }) })] }) }), _jsx(KYCReminder, { ...props })] }));
|
|
146
|
+
queryClient.setQueryData(getProfileCompletionQueryKey(), (prev) => {
|
|
147
|
+
if (!prev)
|
|
148
|
+
return prev;
|
|
149
|
+
return {
|
|
150
|
+
...prev,
|
|
151
|
+
accountVerification: true,
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}, onError: (error) => {
|
|
156
|
+
console.warn(error);
|
|
157
|
+
}, className: "block max-h-full w-full overflow-y-auto rounded-md", force: true }) })) }) })] }) }), _jsx(KYCReminder, { ...props })] }));
|
|
154
158
|
}
|
|
@@ -4,11 +4,13 @@ import { usePathname } from "next/navigation";
|
|
|
4
4
|
import { useGlobalStore } from "../../client/hooks/useGlobalStore.js";
|
|
5
5
|
export function KycOpenOnHomeMount() {
|
|
6
6
|
const setkycReminderOpen = useGlobalStore((s) => s.kycReminder.setOpen);
|
|
7
|
+
const setkycOpen = useGlobalStore((s) => s.kyc.setOpen);
|
|
7
8
|
const pathname = usePathname();
|
|
8
9
|
useEffect(() => {
|
|
9
10
|
if (pathname === "/") {
|
|
10
11
|
setkycReminderOpen(true);
|
|
12
|
+
setkycOpen(true);
|
|
11
13
|
}
|
|
12
|
-
}, [pathname, setkycReminderOpen]);
|
|
14
|
+
}, [pathname, setkycReminderOpen, setkycOpen]);
|
|
13
15
|
return null;
|
|
14
16
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const SITE_ID: string;
|
|
2
2
|
export declare const PLATFORM_ID: string;
|
|
3
3
|
export declare const PLATFORM_CODE: string;
|
|
4
|
-
export declare const ENVIRONMENT: "
|
|
4
|
+
export declare const ENVIRONMENT: "development" | "production";
|
|
5
5
|
export declare const INTERNALS__REPORT_WEB_VITALS: boolean;
|
|
@@ -69,7 +69,7 @@ export declare const MEMBER = "\n query Member {\n member {\n dateTimeL
|
|
|
69
69
|
* _aka_ `Query.self`
|
|
70
70
|
*/
|
|
71
71
|
export declare const MEMBER_ACCOUNT = "\n query MemberAccount {\n memberAccount: self {\n ... on MemberAccount {\n id\n name\n status\n realName\n emailAddress\n mobileNumber\n birthDay\n verified\n verificationStatus\n nickName\n validId\n mobileNumberVerified\n mobileNumberVerificationRequired\n transactionPassword\n secretAnswerSubmitted\n dateTimeCreated\n dateTimeLastUpdated\n googleId\n facebookId\n cellxpertDetails {\n cxd\n dateTimeLastUpdated\n }\n }\n }\n }\n";
|
|
72
|
-
export declare const MEMBER_VERIFICATION = "\n \n fragment FileFragment on File {\n id\n url\n status\n }\n\n\n query MemberVerification {\n memberAccount: self {\n ... on MemberAccount {\n verification {\n id\n status\n address\n permanentAddress\n sourceOfIncome\n natureOfWork\n nationality\n placeOfBirth\n idFrontImage {\n ...FileFragment\n }\n selfieImage {\n ...FileFragment\n }\n }\n }\n }\n }\n";
|
|
72
|
+
export declare const MEMBER_VERIFICATION = "\n \n fragment FileFragment on File {\n id\n url\n status\n }\n\n\n query MemberVerification {\n memberAccount: self {\n ... on MemberAccount {\n verification {\n id\n status\n address\n permanentAddress\n sourceOfIncome\n natureOfWork\n nationality\n placeOfBirth\n idFrontImage {\n ...FileFragment\n }\n selfieImage {\n ...FileFragment\n }\n sumsubVerified\n }\n }\n }\n }\n";
|
|
73
73
|
export declare const REGISTER_MEMBER_ACCOUNT = "\n mutation RegisterMemberAccount(\n $input: RegisterMemberAccountInput!\n $referralCode: String\n $verificationCode: String\n $reCAPTCHAResponse: String\n ) {\n registerMemberAccount(\n input: $input\n referralCode: $referralCode\n verificationCode: $verificationCode\n reCAPTCHAResponse: $reCAPTCHAResponse\n ) {\n ... on AccountNameNotAvailableError {\n name: __typename\n message\n }\n ... on InvalidPlatformError {\n name: __typename\n message\n }\n ... on InvalidPlatformError {\n name: __typename\n message\n }\n ... on InvalidReCAPTCHAResponseError {\n name: __typename\n message\n }\n ... on InvalidSMSVerificationCodeError {\n name: __typename\n message\n }\n ... on MinimumAgeRequirementError {\n name: __typename\n message\n }\n ... on MobileNumberNotAvailableError {\n name: __typename\n message\n }\n ... on ReCAPTCHAVerificationFailedError {\n name: __typename\n message\n }\n }\n }\n";
|
|
74
74
|
export declare const REGISTER_MEMBER_ACCOUNT_BY_NAME = "\n mutation RegisterMemberAccountByName(\n $input: RegisterMemberAccountByNameInput!\n $reCAPTCHAResponse: String!\n ) {\n registerMemberAccountByName(\n input: $input\n reCAPTCHAResponse: $reCAPTCHAResponse\n ) {\n ... on AccountNameNotAvailableError {\n name: __typename\n message\n }\n ... on InvalidPlatformError {\n name: __typename\n message\n }\n ... on InvalidReCAPTCHAResponseError {\n name: __typename\n message\n }\n }\n }\n";
|
|
75
75
|
export declare const REGISTER_MEMBER_ACCOUNT_VIA_MOBILE = "\n mutation RegisterMemberAccountViaMobile(\n $input: RegisterMemberAccountViaMobileInput!\n $referralCode: String\n $reCAPTCHAResponse: String\n $verificationCode: String\n ) {\n registerMemberAccountViaMobile(\n input: $input\n referralCode: $referralCode\n verificationCode: $verificationCode\n reCAPTCHAResponse: $reCAPTCHAResponse\n ) {\n ... on InvalidPlatformError {\n name: __typename\n message\n }\n ... on InvalidReCAPTCHAResponseError {\n name: __typename\n message\n }\n ... on InvalidSMSVerificationCodeError {\n name: __typename\n message\n }\n ... on MobileNumberNotAvailableError {\n name: __typename\n message\n }\n ... on ReCAPTCHAVerificationFailedError {\n name: __typename\n message\n }\n }\n }\n";
|
package/dist/services/queries.js
CHANGED
package/dist/types/index.d.ts
CHANGED
|
@@ -475,6 +475,7 @@ export interface MemberVerification {
|
|
|
475
475
|
placeOfBirth: string;
|
|
476
476
|
idFrontImage: File;
|
|
477
477
|
selfieImage: File;
|
|
478
|
+
sumsubVerified: boolean;
|
|
478
479
|
}
|
|
479
480
|
export type SecretQuestion = 'FIRST_PET' | 'FIRST_CAR' | 'FIRST_SCHOOL' | 'FAVORITE_BOOK' | 'FAVORITE_TEACHER' | 'BEST_CHILDHOOD_FRIEND' | 'BIRTH_PLACE' | 'MOTHERS_MAIDEN_NAME' | 'PARENTS_MET_CITY' | 'FAVORITE_MOVIE';
|
|
480
481
|
export interface ProfileCompletion {
|