@opexa/portal-components 0.0.985 → 0.0.987

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 (72) hide show
  1. package/dist/client/hooks/useGlobalStore.d.ts +0 -1
  2. package/dist/client/hooks/useGlobalStore.js +0 -13
  3. package/dist/client/hooks/useVerifyMobileNumber.d.ts +3 -0
  4. package/dist/client/hooks/useVerifyMobileNumber.js +20 -0
  5. package/dist/components/AccountInfo/AccountInfo.js +0 -2
  6. package/dist/components/DepositWithdrawal/Deposit/AurixPayPayMayaDeposit/AurixPayGrabPayDeposit.d.ts +1 -0
  7. package/dist/components/DepositWithdrawal/Deposit/AurixPayPayMayaDeposit/AurixPayGrabPayDeposit.js +241 -0
  8. package/dist/components/KYC/KYCDefault/KYCDefault.d.ts +0 -1
  9. package/dist/components/KYC/KYCDefault/KYCDefault.js +2 -3
  10. package/dist/components/KYC/KYCDefault/PersonalInformation.js +0 -7
  11. package/dist/components/KYC/KYCDefault/useKYCDefault.d.ts +1 -2
  12. package/dist/components/KYC/KYCDefault/useKYCDefault.js +1 -2
  13. package/dist/components/KYC/KYCReview.js +5 -2
  14. package/dist/components/KYC/KycOpenOnHomeMount.js +61 -37
  15. package/dist/components/Messages/MessagesPopup.js +1 -3
  16. package/dist/components/SignUp/SignUp.d.ts +2 -1
  17. package/dist/components/SignUp/SignUp.js +7 -0
  18. package/dist/components/SignUp/SignUpKYC/SignUpKYCForm.js +22 -2
  19. package/dist/components/SignUp/SignUpLongForm/SignUpLongForm.d.ts +1 -0
  20. package/dist/components/SignUp/SignUpLongForm/SignUpLongForm.js +466 -0
  21. package/dist/components/SignUp/SignUpLongForm/SignUpLongForm.lazy.d.ts +18 -0
  22. package/dist/components/SignUp/SignUpLongForm/SignUpLongForm.lazy.js +26 -0
  23. package/dist/components/SignUp/SignUpLongForm/SignUpLongFormContext.d.ts +6 -0
  24. package/dist/components/SignUp/SignUpLongForm/SignUpLongFormContext.js +2 -0
  25. package/dist/components/SingleSignOn/SingleSignOn.d.ts +4 -0
  26. package/dist/components/SingleSignOn/SingleSignOn.js +185 -0
  27. package/dist/components/SingleSignOn/index.d.ts +1 -0
  28. package/dist/components/SingleSignOn/index.js +1 -0
  29. package/dist/lib/components/UpdateMobilePhoneNumber/UpdateMobilePhoneNumber.d.ts +1 -0
  30. package/dist/lib/components/UpdateMobilePhoneNumber/UpdateMobilePhoneNumber.js +152 -0
  31. package/dist/lib/components/UpdateMobilePhoneNumber/index.d.ts +1 -0
  32. package/dist/lib/components/UpdateMobilePhoneNumber/index.js +1 -0
  33. package/dist/schemas/forgotPasswordSchema.d.ts +5 -5
  34. package/dist/ui/AlertDialog/AlertDialog.d.ts +187 -187
  35. package/dist/ui/AlertDialog/alertDialog.recipe.d.ts +17 -17
  36. package/dist/ui/Badge/Badge.d.ts +12 -12
  37. package/dist/ui/Badge/badge.anatomy.d.ts +1 -1
  38. package/dist/ui/Badge/badge.recipe.d.ts +3 -3
  39. package/dist/ui/Carousel/Carousel.d.ts +99 -99
  40. package/dist/ui/Carousel/carousel.recipe.d.ts +11 -11
  41. package/dist/ui/Checkbox/Checkbox.d.ts +23 -23
  42. package/dist/ui/Checkbox/checkbox.recipe.d.ts +3 -3
  43. package/dist/ui/Clipboard/Clipboard.d.ts +18 -18
  44. package/dist/ui/Clipboard/clipboard.recipe.d.ts +3 -3
  45. package/dist/ui/Collapsible/Collapsible.d.ts +20 -20
  46. package/dist/ui/Collapsible/collapsible.recipe.d.ts +5 -5
  47. package/dist/ui/Combobox/Combobox.d.ts +42 -42
  48. package/dist/ui/Combobox/combobox.recipe.d.ts +3 -3
  49. package/dist/ui/DatePicker/DatePicker.d.ts +72 -72
  50. package/dist/ui/DatePicker/datePicker.recipe.d.ts +3 -3
  51. package/dist/ui/Dialog/Dialog.d.ts +33 -33
  52. package/dist/ui/Dialog/dialog.recipe.d.ts +3 -3
  53. package/dist/ui/Drawer/Drawer.d.ts +33 -33
  54. package/dist/ui/Drawer/drawer.recipe.d.ts +3 -3
  55. package/dist/ui/Menu/Menu.d.ts +360 -360
  56. package/dist/ui/Menu/menu.recipe.d.ts +20 -20
  57. package/dist/ui/Popover/Popover.d.ts +154 -154
  58. package/dist/ui/Popover/popover.recipe.d.ts +14 -14
  59. package/dist/ui/Progress/Progress.d.ts +27 -27
  60. package/dist/ui/Progress/progress.recipe.d.ts +3 -3
  61. package/dist/ui/SegmentGroup/SegmentGroup.d.ts +18 -18
  62. package/dist/ui/SegmentGroup/segmentGroup.recipe.d.ts +3 -3
  63. package/dist/ui/Select/Select.d.ts +45 -45
  64. package/dist/ui/Select/select.recipe.d.ts +3 -3
  65. package/dist/ui/Table/Table.d.ts +21 -21
  66. package/dist/ui/Table/table.anatomy.d.ts +1 -1
  67. package/dist/ui/Table/table.recipe.d.ts +3 -3
  68. package/dist/ui/Tabs/Tabs.d.ts +15 -15
  69. package/dist/ui/Tabs/tabs.recipe.d.ts +3 -3
  70. package/dist/ui/Tooltip/Tooltip.d.ts +30 -30
  71. package/dist/ui/Tooltip/tooltip.recipe.d.ts +5 -5
  72. package/package.json +1 -1
