@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.
Files changed (47) hide show
  1. package/dist/client/hooks/useCreateMemberVerificationMutation.js +1 -0
  2. package/dist/components/KYC/KYCReminder.lazy.js +5 -2
  3. package/dist/components/KYC/KYCSumsub.js +118 -114
  4. package/dist/components/KYC/KycOpenOnHomeMount.js +3 -1
  5. package/dist/constants/EnvVar.d.ts +1 -1
  6. package/dist/services/queries.d.ts +1 -1
  7. package/dist/services/queries.js +1 -0
  8. package/dist/types/index.d.ts +1 -0
  9. package/dist/ui/AlertDialog/AlertDialog.d.ts +88 -88
  10. package/dist/ui/AlertDialog/alertDialog.recipe.d.ts +8 -8
  11. package/dist/ui/Badge/Badge.d.ts +12 -12
  12. package/dist/ui/Badge/badge.anatomy.d.ts +1 -1
  13. package/dist/ui/Badge/badge.recipe.d.ts +3 -3
  14. package/dist/ui/Carousel/Carousel.d.ts +72 -72
  15. package/dist/ui/Carousel/carousel.recipe.d.ts +8 -8
  16. package/dist/ui/Checkbox/Checkbox.d.ts +23 -23
  17. package/dist/ui/Checkbox/checkbox.recipe.d.ts +3 -3
  18. package/dist/ui/Clipboard/Clipboard.d.ts +18 -18
  19. package/dist/ui/Clipboard/clipboard.recipe.d.ts +3 -3
  20. package/dist/ui/Collapsible/Collapsible.d.ts +20 -20
  21. package/dist/ui/Collapsible/collapsible.recipe.d.ts +5 -5
  22. package/dist/ui/Combobox/Combobox.d.ts +42 -42
  23. package/dist/ui/Combobox/combobox.recipe.d.ts +3 -3
  24. package/dist/ui/DatePicker/DatePicker.d.ts +72 -72
  25. package/dist/ui/DatePicker/datePicker.recipe.d.ts +3 -3
  26. package/dist/ui/Dialog/Dialog.d.ts +33 -33
  27. package/dist/ui/Dialog/dialog.recipe.d.ts +3 -3
  28. package/dist/ui/Drawer/Drawer.d.ts +33 -33
  29. package/dist/ui/Drawer/drawer.recipe.d.ts +3 -3
  30. package/dist/ui/Menu/Menu.d.ts +144 -144
  31. package/dist/ui/Menu/menu.recipe.d.ts +8 -8
  32. package/dist/ui/PasswordInput/PasswordInput.d.ts +18 -18
  33. package/dist/ui/PasswordInput/passwordInput.recipe.d.ts +3 -3
  34. package/dist/ui/Progress/Progress.d.ts +27 -27
  35. package/dist/ui/Progress/progress.recipe.d.ts +3 -3
  36. package/dist/ui/QrCode/QrCode.d.ts +25 -25
  37. package/dist/ui/QrCode/qrCode.recipe.d.ts +5 -5
  38. package/dist/ui/SegmentGroup/SegmentGroup.d.ts +18 -18
  39. package/dist/ui/SegmentGroup/segmentGroup.recipe.d.ts +3 -3
  40. package/dist/ui/Select/Select.d.ts +45 -45
  41. package/dist/ui/Select/select.recipe.d.ts +3 -3
  42. package/dist/ui/Table/Table.d.ts +21 -21
  43. package/dist/ui/Table/table.anatomy.d.ts +1 -1
  44. package/dist/ui/Table/table.recipe.d.ts +3 -3
  45. package/dist/ui/Tabs/Tabs.d.ts +15 -15
  46. package/dist/ui/Tabs/tabs.recipe.d.ts +3 -3
  47. 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
- !globalStore.kyc.open &&
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: _jsxs(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: [_jsx(Dialog.Context, { children: (api) => (_jsx("div", { className: "mb-3 flex w-full justify-end", children: _jsxs("button", { type: "button", className: "rounded-full bg-white/10 p-1 text-white backdrop-blur-md", onClick: () => {
40
- api.setOpen(false);
41
- }, children: [_jsx(XIcon, { className: "!size-5" }), _jsx("span", { className: "sr-only", children: "Close" })] }) })) }), 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 () => {
42
- const token = await mutateAsync();
43
- return token;
44
- }, config: {
45
- lang: 'en',
46
- theme: 'dark',
47
- }, options: {
48
- debug: process.env.NODE_ENV === 'development',
49
- addViewportTag: false,
50
- adaptIframeHeight: true,
51
- enableScrollIntoView: true,
52
- }, onMessage: (type, payload) => {
53
- /*
54
-
55
- ------------------------
56
- REJECTED
57
- ------------------------
58
-
59
- {
60
- "type": "idCheck.onApplicantStatusChanged",
61
- "payload": {
62
- "reviewId": "toJnn",
63
- "attemptId": "ooaKO",
64
- "attemptCnt": 1,
65
- "elapsedSincePendingMs": 1072,
66
- "elapsedSinceQueuedMs": 1072,
67
- "reprocessing": true,
68
- "levelName": "id-and-liveness",
69
- "levelAutoCheckMode": null,
70
- "createDate": "2025-07-18 02:08:16+0000",
71
- "reviewDate": "2025-07-18 02:08:17+0000",
72
- "reviewResult": {
73
- "moderationComment": "We couldn’t verify your...",
74
- "reviewAnswer": "RED",
75
- "reviewRejectType": "FINAL"
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
- APPROVED
84
- ------------------------
85
-
86
- {
87
- "type": "idCheck.onApplicantStatusChanged",
88
- "payload": {
89
- "reviewId": "RCAdU",
90
- "attemptId": "iaOXv",
91
- "attemptCnt": 1,
92
- "elapsedSincePendingMs": 1956,
93
- "elapsedSinceQueuedMs": 1956,
94
- "reprocessing": true,
95
- "levelName": "id-and-selfie",
96
- "levelAutoCheckMode": null,
97
- "createDate": "2025-07-18 02:17:52+0000",
98
- "reviewDate": "2025-07-18 02:17:54+0000",
99
- "reviewResult": {
100
- "reviewAnswer": "GREEN"
101
- },
102
- "reviewStatus": "completed",
103
- "priority": 0
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
- console.log({
109
- type,
110
- payload,
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
- const queryClient = getQueryClient();
113
- if (type === 'idCheck.onApplicantStatusChanged' &&
114
- isObject(payload) &&
115
- 'reviewStatus' in payload &&
116
- payload.reviewStatus === 'completed' &&
117
- 'reviewResult' in payload &&
118
- isObject(payload.reviewResult) &&
119
- 'reviewAnswer' in payload.reviewResult &&
120
- payload.reviewResult.reviewAnswer === 'GREEN') {
121
- queryClient.setQueryData(getMemberVerificationQueryKey(), (prev) => ({
122
- id: '',
123
- address: '',
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: "production" | "development";
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";
@@ -1642,6 +1642,7 @@ export const MEMBER_VERIFICATION = /* GraphQL */ `
1642
1642
  selfieImage {
1643
1643
  ...FileFragment
1644
1644
  }
1645
+ sumsubVerified
1645
1646
  }
1646
1647
  }
1647
1648
  }
@@ -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 {