@@ -80,7 +80,6 @@ export interface GlobalStore {
80
80
  sidebar__mobile: PopupStore;
81
81
  kyc: PopupStore;
82
82
  kycReminder: PopupStore;
83
- kycReview: PopupStore;
84
83
  updateMobilePhoneNumber: PopupStore;
85
84
  spotBonus: PopupStore;
86
85
  registerBiometrics: PopupStore;
@@ -226,19 +226,6 @@ export const useGlobalStore = create()(devtools(subscribeWithSelector((set) => (
226
226
  },
227
227
  '~touched': false,
228
228
  },
229
- kycReview: {
230
- open: false,
231
- setOpen(open) {
232
- set((prev) => ({
233
- kycReview: {
234
- ...prev.kycReview,
235
- open,
236
- '~touched': true,
237
- },
238
- }));
239
- },
240
- '~touched': false,
241
- },
242
229
  updateMobilePhoneNumber: {
243
230
  open: false,
244
231
  setOpen(open) {
@@ -0,0 +1,3 @@
1
+ import { type VerifyMobileNumberInput } from '../../services/account';
2
+ import type { Mutation } from '../../types';
3
+ export declare const useVerifyMobileNumber: Mutation<void, VerifyMobileNumberInput>;
@@ -0,0 +1,20 @@
1
+ import { useMutation } from '@tanstack/react-query';
2
+ import invariant from 'tiny-invariant';
3
+ import { verifyMobileNumber, } from '../../services/account.js';
4
+ import { getVerifyMobileNumberMutationKey } from '../../utils/mutationKeys.js';
5
+ import { getSession } from '../services/getSession.js';
6
+ export const useVerifyMobileNumber = (config) => {
7
+ return useMutation({
8
+ ...config,
9
+ mutationKey: getVerifyMobileNumberMutationKey(),
10
+ mutationFn: async (input) => {
11
+ const session = await getSession();
12
+ invariant(session.status === 'authenticated');
13
+ await verifyMobileNumber(input.verificationCode, {
14
+ headers: {
15
+ Authorization: `Bearer ${session.token}`,
16
+ },
17
+ });
18
+ },
19
+ });
20
+ };
@@ -13,7 +13,6 @@ import { z } from 'zod';
13
13
  import { useAccountQuery } from '../../client/hooks/useAccountQuery.js';
14
14
  import { useDisclosure } from '../../client/hooks/useDisclosure.js';
15
15
  import { useFacebookClientQuery } from '../../client/hooks/useFacebookClientQuery.js';
16
- import { useFeatureFlag } from '../../client/hooks/useFeatureFlag.js';
17
16
  import { useGoogleClientIdQuery } from '../../client/hooks/useGoogleClientIdQuery.js';
18
17
  import { useLocaleInfo } from '../../client/hooks/useLocaleInfo.js';
19
18
  import { useMemberVerificationQuery } from '../../client/hooks/useMemberVerificationQuery.js';
@@ -95,7 +94,6 @@ function ProfileInfo({ avatar }) {
95
94
  function PersonalInfo(props) {
96
95
  const accountQuery = useAccountQuery();
97
96
  const account = accountQuery.data;
98
- const featureFlag = useFeatureFlag();
99
97
  const verificationQuery = useMemberVerificationQuery();
100
98
  const verification = verificationQuery.data;
101
99
  const updateAccountMutation = useUpdateAccountMutation({
@@ -0,0 +1 @@
1
+ export declare function AurixPayGrabPayDeposit(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,241 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { zodResolver } from '@hookform/resolvers/zod';
3
+ import { ObjectId } from '@opexa/object-id';
4
+ import Link from 'next/link';
5
+ import { useEffect, useState } from 'react';
6
+ import { Controller, useForm } from 'react-hook-form';
7
+ import invariant from 'tiny-invariant';
8
+ import { useBoolean } from 'usehooks-ts';
9
+ import { z } from 'zod';
10
+ import { useShallow } from 'zustand/shallow';
11
+ import { useAvailablePromosQuery } from '../../../../client/hooks/useAvailablePromosQuery.js';
12
+ import { useCreateAurixPayGrabPayDepositMutation } from '../../../../client/hooks/useCreateAurixPayGrabPayDepositMutation.js';
13
+ import { useDepositQuery } from '../../../../client/hooks/useDepositQuery.js';
14
+ import { useDepositsCountQuery } from '../../../../client/hooks/useDepositsCountQuery.js';
15
+ import { useDisclosure } from '../../../../client/hooks/useDisclosure.js';
16
+ import { useGlobalStore } from '../../../../client/hooks/useGlobalStore.js';
17
+ import { useMemberVerificationQuery } from '../../../../client/hooks/useMemberVerificationQuery.js';
18
+ import { usePaymentSettingsQuery } from '../../../../client/hooks/usePaymentSettingsQuery.js';
19
+ import { AlertCircleIcon } from '../../../../icons/AlertCircleIcon.js';
20
+ import { ChevronDownIcon } from '../../../../icons/ChevronDownIcon.js';
21
+ import { ChevronUpIcon } from '../../../../icons/ChevronUpIcon.js';
22
+ import { RefreshCcw01Icon } from '../../../../icons/RefreshCcw01Icon.js';
23
+ import { SpinnerIcon } from '../../../../icons/SpinnerIcon.js';
24
+ import { XIcon } from '../../../../icons/XIcon.js';
25
+ import { ObjectType } from '../../../../services/ObjectType.js';
26
+ import { AlertDialog } from '../../../../ui/AlertDialog/index.js';
27
+ import { Button } from '../../../../ui/Button/index.js';
28
+ import { Field } from '../../../../ui/Field/index.js';
29
+ import { NumberInput } from '../../../../ui/NumberInput/index.js';
30
+ import { Portal } from '../../../../ui/Portal/index.js';
31
+ import { getQueryClient } from '../../../../utils/getQueryClient.js';
32
+ import { parseDecimal } from '../../../../utils/parseDecimal.js';
33
+ import { getDepositsCountQueryKey } from '../../../../utils/queryKeys.js';
34
+ import { AmountChoices } from '../../AmountChoices.js';
35
+ import { useDepositWithdrawalPropsContext } from '../../DepositWithdrawalContext.js';
36
+ import { AvailablePromos } from '../AvailablePromos.js';
37
+ export function AurixPayGrabPayDeposit() {
38
+ const depositWithdrawalProps = useDepositWithdrawalPropsContext();
39
+ const disclosure = useDisclosure({
40
+ onOpenChange(open) {
41
+ if (!open) {
42
+ form.reset();
43
+ }
44
+ },
45
+ });
46
+ const globalStore = useGlobalStore(useShallow((ctx) => ({
47
+ depositWithdrawal: ctx.depositWithdrawal,
48
+ kycVerificationStatus: ctx.kycVerificationStatus,
49
+ })));
50
+ const verificationQuery = useMemberVerificationQuery();
51
+ const verificationStatus = verificationQuery.data?.status ?? 'UNVERIFIED';
52
+ const [status, setStatus] = useState('waiting');
53
+ const [errorMessage, setErrorMessage] = useState(null);
54
+ const createDepositMutation = useCreateAurixPayGrabPayDepositMutation({
55
+ onMutate() {
56
+ disclosure.setOpen(true);
57
+ setStatus('processing');
58
+ },
59
+ onSuccess(data) {
60
+ const queryClient = getQueryClient();
61
+ invariant(data.checkoutUrl);
62
+ window.open(data.checkoutUrl, '_blank', 'noopener,noreferrer');
63
+ queryClient.invalidateQueries({
64
+ queryKey: getDepositsCountQueryKey(),
65
+ });
66
+ setStatus('success');
67
+ },
68
+ onError(data) {
69
+ setStatus('failed');
70
+ setErrorMessage({
71
+ name: data.name,
72
+ message: data.message,
73
+ });
74
+ },
75
+ });
76
+ const warn = useBoolean();
77
+ const depositQuery = useDepositQuery(createDepositMutation.data?.id, {
78
+ enabled: !warn.value && status === 'success',
79
+ refetchInterval: (ctx) => ctx.state.data?.status === 'CONFIRMED' ||
80
+ ctx.state.data?.status === 'REJECTED' ||
81
+ ctx.state.data?.status === 'CANCELLED'
82
+ ? false
83
+ : 1000,
84
+ });
85
+ useEffect(() => {
86
+ if (depositQuery.data?.status === 'CONFIRMED') {
87
+ setStatus('confirmed');
88
+ return;
89
+ }
90
+ if (depositQuery.data?.status === 'REJECTED' ||
91
+ depositQuery.data?.status === 'CANCELLED') {
92
+ setStatus('failed');
93
+ return;
94
+ }
95
+ }, [depositQuery.data?.status]);
96
+ const depositsCountQuery = useDepositsCountQuery();
97
+ const depositsCount = depositsCountQuery.data ?? 0;
98
+ const paymentSettingsQuery = usePaymentSettingsQuery();
99
+ const paymentSettings = paymentSettingsQuery.data;
100
+ const gatewaySettings = paymentSettings?.aioGCashDepositGatewaySettings;
101
+ const maximumAmount = parseDecimal(gatewaySettings?.maximumAmount, 0);
102
+ const minimumAmount = depositsCount <= 0
103
+ ? parseDecimal(paymentSettingsQuery.data?.minimumFirstDepositAmount, 0)
104
+ : parseDecimal(gatewaySettings?.minimumAmount, 0);
105
+ const promosQuery = useAvailablePromosQuery();
106
+ const promos = promosQuery.data ?? [];
107
+ const definition = z
108
+ .object({
109
+ amount: z.string().superRefine((val, ctx) => {
110
+ const n = parseDecimal(val, 0);
111
+ if (n < minimumAmount) {
112
+ ctx.addIssue({
113
+ type: 'number',
114
+ code: z.ZodIssueCode.too_small,
115
+ inclusive: true,
116
+ minimum: minimumAmount,
117
+ message: `Please enter ${minimumAmount.toLocaleString()} or more to proceed with your deposit.`,
118
+ });
119
+ }
120
+ if (n > maximumAmount) {
121
+ ctx.addIssue({
122
+ type: 'number',
123
+ code: z.ZodIssueCode.too_big,
124
+ inclusive: true,
125
+ maximum: maximumAmount,
126
+ message: `Maximum amount is ${maximumAmount.toLocaleString()}`,
127
+ });
128
+ }
129
+ }),
130
+ promo: z.string().optional().nullable(),
131
+ accountNumber: z
132
+ .string()
133
+ .min(1, 'Account number is required')
134
+ .min(8, 'Account number must be 8 or more characters')
135
+ .max(32, 'Account number must not be more than 32 characters'),
136
+ })
137
+ .superRefine((value, ctx) => {
138
+ const promo = promos.find((o) => o.id === value.promo);
139
+ const promoMinAmount = parseDecimal(promo?.minimumDepositAmount, 0);
140
+ const promoMaxAmount = parseDecimal(promo?.maximumDepositAmount, 0);
141
+ const amount = parseDecimal(value.amount, 0);
142
+ if (promo && amount < promoMinAmount) {
143
+ ctx.addIssue({
144
+ path: ['amount'],
145
+ code: z.ZodIssueCode.custom,
146
+ message: `Minimum amount for this promo is ${promoMinAmount.toLocaleString()}`,
147
+ });
148
+ }
149
+ if (promo && amount > promoMaxAmount) {
150
+ ctx.addIssue({
151
+ path: ['amount'],
152
+ code: z.ZodIssueCode.custom,
153
+ message: `Maximum amount for this promo is ${promoMaxAmount}`,
154
+ });
155
+ }
156
+ });
157
+ const form = useForm({
158
+ mode: 'all',
159
+ resolver: zodResolver(definition),
160
+ defaultValues: {
161
+ amount: '0',
162
+ promo: globalStore.depositWithdrawal.promo ?? null,
163
+ accountNumber: '',
164
+ },
165
+ });
166
+ useEffect(() => {
167
+ if (minimumAmount) {
168
+ form.reset({
169
+ amount: minimumAmount.toString(),
170
+ promo: form.getValues('promo') ?? null,
171
+ accountNumber: form.getValues('accountNumber') ?? '',
172
+ });
173
+ }
174
+ }, [form, minimumAmount]);
175
+ const redirectUrl = (() => {
176
+ const path = depositWithdrawalProps.depositSuccessPageUrl ?? '/deposits/:id/status';
177
+ const origin = window.location.origin.includes('localhost')
178
+ ? 'https://uat.powerplay.ph' +
179
+ depositWithdrawalProps.depositSuccessPageUrl
180
+ : window.location.origin;
181
+ return `${origin}${path}`;
182
+ })();
183
+ return (_jsxs("form", { onSubmit: form.handleSubmit(async (data) => {
184
+ if (!depositWithdrawalProps.bypassDepositKycCheck &&
185
+ (verificationStatus === 'PENDING' ||
186
+ verificationStatus === 'UNVERIFIED' ||
187
+ verificationStatus === 'REJECTED' ||
188
+ verificationStatus === 'CREATED')) {
189
+ globalStore.kycVerificationStatus.setOpen(true);
190
+ return;
191
+ }
192
+ else {
193
+ const id = ObjectId.generate(ObjectType.Deposit).toString();
194
+ createDepositMutation.reset();
195
+ createDepositMutation.mutate({
196
+ id,
197
+ amount: data.amount.toString(),
198
+ promo: data.promo ?? undefined,
199
+ redirectUrl: redirectUrl.replace(':id', id),
200
+ accountNumber: data.accountNumber,
201
+ });
202
+ }
203
+ }), noValidate: true, children: [_jsxs(Field.Root, { invalid: !!form.formState.errors.accountNumber, children: [_jsx(Field.Label, { children: "Account number" }), _jsx(Field.Input, { ...form.register('accountNumber') }), _jsx(Field.ErrorText, { children: form.formState.errors.accountNumber?.message })] }), _jsx(Controller, { control: form.control, name: "amount", render: (o) => (_jsxs(Field.Root, { invalid: !!form.formState.errors.amount, className: "mt-lg", children: [_jsxs(NumberInput.Root, { min: 0, step: 1, value: o.field.value, onValueChange: (details) => {
204
+ o.field.onChange(details.value);
205
+ }, allowMouseWheel: true, children: [_jsx(NumberInput.Label, { children: "Enter amount you want to deposit" }), _jsxs(NumberInput.Control, { children: [_jsx(NumberInput.Input, {}), _jsx(NumberInput.IncrementTrigger, { children: _jsx(ChevronUpIcon, {}) }), _jsx(NumberInput.DecrementTrigger, { children: _jsx(ChevronDownIcon, {}) })] })] }), _jsx(Field.ErrorText, { children: form.formState.errors.amount?.message })] })) }), _jsx(AmountChoices, { value: parseDecimal(form.watch('amount'), 0), onChange: (value) => {
206
+ form.setValue('amount', value.toString(), {
207
+ shouldTouch: true,
208
+ shouldDirty: true,
209
+ shouldValidate: true,
210
+ });
211
+ }, min: minimumAmount, max: maximumAmount, className: "mt-lg" }), _jsx(Controller, { control: form.control, name: "promo", render: (o) => (_jsx(AvailablePromos, { value: o.field.value, onChange: (value) => {
212
+ o.field.onChange(value);
213
+ globalStore.depositWithdrawal.setPromo(null);
214
+ }, className: "mt-3xl" })) }), _jsx(Button, { type: "submit", className: "mt-3xl", disabled: createDepositMutation.isPending, children: "Deposit" }), _jsxs("p", { className: "mt-lg text-text-tertiary-600 text-xs", children: ["By depositing, you agree to our", ' ', _jsx(Link, { href: depositWithdrawalProps.termsOfUseUrl ?? '/terms-of-use', onClick: () => globalStore.depositWithdrawal.setOpen(false), className: "text-text-warning-primary-600 underline underline-offset-2", children: "Terms of Use" }), ' ', "and", ' ', _jsx(Link, { href: depositWithdrawalProps.privacyPolicyUrl ?? '/privacy-policy', onClick: () => globalStore.depositWithdrawal.setOpen(false), className: "text-text-warning-primary-600 underline underline-offset-2", children: "Privacy Policy" }), "."] }), _jsx(AlertDialog.Root, { open: disclosure.open, onOpenChange: (details) => {
215
+ disclosure.setOpen(details.open);
216
+ }, lazyMount: true, unmountOnExit: true, closeOnEscape: false, closeOnInteractOutside: false, onExitComplete: () => {
217
+ setStatus('waiting');
218
+ setErrorMessage(null);
219
+ form.reset();
220
+ warn.setFalse();
221
+ }, children: _jsxs(Portal, { children: [_jsx(AlertDialog.Backdrop, { className: "!z-[calc(var(--z-dialog)+2)]" }), _jsx(AlertDialog.Positioner, { className: "!z-[calc(var(--z-dialog)+3)]", children: _jsxs(AlertDialog.Content, { children: [_jsx(AlertDialog.Context, { children: (api) => (_jsx("button", { type: "button", className: "absolute top-2.5 right-2.5 flex icon:size-6 size-11 items-center justify-center text-text-quinary", onClick: () => {
222
+ if (status === 'success' && !warn.value) {
223
+ warn.setTrue();
224
+ }
225
+ else {
226
+ api.setOpen(false);
227
+ }
228
+ }, children: _jsx(XIcon, {}) })) }), _jsxs(AlertDialog.Header, { children: [status === 'processing' && (_jsx(SpinnerIcon, { className: "size-12 text-text-brand-primary-600" })), status === 'success' && !warn.value && (_jsx("div", { className: "flex size-12 items-center justify-center rounded-full bg-bg-brand-secondary text-text-featured-icon-light-brand", children: _jsx(RefreshCcw01Icon, {}) })), status === 'success' && warn.value && (_jsx("div", { className: "flex size-12 items-center justify-center rounded-full bg-bg-error-secondary text-text-featured-icon-light-error", children: _jsx(AlertCircleIcon, {}) })), status === 'confirmed' && (_jsx("div", { className: "flex size-12 items-center justify-center rounded-full bg-bg-success-secondary text-text-featured-icon-light-success", children: _jsx(AlertCircleIcon, {}) })), status === 'failed' && (_jsx("div", { className: "flex size-12 items-center justify-center rounded-full bg-bg-error-secondary text-text-featured-icon-light-error", children: _jsx(AlertCircleIcon, {}) }))] }), _jsxs(AlertDialog.Body, { children: [_jsxs(AlertDialog.Title, { children: [status === 'processing' && 'Processing Deposit', status === 'success' &&
229
+ !warn.value &&
230
+ 'Didn’t see the payment window?', status === 'success' && warn.value && (_jsx(_Fragment, { children: "Are you sure you want to close this\u00A0window?" })), status === 'confirmed' && 'Deposit Successful', status === 'failed' && errorMessage?.name] }), _jsxs(AlertDialog.Description, { children: [status === 'processing' &&
231
+ "We're verifying your account and amount. Please hold a moment.", status === 'success' &&
232
+ !warn.value &&
233
+ 'Sometimes the payment pop up doesn’t appear right away. Don’t worry, just click the button below to reopen it and continue your deposit.', status === 'success' &&
234
+ warn.value &&
235
+ 'Closing this window might cancel your current deposit. Do you want to continue?', status === 'confirmed' &&
236
+ 'Your deposit has been successfully processed.', status === 'failed' && errorMessage?.message] })] }), (status === 'failed' ||
237
+ status === 'success' ||
238
+ status === 'confirmed') && (_jsxs(AlertDialog.Footer, { children: [status === 'success' && !warn.value && (_jsx(Button, { asChild: true, children: _jsx("a", { href: createDepositMutation.data?.checkoutUrl ?? '', target: "_blank", rel: "noopener noreferrer", children: "Try Again" }) })), status === 'success' && warn.value && (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => {
239
+ warn.setFalse();
240
+ }, children: "Go back" }), _jsx(AlertDialog.Context, { children: (api) => (_jsx(Button, { onClick: () => api.setOpen(false), children: "Continue" })) })] })), status !== 'success' && (_jsx(AlertDialog.Context, { children: (api) => (_jsx(Button, { onClick: () => api.setOpen(false), children: "Ok" })) }))] }))] }) })] }) })] }));
241
+ }
@@ -4,6 +4,5 @@ export interface KYCDefaultProps extends KYCReminderProps {
4
4
  provider?: 'opexa';
5
5
  logo: ImageProps['src'];
6
6
  isSkippable?: boolean;
7
- hasKYCReviewPromo?: boolean;
8
7
  }
9
8
  export declare function KYCDefault(props: KYCDefaultProps): import("react/jsx-runtime").JSX.Element;
@@ -6,7 +6,6 @@ import { useSessionQuery } from '../../../client/hooks/useSessionQuery.js';
6
6
  import { Dialog } from '../../../ui/Dialog/index.js';
7
7
  import { Portal } from '../../../ui/Portal/index.js';
8
8
  import { KYCReminder } from '../KYCReminder.js';
9
- import { KYCReview } from '../KYCReview.js';
10
9
  import { IdentityVerification } from './IdentityVerification.js';
11
10
  import { Indicator } from './Indicator.js';
12
11
  import { KYCDefaultContext } from './KYCDefaultContext.js';
@@ -21,7 +20,7 @@ export function KYCDefault(props) {
21
20
  updateMobilePhoneNumber: ctx.updateMobilePhoneNumber,
22
21
  termsOfUse: ctx.termsOfUse,
23
22
  })));
24
- const kyc = useKYCDefault(props?.isSkippable ?? false, props?.hasKYCReviewPromo ?? false);
23
+ const kyc = useKYCDefault(props?.isSkippable ?? false);
25
24
  const { isLoading: sessionLoading } = useSessionQuery();
26
25
  const isDialogOpen = globalStore.kyc.open &&
27
26
  !globalStore.kycReminder.open &&
@@ -31,5 +30,5 @@ export function KYCDefault(props) {
31
30
  !globalStore.termsOfUse.open;
32
31
  return (_jsxs(_Fragment, { children: [_jsx(KYCDefaultContext, { value: kyc, children: _jsx(Dialog.Root, { open: isDialogOpen, onOpenChange: (details) => {
33
32
  globalStore.kyc.setOpen(details.open);
34
- }, lazyMount: true, unmountOnExit: true, closeOnEscape: false, closeOnInteractOutside: false, onExitComplete: kyc.reset, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, {}), _jsx(Dialog.Positioner, { className: "fixed top-[57px] overflow-hidden", children: _jsx(Dialog.Content, { className: "mx-auto h-full w-full overflow-y-auto bg-bg-primary-alt md:max-h-[95vh] lg:w-fit", children: _jsxs("div", { className: "mt-[calc(var(--safe-area-inset-top)*3)] flex h-dvh w-full flex-col overflow-y-auto p-3xl sm:h-fit lg:w-[400px]", children: [_jsx(Image, { src: props.logo, alt: "", width: 200, height: 100, className: "mx-auto mb-5 block h-7.5 w-auto", draggable: false }), _jsx(Indicator, {}), kyc.step === 1 && _jsx(IdentityVerification, {}), kyc.step === 2 && _jsx(PersonalInformation, {})] }) }) })] }) }) }), _jsx(KYCReminder, { ...props }), _jsx(KYCReview, {})] }));
33
+ }, lazyMount: true, unmountOnExit: true, closeOnEscape: false, closeOnInteractOutside: false, onExitComplete: kyc.reset, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, {}), _jsx(Dialog.Positioner, { className: "fixed top-[57px] overflow-hidden", children: _jsx(Dialog.Content, { className: "mx-auto h-full w-full overflow-y-auto bg-bg-primary-alt md:max-h-[95vh] lg:w-fit", children: _jsxs("div", { className: "mt-[calc(var(--safe-area-inset-top)*3)] flex h-dvh w-full flex-col overflow-y-auto p-3xl sm:h-fit lg:w-[400px]", children: [_jsx(Image, { src: props.logo, alt: "", width: 200, height: 100, className: "mx-auto mb-5 block h-7.5 w-auto", draggable: false }), _jsx(Indicator, {}), kyc.step === 1 && _jsx(IdentityVerification, {}), kyc.step === 2 && _jsx(PersonalInformation, {})] }) }) })] }) }) }), _jsx(KYCReminder, { ...props })] }));
35
34
  }
@@ -37,7 +37,6 @@ export function PersonalInformation() {
37
37
  const globalStore = useGlobalStore(useShallow((ctx) => ({
38
38
  kyc: ctx.kyc,
39
39
  kycReminder: ctx.kycReminder,
40
- kycReview: ctx.kycReview,
41
40
  })));
42
41
  const memberVerificationQuery = useMemberVerificationQuery();
43
42
  const memberVerificationId = memberVerificationQuery.data?.id;
@@ -77,9 +76,6 @@ export function PersonalInformation() {
77
76
  });
78
77
  kyc.setDone(true);
79
78
  globalStore.kyc.setOpen(false);
80
- if (kyc.hasKYCReviewPromo) {
81
- globalStore.kycReview.setOpen(true);
82
- }
83
79
  toaster.success({
84
80
  title: 'Success',
85
81
  description: 'Personal information has been set successfully.',
@@ -95,9 +91,6 @@ export function PersonalInformation() {
95
91
  onSuccess() {
96
92
  kyc.setDone(true);
97
93
  globalStore.kyc.setOpen(false);
98
- if (kyc.hasKYCReviewPromo) {
99
- globalStore.kycReview.setOpen(true);
100
- }
101
94
  toaster.success({
102
95
  title: 'Success',
103
96
  description: 'Personal information has been set successfully.',
@@ -21,7 +21,6 @@ export interface UseKYCDefaultReturn {
21
21
  setSelfieImageId: (id: string | null) => void;
22
22
  reset: () => void;
23
23
  isSkippable: boolean;
24
- hasKYCReviewPromo: boolean;
25
24
  }
26
- export declare function useKYCDefault(isSkippable: boolean, hasKYCReviewPromo: boolean): UseKYCDefaultReturn;
25
+ export declare function useKYCDefault(isSkippable: boolean): UseKYCDefaultReturn;
27
26
  export {};
@@ -1,5 +1,5 @@
1
1
  import { useRef, useState } from 'react';
2
- export function useKYCDefault(isSkippable, hasKYCReviewPromo) {
2
+ export function useKYCDefault(isSkippable) {
3
3
  const [step, setStep] = useState(1);
4
4
  const [done, setDone] = useState(false);
5
5
  const [idFrontImageId, setFrontImageId] = useState(null);
@@ -35,6 +35,5 @@ export function useKYCDefault(isSkippable, hasKYCReviewPromo) {
35
35
  triggerEvent,
36
36
  reset,
37
37
  isSkippable,
38
- hasKYCReviewPromo,
39
38
  };
40
39
  }
@@ -3,6 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import Image from 'next/image';
4
4
  import { useState } from 'react';
5
5
  import { useShallow } from 'zustand/shallow';
6
+ import { useFeatureFlag } from '../../client/hooks/useFeatureFlag.js';
6
7
  import { useGlobalStore } from '../../client/hooks/useGlobalStore.js';
7
8
  import { getSession } from '../../client/services/getSession.js';
8
9
  import { toaster } from '../../client/utils/toaster.js';
@@ -15,7 +16,9 @@ import { Portal } from '../../ui/Portal/index.js';
15
16
  export function KYCReview() {
16
17
  const { kycReview } = useGlobalStore(useShallow((s) => ({ kycReview: s.kycReview })));
17
18
  const [isLoading, setIsLoading] = useState(false);
18
- return (_jsx(Dialog.Root, { open: kycReview.open, lazyMount: true, unmountOnExit: true, closeOnEscape: false, closeOnInteractOutside: false, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, {}), _jsx(Dialog.Positioner, { className: "flex items-center", children: _jsxs(Dialog.Content, { className: "flex w-[375px] flex-col items-center justify-between space-y-4 rounded-lg bg-[#232443] p-6 text-center", children: [_jsxs("div", { className: "flex flex-col items-center", children: [_jsx("div", { className: "mb-4 h-7 w-7 animate-spin rounded-full border-4 border-[#101730] border-t-[#F05027]" }), _jsx("div", { className: "font-semibold text-[#F5F5F6] text-lg", children: "Thanks for your submission." }), _jsxs("div", { className: "mt-1 text-[#CECFD2] text-sm", children: ["We\u2019re now ", '', _jsxs("span", { className: "text-[#F96B47]", children: ["reviewing your KYC information ", ''] }), "and will notify you once the verification is complete."] }), _jsx("div", { className: "mt-6 text-[#CECFD2] text-sm", children: "In the meantime, you can watch your favorite series on CinePop!" })] }), _jsxs("div", { className: "pt-3", children: [_jsx(Image, { src: cinePopLogo, alt: "cine poplogo", width: 151, height: 24, className: "mx-auto mb-2 h-auto w-[151px]" }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Image, { src: secretConfessionsLogo, alt: "secret confessions logo", width: 104, height: 53, className: "h-auto w-[104px]" }), _jsx(Image, { src: dearUtolLogo, alt: "dear utol logo", width: 105, height: 53, className: "h-auto w-[105px]" }), _jsx(Image, { src: mariasDiary, alt: "maria's diary logo", width: 104, height: 53, className: "h-auto w-[104px]" })] })] }), _jsx("button", { disabled: isLoading, type: "button", className: "h-[44px] w-full rounded-md font-semibold", style: {
19
+ const featureFlag = useFeatureFlag();
20
+ const isDialogOpen = kycReview.open && featureFlag.enabled;
21
+ return (_jsx(Dialog.Root, { open: isDialogOpen, lazyMount: true, unmountOnExit: true, closeOnEscape: false, closeOnInteractOutside: false, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, {}), _jsx(Dialog.Positioner, { className: "flex items-center", children: _jsxs(Dialog.Content, { className: "flex w-[375px] flex-col items-center justify-between space-y-4 rounded-lg bg-[#232443] p-6 text-center", children: [_jsxs("div", { className: "flex flex-col items-center", children: [_jsx("div", { className: "mb-4 h-7 w-7 animate-spin rounded-full border-4 border-[#101730] border-t-[#F05027]" }), _jsx("div", { className: "font-semibold text-[#F5F5F6] text-lg", children: "Thanks for your submission." }), _jsxs("div", { className: "mt-1 text-[#CECFD2] text-sm", children: ["We\u2019re now ", '', _jsxs("span", { className: "text-[#F96B47]", children: ["reviewing your KYC information ", ''] }), "and will notify you once the verification is complete."] }), _jsx("div", { className: "mt-6 text-[#CECFD2] text-sm", children: "In the meantime, you can watch your favorite series on CinePop!" })] }), _jsxs("div", { className: "pt-3", children: [_jsx(Image, { src: cinePopLogo, alt: "cine poplogo", width: 151, height: 24, className: "mx-auto mb-2 h-auto w-[151px]" }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Image, { src: secretConfessionsLogo, alt: "secret confessions logo", width: 104, height: 53, className: "h-auto w-[104px]" }), _jsx(Image, { src: dearUtolLogo, alt: "dear utol logo", width: 105, height: 53, className: "h-auto w-[105px]" }), _jsx(Image, { src: mariasDiary, alt: "maria's diary logo", width: 104, height: 53, className: "h-auto w-[104px]" })] })] }), _jsx("button", { disabled: isLoading, type: "button", className: "h-[44px] w-full rounded-md font-semibold", style: {
19
22
  background: 'linear-gradient(90deg, #9333E8 0%, #D92778 100%)',
20
23
  }, onClick: async () => {
21
24
  const session = await getSession();
@@ -29,7 +32,7 @@ export function KYCReview() {
29
32
  'Content-Type': 'application/json',
30
33
  },
31
34
  });
32
- const data = await response.json();
35
+ const data = (await response.json());
33
36
  window.open(data.data.redirectionUrl, '_blank');
34
37
  }
35
38
  catch {
@@ -1,13 +1,23 @@
1
1
  'use client';
2
+ import { useIsMutating } from '@tanstack/react-query';
2
3
  import { useEffect } from 'react';
3
4
  import { useAccountQuery } from '../../client/hooks/useAccountQuery.js';
4
5
  import { useGlobalStore } from '../../client/hooks/useGlobalStore.js';
5
6
  import { useMemberVerificationQuery } from '../../client/hooks/useMemberVerificationQuery.js';
7
+ import { getApproveMemberVerificationQueryKey, getCreateMemberVerificationQueryKey, } from '../../utils/mutationKeys.js';
6
8
  export function KycOpenOnHomeMount(props) {
7
9
  const setkycReminderOpen = useGlobalStore((s) => s.kycReminder.setOpen);
8
10
  const setkycOpen = useGlobalStore((s) => s.kyc.setOpen);
9
- const { data: verification, isLoading: verificationLoading } = useMemberVerificationQuery();
11
+ const isSignUpOpen = useGlobalStore((s) => s.signUp.open);
12
+ const { data: verification, isLoading: verificationLoading, isRefetching: verificationRefetching, } = useMemberVerificationQuery();
10
13
  const { data: account, isLoading: accountLoading } = useAccountQuery();
14
+ const isCreatingVerification = useIsMutating({
15
+ mutationKey: getCreateMemberVerificationQueryKey(),
16
+ });
17
+ const isApprovingVerification = useIsMutating({
18
+ mutationKey: getApproveMemberVerificationQueryKey(),
19
+ });
20
+ const isMutating = isCreatingVerification > 0 || isApprovingVerification > 0;
11
21
  const isVerificationLocked = account?.status === 'VERIFICATION_LOCKED';
12
22
  const isRejected = verification?.status === 'REJECTED';
13
23
  const isUnverified = verification === null ||
@@ -17,62 +27,76 @@ export function KycOpenOnHomeMount(props) {
17
27
  verification?.sumsubVerified ||
18
28
  verification?.status === 'APPROVED' ||
19
29
  verification?.status === 'VERIFIED'; //add default value on null return
30
+ const isPending = verification?.status === 'PENDING';
20
31
  useEffect(() => {
21
32
  // If bypass is enabled, do nothing.
22
33
  if (props.bypassKycCheck) {
23
34
  return;
24
35
  }
25
- if (!verificationLoading && !accountLoading) {
26
- const shouldShowReminder = Boolean(props.isSkippable);
27
- const hasSeenKycModal = sessionStorage.getItem('hasSeenKycModal');
28
- const isFirstVisit = !hasSeenKycModal;
29
- // 1. If KYC is completed, early return
30
- if (isKycCompleted) {
31
- setkycReminderOpen(false);
32
- setkycOpen(false);
33
- sessionStorage.removeItem('hasSeenKycModal');
34
- return;
35
- }
36
- // 2. Handle member verification locked
37
- if (isVerificationLocked) {
38
- setkycReminderOpen(true);
39
- setkycOpen(false);
40
- return;
41
- }
42
- // Handle rejected verification status
43
- else if (isRejected) {
44
- if (isFirstVisit) {
36
+ const timeoutId = setTimeout(() => {
37
+ if (!verificationLoading &&
38
+ !accountLoading &&
39
+ !verificationRefetching &&
40
+ !isMutating &&
41
+ !isSignUpOpen) {
42
+ const shouldShowReminder = Boolean(props.isSkippable);
43
+ const hasSeenKycModal = sessionStorage.getItem('hasSeenKycModal');
44
+ const isFirstVisit = !hasSeenKycModal;
45
+ // 1. If KYC is completed or pending, close both
46
+ if (isKycCompleted || isPending) {
45
47
  setkycReminderOpen(false);
46
- setkycOpen(true);
47
- sessionStorage.setItem('hasSeenKycModal', 'true');
48
+ setkycOpen(false);
49
+ if (isKycCompleted) {
50
+ sessionStorage.removeItem('hasSeenKycModal');
51
+ }
52
+ return;
48
53
  }
49
- else {
50
- setkycReminderOpen(shouldShowReminder);
51
- setkycOpen(!shouldShowReminder);
54
+ // 2. Handle member verification locked
55
+ if (isVerificationLocked) {
56
+ setkycReminderOpen(true);
57
+ setkycOpen(false);
58
+ return;
52
59
  }
53
- }
54
- // Handle unverified verification status
55
- else if (isUnverified) {
56
- if (isFirstVisit) {
57
- setkycReminderOpen(false);
58
- setkycOpen(true);
59
- sessionStorage.setItem('hasSeenKycModal', 'true');
60
+ // Handle rejected verification status
61
+ else if (isRejected) {
62
+ if (isFirstVisit) {
63
+ setkycReminderOpen(false);
64
+ setkycOpen(true);
65
+ sessionStorage.setItem('hasSeenKycModal', 'true');
66
+ }
67
+ else {
68
+ setkycReminderOpen(shouldShowReminder);
69
+ setkycOpen(!shouldShowReminder);
70
+ }
60
71
  }
61
- else {
62
- setkycReminderOpen(shouldShowReminder);
63
- setkycOpen(!shouldShowReminder);
72
+ // Handle unverified verification status
73
+ else if (isUnverified) {
74
+ if (isFirstVisit) {
75
+ setkycReminderOpen(false);
76
+ setkycOpen(true);
77
+ sessionStorage.setItem('hasSeenKycModal', 'true');
78
+ }
79
+ else {
80
+ setkycReminderOpen(shouldShowReminder);
81
+ setkycOpen(!shouldShowReminder);
82
+ }
64
83
  }
65
84
  }
66
- }
85
+ }, 1000);
86
+ return () => clearTimeout(timeoutId);
67
87
  }, [
68
88
  setkycReminderOpen,
69
89
  setkycOpen,
70
90
  verificationLoading,
71
91
  accountLoading,
92
+ verificationRefetching,
93
+ isMutating,
94
+ isSignUpOpen,
72
95
  isVerificationLocked,
73
96
  isRejected,
74
97
  isUnverified,
75
98
  isKycCompleted,
99
+ isPending,
76
100
  props.isSkippable,
77
101
  props.bypassKycCheck,
78
102
  ]);
@@ -34,7 +34,6 @@ export function MessagesPopup() {
34
34
  gameLaunch: ctx.gameLaunch,
35
35
  depositWithdrawal: ctx.depositWithdrawal,
36
36
  kycReminder: ctx.kycReminder,
37
- kycReview: ctx.kycReview,
38
37
  responsibleGamingReminder: ctx.responsibleGamingReminder,
39
38
  signIn: ctx.signIn,
40
39
  signUp: ctx.signUp,
@@ -84,7 +83,6 @@ export function MessagesPopup() {
84
83
  !globalStore.account__mobile.open &&
85
84
  !globalStore.kyc.open &&
86
85
  !globalStore.kycReminder.open &&
87
- !globalStore.kycReview.open &&
88
86
  !globalStore.responsibleGamingReminder.open,
89
87
  refetchInterval: disclosure.open ? undefined : 1000 * 10,
90
88
  });
@@ -124,7 +122,7 @@ export function MessagesPopup() {
124
122
  };
125
123
  const sessionQuery = useSessionQuery();
126
124
  const session = sessionQuery.data;
127
- const isKycClosed = !globalStore.kyc.open && !globalStore.kycReminder.open && !globalStore.kycReview.open;
125
+ const isKycClosed = !globalStore.kyc.open && !globalStore.kycReminder.open;
128
126
  const isResponsibleGamingReminderClosed = !globalStore.responsibleGamingReminder.open;
129
127
  useEffect(() => {
130
128
  if (globalStore.gameLaunch.details.status === 'PLAYING')
@@ -2,6 +2,7 @@ import type { SignUpCrazyWinProps } from './SignUpCrazyWin/SignUpCrazyWin.lazy';
2
2
  import type { SignUpDefaultProps } from './SignUpDefault/SignUpDefault.lazy';
3
3
  import type { SignUpHappyBingoProps } from './SignUpHappyBingo/SignUpHappyBingo.lazy';
4
4
  import type { SignUpKYCProps } from './SignUpKYC/SignUpKYC.lazy';
5
+ import type { SignUpLongFormProps } from './SignUpLongForm/SignUpLongForm.lazy';
5
6
  import type { SignUpNameAndPasswordProps } from './SignUpNameAndPassword/SignUpNameAndPassword.lazy';
6
- export type SignUpProps = SignUpDefaultProps | SignUpKYCProps | SignUpNameAndPasswordProps | SignUpCrazyWinProps | SignUpHappyBingoProps;
7
+ export type SignUpProps = SignUpDefaultProps | SignUpKYCProps | SignUpNameAndPasswordProps | SignUpCrazyWinProps | SignUpHappyBingoProps | SignUpLongFormProps;
7
8
  export declare function SignUp(props: SignUpProps): import("react/jsx-runtime").JSX.Element | null;
@@ -23,6 +23,10 @@ const SignUpHappyBingo = dynamic(() => import('./SignUpHappyBingo/SignUpHappyBin
23
23
  ssr: false,
24
24
  loading: () => null,
25
25
  });
26
+ const SignUpLongForm = dynamic(() => import('./SignUpLongForm/SignUpLongForm.lazy.js').then((m) => m.default), {
27
+ ssr: false,
28
+ loading: () => null,
29
+ });
26
30
  export function SignUp(props) {
27
31
  const touched = useGlobalStore(useShallow((ctx) => ctx.signUp['~touched']));
28
32
  if (!touched) {
@@ -40,6 +44,9 @@ export function SignUp(props) {
40
44
  else if (props.layout === 'happybingo') {
41
45
  return _jsx(SignUpHappyBingo, { ...props });
42
46
  }
47
+ else if (props.layout === 'long-form') {
48
+ return _jsx(SignUpLongForm, { ...props });
49
+ }
43
50
  else {
44
51
  return _jsx(SignUpDefault, { ...props });
45
52
  }