@opexa/portal-components 0.0.183 → 0.0.185

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 (123) hide show
  1. package/dist/components/Account/AccountTrigger.js +2 -1
  2. package/dist/components/AccountSecurity/AccountSecurity.js +1 -1
  3. package/dist/components/AccountVerification/AccountVerification.js +4 -3
  4. package/dist/components/DepositWithdrawal/Withdrawal/Withdrawal.js +14 -3
  5. package/dist/components/KYC/IdentityVerification.js +1 -2
  6. package/dist/components/KYC/KYC.lazy.js +1 -1
  7. package/dist/components/KYC/backup/Header.d.ts +1 -0
  8. package/dist/components/KYC/backup/Header.js +8 -0
  9. package/dist/components/KYC/backup/Indicator.d.ts +1 -0
  10. package/dist/components/KYC/backup/Indicator.js +9 -0
  11. package/dist/components/KYC/backup/KYC.d.ts +1 -0
  12. package/dist/components/KYC/backup/KYC.js +14 -0
  13. package/dist/components/KYC/backup/KYC.lazy.d.ts +1 -0
  14. package/dist/components/KYC/backup/KYC.lazy.js +26 -0
  15. package/dist/components/KYC/backup/KYCContext.d.ts +6 -0
  16. package/dist/components/KYC/backup/KYCContext.js +2 -0
  17. package/dist/components/KYC/backup/Step1.d.ts +1 -0
  18. package/dist/components/KYC/backup/Step1.js +13 -0
  19. package/dist/components/KYC/backup/Step2.d.ts +1 -0
  20. package/dist/components/KYC/backup/Step2.js +13 -0
  21. package/dist/components/KYC/backup/Step3.d.ts +1 -0
  22. package/dist/components/KYC/backup/Step3.js +13 -0
  23. package/dist/components/KYC/backup/Step4.d.ts +1 -0
  24. package/dist/components/KYC/backup/Step4.js +7 -0
  25. package/dist/components/KYC/backup/useKYC.d.ts +10 -0
  26. package/dist/components/KYC/backup/useKYC.js +8 -0
  27. package/dist/components/KYC/loadModels.d.ts +1 -0
  28. package/dist/components/KYC/loadModels.js +9 -0
  29. package/dist/components/Messages/Message.d.ts +1 -0
  30. package/dist/components/Messages/Message.js +35 -0
  31. package/dist/components/Messages/MessageContext.d.ts +6 -0
  32. package/dist/components/Messages/MessageContext.js +2 -0
  33. package/dist/components/Messages/MessagePopup.d.ts +1 -0
  34. package/dist/components/Messages/MessagePopup.js +20 -0
  35. package/dist/components/Messages/MessageTrigger.d.ts +8 -0
  36. package/dist/components/Messages/MessageTrigger.js +19 -0
  37. package/dist/components/Quests/CountdownTimer.d.ts +15 -0
  38. package/dist/components/Quests/CountdownTimer.js +33 -0
  39. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuest.d.ts +4 -0
  40. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuest.js +78 -0
  41. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuestModal.d.ts +8 -0
  42. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuestModal.js +9 -0
  43. package/dist/components/Quests/OnboardingQuest/OnboardingQuest.d.ts +4 -0
  44. package/dist/components/Quests/OnboardingQuest/OnboardingQuest.js +4 -0
  45. package/dist/components/Quests/WageringQuest/WageringQuest.d.ts +4 -0
  46. package/dist/components/Quests/WageringQuest/WageringQuest.js +20 -0
  47. package/dist/components/Quests/WageringQuest/WageringQuestModal.d.ts +9 -0
  48. package/dist/components/Quests/WageringQuest/WageringQuestModal.js +9 -0
  49. package/dist/components/SignUp/SignUp.d.ts +3 -2
  50. package/dist/components/SignUp/SignUp.js +11 -3
  51. package/dist/components/SignUp/SignUpDefault/SignUp.lazy.d.ts +13 -0
  52. package/dist/components/SignUp/SignUpDefault/SignUp.lazy.js +18 -0
  53. package/dist/components/SignUp/SignUpDefault/SignUpContext.d.ts +6 -0
  54. package/dist/components/SignUp/SignUpDefault/SignUpContext.js +2 -0
  55. package/dist/components/SignUp/SignUpDefault/SignUpForm.d.ts +1 -0
  56. package/dist/components/SignUp/SignUpDefault/SignUpForm.js +283 -0
  57. package/dist/components/SignUp/SignUpForm.js +2 -1
  58. package/dist/components/SignUp/SignUpPagcor/CaptureIdDocument.d.ts +1 -0
  59. package/dist/components/SignUp/SignUpPagcor/CaptureIdDocument.js +198 -0
  60. package/dist/components/SignUp/SignUpPagcor/CaptureSelfie.d.ts +1 -0
  61. package/dist/components/SignUp/SignUpPagcor/CaptureSelfie.js +251 -0
  62. package/dist/components/SignUp/SignUpPagcor/ImageUploader.d.ts +10 -0
  63. package/dist/components/SignUp/SignUpPagcor/ImageUploader.js +41 -0
  64. package/dist/components/SignUp/SignUpPagcor/SignUpFormPagcor.d.ts +1 -0
  65. package/dist/components/SignUp/SignUpPagcor/SignUpFormPagcor.js +429 -0
  66. package/dist/components/SignUp/SignUpPagcor/SignUpPagcor.lazy.d.ts +13 -0
  67. package/dist/components/SignUp/SignUpPagcor/SignUpPagcor.lazy.js +26 -0
  68. package/dist/components/SignUp/SignUpPagcor/SignUpPagcorContext.d.ts +7 -0
  69. package/dist/components/SignUp/SignUpPagcor/SignUpPagcorContext.js +2 -0
  70. package/dist/components/SignUp/SignUpPagcor/useImageUploader.d.ts +11 -0
  71. package/dist/components/SignUp/SignUpPagcor/useImageUploader.js +20 -0
  72. package/dist/constants/BranchCode.d.ts +4 -0
  73. package/dist/constants/BranchCode.js +42 -0
  74. package/dist/icons/BellRingIcon.d.ts +2 -0
  75. package/dist/icons/BellRingIcon.js +4 -0
  76. package/dist/services/account.js +4 -1
  77. package/dist/ui/AlertDialog/AlertDialog.d.ts +121 -121
  78. package/dist/ui/AlertDialog/alertDialog.recipe.d.ts +8 -8
  79. package/dist/ui/Avatar/Avatar.d.ts +9 -9
  80. package/dist/ui/Badge/Badge.d.ts +12 -12
  81. package/dist/ui/Badge/badge.anatomy.d.ts +1 -1
  82. package/dist/ui/Badge/badge.recipe.d.ts +3 -3
  83. package/dist/ui/Carousel/Carousel.d.ts +45 -45
  84. package/dist/ui/Carousel/carousel.recipe.d.ts +5 -5
  85. package/dist/ui/Checkbox/Checkbox.d.ts +23 -23
  86. package/dist/ui/Checkbox/checkbox.recipe.d.ts +3 -3
  87. package/dist/ui/Clipboard/Clipboard.d.ts +18 -18
  88. package/dist/ui/Clipboard/clipboard.recipe.d.ts +3 -3
  89. package/dist/ui/Collapsible/Collapsible.d.ts +32 -32
  90. package/dist/ui/Combobox/Combobox.d.ts +42 -42
  91. package/dist/ui/Combobox/combobox.recipe.d.ts +3 -3
  92. package/dist/ui/DatePicker/DatePicker.d.ts +72 -72
  93. package/dist/ui/DatePicker/datePicker.recipe.d.ts +3 -3
  94. package/dist/ui/Dialog/Dialog.d.ts +121 -121
  95. package/dist/ui/Dialog/dialog.recipe.d.ts +8 -8
  96. package/dist/ui/Drawer/Drawer.d.ts +33 -33
  97. package/dist/ui/Drawer/drawer.recipe.d.ts +3 -3
  98. package/dist/ui/Field/Field.d.ts +21 -21
  99. package/dist/ui/Menu/Menu.d.ts +144 -144
  100. package/dist/ui/Menu/menu.recipe.d.ts +5 -5
  101. package/dist/ui/NumberInput/NumberInput.d.ts +24 -24
  102. package/dist/ui/PasswordInput/PasswordInput.d.ts +18 -18
  103. package/dist/ui/PasswordInput/passwordInput.recipe.d.ts +3 -3
  104. package/dist/ui/PinInput/PinInput.d.ts +12 -12
  105. package/dist/ui/Popover/Popover.d.ts +88 -88
  106. package/dist/ui/Progress/Progress.d.ts +27 -27
  107. package/dist/ui/Progress/progress.recipe.d.ts +3 -3
  108. package/dist/ui/QrCode/QrCode.d.ts +25 -25
  109. package/dist/ui/QrCode/qrCode.recipe.d.ts +5 -5
  110. package/dist/ui/SegmentGroup/SegmentGroup.d.ts +18 -18
  111. package/dist/ui/Select/Select.d.ts +45 -45
  112. package/dist/ui/Select/select.recipe.d.ts +3 -3
  113. package/dist/ui/Table/Table.d.ts +21 -21
  114. package/dist/ui/Table/table.anatomy.d.ts +1 -1
  115. package/dist/ui/Table/table.recipe.d.ts +3 -3
  116. package/dist/ui/Tabs/Tabs.d.ts +15 -15
  117. package/dist/ui/Tabs/tabs.recipe.d.ts +3 -3
  118. package/dist/ui/Tooltip/tooltip.recipe.d.ts +5 -5
  119. package/dist/utils/dataUrlToBlob.d.ts +1 -0
  120. package/dist/utils/dataUrlToBlob.js +11 -0
  121. package/dist/utils/resizeImageSize.d.ts +2 -0
  122. package/dist/utils/resizeImageSize.js +11 -0
  123. package/package.json +1 -1
@@ -0,0 +1,9 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { XIcon } from '../../../icons/XIcon.js';
4
+ import { Button } from '../../../ui/Button/index.js';
5
+ import { Dialog } from '../../../ui/Dialog/index.js';
6
+ import { Portal } from '../../../ui/Portal/index.js';
7
+ export function DailyCheckInQuestModal(props) {
8
+ return (_jsx(Dialog.Root, { lazyMount: true, unmountOnExit: true, open: props.modalState.isOpen, onOpenChange: ({ open }) => props.modalState.setIsOpen(open), closeOnEscape: false, closeOnInteractOutside: false, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, { className: "!z-[calc(var(--z-dialog)+1)]" }), _jsx(Dialog.Positioner, { className: "!z-[calc(var(--z-dialog)+2)] flex items-center justify-center", children: _jsxs(Dialog.Content, { className: "min-h-auto mx-auto max-w-[343px] rounded-xl px-4 pb-0 pt-5", children: [_jsx(Dialog.CloseTrigger, { children: _jsx(XIcon, {}) }), _jsxs("div", { className: "flex flex-col space-y-5", children: [_jsx("p", { className: "text-text-primary-900 text-lg font-semibold", children: "Daily Check-In Rules" }), _jsxs("ul", { className: "text-text-tertiary-600 group list-disc text-wrap pl-4 text-sm font-normal", children: [_jsx("li", { children: "Earn rewards just for checking in each day!" }), _jsx("li", { children: "Stay consistent to unlock special rewards on the 3rd, 5th, and 7th day." }), _jsx("li", { children: "Missing a day will reset your streak, starting again from Day 1." }), _jsx("li", { children: "Each check-in unlocks the next one on the following day." }), _jsx("li", { children: "Successfully check in for 7 consecutive days to complete the quest and reset the cycle." })] })] }), _jsx("div", { className: "pb-4 pt-6", children: _jsx(Button, { onClick: () => props.modalState.setIsOpen(false), children: "Ok" }) })] }) })] }) }));
9
+ }
@@ -0,0 +1,4 @@
1
+ import type { Quest } from '../../../types';
2
+ export declare function OnboardingQuest(props: {
3
+ quest: Quest;
4
+ }): null;
@@ -0,0 +1,4 @@
1
+ export function OnboardingQuest(props) {
2
+ console.log('OnboardingQuest not implemented', props.quest);
3
+ return null;
4
+ }
@@ -0,0 +1,4 @@
1
+ import type { Quest } from '../../../types';
2
+ export declare function WageringQuest({ quest }: {
3
+ quest: Quest;
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,20 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { twMerge } from 'tailwind-merge';
5
+ import { ClockStopWatchIcon } from '../../../icons/ClockStopWatchIcon.js';
6
+ import { InfoCircleIcon } from '../../../icons/InfoCircleIcon.js';
7
+ import { Badge } from '../../../ui/Badge/index.js';
8
+ import CountdownTimer from '../CountdownTimer.js';
9
+ import { WageringQuestModal } from './WageringQuestModal.js';
10
+ export function WageringQuest({ quest }) {
11
+ const [showRules, setShowRules] = useState(false);
12
+ const [isExpired, setIsExpired] = useState(false);
13
+ const { progressPercentage, turnover, targetTurnover, name, description, endDateTime, bonus, status, } = quest;
14
+ return (_jsxs(_Fragment, { children: [_jsx(WageringQuestModal, { questName: name, modalState: {
15
+ isOpen: showRules,
16
+ setIsOpen: setShowRules,
17
+ } }), _jsxs("div", { className: "border-border-primary bg-bg-tertiary flex h-full w-full flex-col space-y-6 rounded-2xl border px-4 pb-6 pt-5", children: [_jsxs("div", { className: "flex flex-col space-y-2", children: [_jsxs("div", { className: "flex max-h-7.5 items-start justify-between", children: [_jsx(CountdownTimer, { endDateTime: endDateTime, renderAction: (timeLeft) => (_jsxs(Badge.Root, { size: "lg", colorScheme: "brand", round: false, children: [_jsx(Badge.Icon, { children: _jsx(ClockStopWatchIcon, {}) }), _jsxs(Badge.Label, { children: [timeLeft.days, "d:", timeLeft.hours, "h:", timeLeft.minutes, "m:", timeLeft.seconds, "s"] })] })), onEnd: () => setIsExpired(true) }), _jsx("div", { role: "button", className: "bg-bg-primary border-border-secondary flex size-9 cursor-pointer items-center justify-center rounded-md border", onClick: () => setShowRules((prev) => !prev), children: _jsx(InfoCircleIcon, { className: "text-text-disabled size-5" }) })] }), _jsx("p", { className: "text-xl font-semibold", children: name }), _jsx("p", { className: "text-text-secondary-700 text-wrap text-sm font-normal", dangerouslySetInnerHTML: { __html: description } })] }), _jsxs("div", { className: "flex w-full flex-col space-y-2", children: [_jsxs("div", { className: "text-text-primary-brand group flex items-center justify-between", children: [_jsxs("p", { children: ["Progress ", parseInt(progressPercentage).toFixed(2), "%"] }), _jsxs("p", { children: [turnover, _jsxs("span", { className: "text-text-quarterary-brand", children: ["/", targetTurnover, " PHP"] })] })] }), _jsx("div", { className: "bg-bg-primary h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "bg-utility-brand-600 h-full rounded-full transition-all duration-300", style: { width: `${progressPercentage}%` } }) })] }), _jsx("div", { className: "flex h-full items-end", children: _jsx("div", { className: "bg-button-secondary-bg border-bg-primary-hover w-full rounded-md border px-3.5 py-2.5 text-center text-white", children: _jsxs("p", { className: twMerge(isExpired || status === 'COMPLETED' || status === 'FAILED'
18
+ ? ['opacity-50 grayscale']
19
+ : ''), children: ["Complete to get ", _jsxs("span", { className: "text-brand-400", children: ["\u20B1", bonus] }), ' ', "bonus!"] }) }) })] })] }));
20
+ }
@@ -0,0 +1,9 @@
1
+ interface Props {
2
+ questName: string;
3
+ modalState: {
4
+ isOpen: boolean;
5
+ setIsOpen: (isOpen: boolean) => void;
6
+ };
7
+ }
8
+ export declare function WageringQuestModal(props: Props): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,9 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { XIcon } from '../../../icons/XIcon.js';
4
+ import { Button } from '../../../ui/Button/index.js';
5
+ import { Dialog } from '../../../ui/Dialog/index.js';
6
+ import { Portal } from '../../../ui/Portal/index.js';
7
+ export function WageringQuestModal(props) {
8
+ return (_jsx(Dialog.Root, { lazyMount: true, unmountOnExit: true, open: props.modalState.isOpen, onOpenChange: ({ open }) => props.modalState.setIsOpen(open), closeOnEscape: false, closeOnInteractOutside: false, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, { className: "!z-[calc(var(--z-dialog)+1)]" }), _jsx(Dialog.Positioner, { className: "!z-[calc(var(--z-dialog)+2)] flex items-center justify-center", children: _jsxs(Dialog.Content, { className: "min-h-auto mx-auto max-w-[343px] rounded-xl px-4 pb-0 pt-5", children: [_jsx(Dialog.CloseTrigger, { children: _jsx(XIcon, {}) }), _jsxs("div", { className: "flex flex-col space-y-5", children: [_jsx("p", { className: "text-text-primary-900 text-lg font-semibold", children: props.questName }), _jsxs("ul", { className: "text-text-tertiary-600 group list-disc text-wrap pl-4 text-sm font-normal", children: [_jsx("li", { children: "Earn extra rewards just by playing Slots, every bet counts, win or lose!" }), _jsx("li", { children: "Reach the wagering requirement in bets to complete the quest and claim your reward." })] })] }), _jsx("div", { className: "pb-4 pt-6", children: _jsx(Button, { onClick: () => props.modalState.setIsOpen(false), children: "Ok" }) })] }) })] }) }));
9
+ }
@@ -1,3 +1,4 @@
1
- import type { SignUpProps } from './SignUp.lazy';
2
- export declare function SignUp(props: SignUpProps): import("react/jsx-runtime").JSX.Element | undefined;
1
+ import type { SignUpProps } from './SignUpDefault/SignUp.lazy';
2
+ import type { SignUpPagcorProps } from './SignUpPagcor/SignUpPagcor.lazy';
3
+ export declare function SignUp(props: SignUpProps | SignUpPagcorProps): import("react/jsx-runtime").JSX.Element | null;
3
4
  export type { SignUpProps };
@@ -3,12 +3,20 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import dynamic from 'next/dynamic';
4
4
  import { useShallow } from 'zustand/shallow';
5
5
  import { useGlobalStore } from '../../client/hooks/useGlobalStore.js';
6
- const Component = dynamic(() => import('./SignUp.lazy.js').then((m) => m.SignUp), {
6
+ const SignUpDefault = dynamic(() => import('./SignUpDefault/SignUp.lazy.js').then((m) => m.SignUp), {
7
+ ssr: false,
8
+ loading: () => null,
9
+ });
10
+ const SignUpPagcor = dynamic(() => import('./SignUpPagcor/SignUpPagcor.lazy.js').then((m) => m.SignUpPagcor), {
7
11
  ssr: false,
8
12
  loading: () => null,
9
13
  });
10
14
  export function SignUp(props) {
11
15
  const touched = useGlobalStore(useShallow((ctx) => ctx.signUp['~touched']));
12
- if (touched)
13
- return _jsx(Component, { ...props });
16
+ if (!touched)
17
+ return null;
18
+ if (props.layout === 'pagcor') {
19
+ return _jsx(SignUpPagcor, { ...props });
20
+ }
21
+ return _jsx(SignUpDefault, { ...props });
14
22
  }
@@ -0,0 +1,13 @@
1
+ import { type ImageProps } from 'next/image';
2
+ import { type ReactNode } from 'react';
3
+ import type { Branch } from '../../../types';
4
+ export interface SignUpProps {
5
+ logo: ImageProps['src'];
6
+ children?: ReactNode;
7
+ /** @default "/terms-and-conditions" */
8
+ termsAndConditionsUrl?: string;
9
+ className?: string;
10
+ branches?: Branch[];
11
+ layout: 'default';
12
+ }
13
+ export declare function SignUp(props: SignUpProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,18 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import Image, {} from 'next/image';
4
+ import { Suspense } from 'react';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import { useShallow } from 'zustand/shallow';
7
+ import { useGlobalStore } from '../../../client/hooks/useGlobalStore.js';
8
+ import { XIcon } from '../../../icons/XIcon.js';
9
+ import { Dialog } from '../../../ui/Dialog/index.js';
10
+ import { Portal } from '../../../ui/Portal/index.js';
11
+ import { SignUpPropsProvider } from './SignUpContext.js';
12
+ import { SignUpForm } from './SignUpForm.js';
13
+ export function SignUp(props) {
14
+ const signUpStore = useGlobalStore(useShallow((ctx) => ctx.signUp));
15
+ return (_jsx(SignUpPropsProvider, { value: props, children: _jsx(Dialog.Root, { open: signUpStore.open, onOpenChange: (details) => {
16
+ signUpStore.setOpen(details.open);
17
+ }, lazyMount: true, unmountOnExit: true, closeOnEscape: false, closeOnInteractOutside: false, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, {}), _jsx(Dialog.Positioner, { children: _jsxs(Dialog.Content, { className: twMerge('bg-bg-primary-alt mx-auto h-full w-full items-start p-3xl pb-4xl lg:h-auto lg:w-[400px] lg:rounded-xl', props.className), children: [_jsx(Dialog.CloseTrigger, { children: _jsx(XIcon, {}) }), _jsx(Image, { src: props.logo, alt: "", width: 200, height: 100, className: "mx-auto h-auto w-[120px]", draggable: false }), _jsx(Suspense, { children: _jsx(SignUpForm, {}) })] }) })] }) }) }));
18
+ }
@@ -0,0 +1,6 @@
1
+ import type { SignUpProps } from './SignUp.lazy';
2
+ export declare const SignUpPropsProvider: (props: {
3
+ value: SignUpProps;
4
+ } & {
5
+ children?: import("react").ReactNode | undefined;
6
+ }) => React.ReactNode, useSignUpPropsContext: () => SignUpProps;
@@ -0,0 +1,2 @@
1
+ import { createContext } from '../../../client/utils/createContext.js';
2
+ export const [SignUpPropsProvider, useSignUpPropsContext] = createContext();
@@ -0,0 +1 @@
1
+ export declare function SignUpForm(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,283 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { createListCollection, parseDate } from '@ark-ui/react';
4
+ import { useDialogContext } from '@ark-ui/react/dialog';
5
+ import { zodResolver } from '@hookform/resolvers/zod';
6
+ import { ObjectId } from '@opexa/object-id';
7
+ import { differenceInYears, format } from 'date-fns';
8
+ import Link from 'next/link';
9
+ import { useSearchParams } from 'next/navigation';
10
+ import { useRef, useState } from 'react';
11
+ import { Controller, useForm } from 'react-hook-form';
12
+ import { z } from 'zod';
13
+ import { useShallow } from 'zustand/shallow';
14
+ import { useControllableState } from '../../../client/hooks/useControllableState.js';
15
+ import { useCooldown } from '../../../client/hooks/useCooldown.js';
16
+ import { useGlobalStore } from '../../../client/hooks/useGlobalStore.js';
17
+ import { useLocaleInfo } from '../../../client/hooks/useLocaleInfo.js';
18
+ import { useMobileNumberParser } from '../../../client/hooks/useMobileNumberParser.js';
19
+ import { useSendVerificationCodeMutation } from '../../../client/hooks/useSendVerificationCodeMutation.js';
20
+ import { useSignInMutation } from '../../../client/hooks/useSignInMutation.js';
21
+ import { useSignUpMutation } from '../../../client/hooks/useSignUpMutation.js';
22
+ import { useUpdateAccountMutation } from '../../../client/hooks/useUpdateAccountMutation.js';
23
+ import { toaster } from '../../../client/utils/toaster.js';
24
+ import { BRANCHES } from '../../../constants/index.js';
25
+ import { ArrowLeftIcon } from '../../../icons/ArrowLeftIcon.js';
26
+ import { CalendarIcon } from '../../../icons/CalendarIcon.js';
27
+ import { CheckIcon } from '../../../icons/CheckIcon.js';
28
+ import { ChevronDownIcon } from '../../../icons/ChevronDownIcon.js';
29
+ import { ChevronLeftIcon } from '../../../icons/ChevronLeftIcon.js';
30
+ import { ChevronRightIcon } from '../../../icons/ChevronRightIcon.js';
31
+ import { HelpCircleIcon } from '../../../icons/HelpCircleIcon.js';
32
+ import { ObjectType } from '../../../services/ObjectType.js';
33
+ import { Button } from '../../../ui/Button/index.js';
34
+ import { Checkbox } from '../../../ui/Checkbox/index.js';
35
+ import { DatePicker } from '../../../ui/DatePicker/index.js';
36
+ import { Field } from '../../../ui/Field/index.js';
37
+ import { PinInput } from '../../../ui/PinInput/index.js';
38
+ import { Select } from '../../../ui/Select/index.js';
39
+ import { Tooltip } from '../../../ui/Tooltip/index.js';
40
+ import { createPoll } from '../../../utils/createPoll.js';
41
+ import { useSignUpPropsContext } from './SignUpContext.js';
42
+ export function SignUpForm() {
43
+ const signUpProps = useSignUpPropsContext();
44
+ const branchCollection = createListCollection({
45
+ items: signUpProps.branches ?? BRANCHES,
46
+ itemToValue: (item) => item.code,
47
+ itemToString: (item) => `${item.code} - ${item.name}`,
48
+ });
49
+ const [step, setStep] = useState(1);
50
+ const dialog = useDialogContext();
51
+ const search = useSearchParams();
52
+ const signInStore = useGlobalStore(useShallow((ctx) => ctx.signIn));
53
+ const signUpMutation = useSignUpMutation();
54
+ const signInMutation = useSignInMutation();
55
+ const updateAccountMutation = useUpdateAccountMutation();
56
+ const sendVerificationCodeMutation = useSendVerificationCodeMutation();
57
+ const localeInfo = useLocaleInfo();
58
+ const mobileNumberParser = useMobileNumberParser();
59
+ const Step1Definition = z.object({
60
+ mobileNumber: z
61
+ .string()
62
+ .min(1, 'Mobile number is required')
63
+ .superRefine((v, ctx) => {
64
+ if (!mobileNumberParser.validate(v)) {
65
+ ctx.addIssue({
66
+ code: z.ZodIssueCode.custom,
67
+ message: 'Invalid mobile number',
68
+ });
69
+ }
70
+ }),
71
+ termsAccepted: z.boolean().superRefine((v, ctx) => {
72
+ if (!v) {
73
+ ctx.addIssue({
74
+ code: z.ZodIssueCode.custom,
75
+ message: 'You must accept the terms and conditions',
76
+ });
77
+ }
78
+ }),
79
+ realName: z
80
+ .string()
81
+ .min(2, 'Real name must be 2 or more characters')
82
+ .max(50, 'Real name must not be more than 50 characters')
83
+ .trim(),
84
+ birthDay: z
85
+ .date({
86
+ invalid_type_error: 'Date of birth is required',
87
+ required_error: 'Date of birth is required',
88
+ })
89
+ .superRefine((val, ctx) => {
90
+ const now = new Date();
91
+ const age = differenceInYears(now, val);
92
+ if (age < 21) {
93
+ return ctx.addIssue({
94
+ code: z.ZodIssueCode.custom,
95
+ message: 'You must be at least 21 years old',
96
+ });
97
+ }
98
+ }),
99
+ branchCode: z.string().min(1, 'Branch is required').trim(),
100
+ });
101
+ const Step2Definition = z.object({
102
+ verificationCode: z.array(z.string()).superRefine((val, ctx) => {
103
+ if (val.length !== 6 || val.some((v) => v.length !== 1)) {
104
+ ctx.addIssue({
105
+ code: z.ZodIssueCode.custom,
106
+ message: 'Please Enter your 6 digits verification code',
107
+ });
108
+ }
109
+ }),
110
+ });
111
+ const step1Form = useForm({
112
+ mode: 'all',
113
+ resolver: zodResolver(Step1Definition),
114
+ defaultValues: {
115
+ mobileNumber: '',
116
+ termsAccepted: false,
117
+ branchCode: signUpProps?.branches?.[0]?.code ?? BRANCHES[0].code,
118
+ realName: '',
119
+ },
120
+ });
121
+ const step2Form = useForm({
122
+ resolver: zodResolver(Step2Definition),
123
+ defaultValues: {
124
+ verificationCode: Array.from({ length: 6 }).fill(''),
125
+ },
126
+ });
127
+ const cooldown = useCooldown({
128
+ max: 60,
129
+ duration: 1000 * 60,
130
+ });
131
+ const form2Ref = useRef(null);
132
+ const birthDay = step1Form.watch('birthDay');
133
+ const branchCode = step1Form.watch('branchCode', '');
134
+ return (_jsxs(_Fragment, { children: [step === 1 && (_jsxs(_Fragment, { children: [_jsx("h2", { className: "mt-xl text-center text-lg font-semibold", children: "Create an account" }), _jsx("p", { className: "text-text-secondary-700 mt-xs text-center text-sm", children: "Register instantly and start playing!" }), _jsxs("form", { className: "mt-3xl", autoComplete: "off", onSubmit: step1Form.handleSubmit(async (data) => {
135
+ try {
136
+ await sendVerificationCodeMutation.mutateAsync({
137
+ channel: 'SMS',
138
+ recipient: mobileNumberParser.format(data.mobileNumber),
139
+ });
140
+ setStep(2);
141
+ cooldown.start();
142
+ }
143
+ catch (e) {
144
+ toaster.error({
145
+ description: e instanceof Error
146
+ ? e.message
147
+ : 'Failed to send verification code',
148
+ });
149
+ }
150
+ }), children: [_jsxs(Field.Root, { invalid: !!step1Form.formState.errors.mobileNumber, children: [_jsx(Field.Label, { children: "Mobile Number" }), _jsxs("div", { className: "relative", children: [_jsxs("div", { className: "absolute left-3.5 top-1/2 flex shrink-0 -translate-y-1/2 items-center gap-md", children: [_jsx(localeInfo.country.flag, { className: "size-5" }), _jsx("span", { className: "text-text-placeholder", children: localeInfo.mobileNumber.areaCode })] }), _jsx(Field.Input, { style: {
151
+ paddingLeft: `calc(2.75rem + ${localeInfo.mobileNumber.areaCode.length}ch)`,
152
+ }, ...step1Form.register('mobileNumber') })] }), _jsx(Field.ErrorText, { children: step1Form.formState.errors.mobileNumber?.message })] }), _jsxs(Field.Root, { invalid: !!step1Form.formState.errors.realName, className: "mt-xl", children: [_jsx(Field.Label, { children: "Real Name" }), _jsx(Field.Input, { placeholder: "Enter your real name", ...step1Form.register('realName') }), _jsx(Field.ErrorText, { children: step1Form.formState.errors.realName?.message })] }), _jsxs(Field.Root, { invalid: !!step1Form.formState.errors.birthDay, className: "mt-xl", children: [_jsx(DateOfBirthField, { value: birthDay, onChange: (value) => {
153
+ if (!value)
154
+ return;
155
+ step1Form.setValue('birthDay', value, {
156
+ shouldDirty: true,
157
+ shouldTouch: true,
158
+ shouldValidate: true,
159
+ });
160
+ }, onBlur: () => {
161
+ step1Form.trigger('birthDay');
162
+ } }), _jsx(Field.ErrorText, { children: step1Form.formState.errors.birthDay?.message })] }), _jsxs(Field.Root, { invalid: !!step1Form.formState.errors.branchCode, className: "mt-xl", children: [_jsxs(Select.Root, { value: [branchCode], onValueChange: (details) => {
163
+ step1Form.setValue('branchCode', details.value.at(0) ??
164
+ signUpProps?.branches?.[0]?.code ??
165
+ BRANCHES[0].code, {
166
+ shouldDirty: true,
167
+ shouldTouch: true,
168
+ shouldValidate: true,
169
+ });
170
+ }, collection: branchCollection, positioning: {
171
+ sameWidth: true,
172
+ placement: 'bottom',
173
+ }, lazyMount: true, unmountOnExit: true, children: [_jsxs(Select.Label, { className: "flex items-center gap-1", children: ["Branch", _jsxs(Tooltip.Root, { openDelay: 0, closeDelay: 100, lazyMount: true, unmountOnExit: true, positioning: {
174
+ placement: 'top',
175
+ }, children: [_jsx(Tooltip.Trigger, { children: _jsx(HelpCircleIcon, { className: "text-text-nav-item-button-icon size-4" }) }), _jsx(Tooltip.Positioner, { children: _jsxs(Tooltip.Content, { children: [_jsx(Tooltip.Arrow, { children: _jsx(Tooltip.ArrowTip, {}) }), "Choose branch closest to your residence."] }) })] })] }), _jsxs(Select.Trigger, { children: [_jsx(Select.ValueText, {}), _jsx(Select.Indicator, { asChild: true, children: _jsx(ChevronDownIcon, {}) })] }), _jsx(Select.Positioner, { children: _jsx(Select.Content, { children: branchCollection.items.map((item) => {
176
+ const label = branchCollection.stringifyItem(item) ?? '';
177
+ return (_jsx(Select.Item, { item: item, children: _jsx("div", { title: label, className: "line-clamp-1", children: label }) }, item.code));
178
+ }) }) })] }), _jsx(Field.ErrorText, { children: step1Form.formState.errors.branchCode?.message })] }), _jsx(Controller, { control: step1Form.control, name: "termsAccepted", render: (o) => (_jsxs(Field.Root, { className: "mt-2xl", invalid: o.fieldState.invalid, children: [_jsxs(Checkbox.Root, { checked: o.field.value, onCheckedChange: (details) => {
179
+ o.field.onChange(details.checked);
180
+ }, children: [_jsx(Checkbox.Control, { children: _jsx(Checkbox.Indicator, { asChild: true, children: _jsx(CheckIcon, {}) }) }), _jsxs(Checkbox.Label, { children: ["I am at least 21 years of age and I accept the", ' ', _jsx(Link, { href: signUpProps.termsAndConditionsUrl ??
181
+ '/terms-and-conditions', onClick: () => {
182
+ dialog.setOpen(false);
183
+ }, className: "text-brand-400 whitespace-nowrap underline underline-offset-2", children: "Terms and Conditions." })] }), ' ', _jsx(Checkbox.HiddenInput, {})] }), _jsx(Field.ErrorText, { className: "ml-6 text-xs", children: o.fieldState.error?.message })] })) }), _jsx(Button, { type: "submit", className: "mt-3xl", disabled: step1Form.formState.isSubmitting, children: "Create Account" })] }), _jsxs("div", { className: "mt-6 flex w-full items-center justify-center gap-xs text-sm", children: [_jsx("span", { className: "text-text-tertiary-600", children: "Already have an account?" }), _jsx("button", { type: "submit", className: "text-button-tertiary-fg font-semibold", onClick: () => {
184
+ dialog.setOpen(false);
185
+ signInStore.setOpen(true);
186
+ }, children: "Log In" })] })] })), step === 2 && (_jsxs(_Fragment, { children: [_jsx("h2", { className: "mt-xl text-center text-lg font-semibold", children: "Check your Phone" }), _jsxs("p", { className: "text-text-secondary-700 mt-xs text-center text-sm", children: ["We\u2019ve sent a verification code to your mobile number", ' ', _jsx("span", { className: "font-semibold", children: mobileNumberParser.format(step1Form.getValues('mobileNumber')) }), ' ', "via text"] }), _jsxs("form", { ref: form2Ref, className: "mt-5", onSubmit: step2Form.handleSubmit(async ({ verificationCode }) => {
187
+ const id = ObjectId.generate(ObjectType.MemberAccount).toString();
188
+ const { mobileNumber } = step1Form.getValues();
189
+ try {
190
+ await signUpMutation.mutateAsync({
191
+ id,
192
+ mobileNumber: mobileNumberParser.format(mobileNumber),
193
+ verificationCode: verificationCode.join(''),
194
+ referralCode: search.get('referralCode') ?? undefined,
195
+ btag: search.get('btag') ?? undefined,
196
+ });
197
+ const name = mobileNumberParser.format(mobileNumber);
198
+ const password = `${name}${id}`;
199
+ const pollLogin = createPoll(async () => {
200
+ try {
201
+ await signInMutation.mutateAsync({
202
+ type: 'NAME_AND_PASSWORD',
203
+ name,
204
+ password,
205
+ });
206
+ return true;
207
+ }
208
+ catch {
209
+ return false;
210
+ }
211
+ }, {
212
+ until: (ok) => ok,
213
+ maxAttempt: 3,
214
+ });
215
+ const ok = await pollLogin();
216
+ if (!ok) {
217
+ signInStore.setOpen(true);
218
+ }
219
+ else {
220
+ const pollUpdateAccount = createPoll(async () => {
221
+ try {
222
+ await updateAccountMutation.mutateAsync({
223
+ branchCode: step1Form.getValues('branchCode'),
224
+ realName: step1Form.getValues('realName'),
225
+ birthDay: format(step1Form.getValues('birthDay'), 'yyyy-MM-dd'),
226
+ });
227
+ return true;
228
+ }
229
+ catch {
230
+ return false;
231
+ }
232
+ }, {
233
+ until: (ok) => ok,
234
+ maxAttempt: 3,
235
+ });
236
+ await pollUpdateAccount();
237
+ }
238
+ dialog.setOpen(false);
239
+ step1Form.reset();
240
+ step2Form.reset();
241
+ setStep(1);
242
+ }
243
+ catch (error) {
244
+ toaster.error({
245
+ description: error instanceof Error
246
+ ? error.message
247
+ : 'Invalid Verification Code',
248
+ });
249
+ }
250
+ }), children: [_jsx(Controller, { name: "verificationCode", control: step2Form.control, render: (o) => (_jsxs(Field.Root, { invalid: o.fieldState.invalid, children: [_jsxs(PinInput.Root, { placeholder: "0", value: o.field.value, onValueChange: (details) => {
251
+ o.field.onChange(details.value);
252
+ }, onValueComplete: () => {
253
+ form2Ref.current?.requestSubmit();
254
+ }, blurOnComplete: true, readOnly: step2Form.formState.isSubmitting, type: "numeric", children: [_jsxs(PinInput.Control, { className: "grid-cols-[1fr_1fr_1fr_auto_1fr_1fr_1fr] items-center gap-md", children: [_jsx(PinInput.Input, { index: 0 }), _jsx(PinInput.Input, { index: 1 }), _jsx(PinInput.Input, { index: 2 }), _jsx("span", { className: "text-text-placeholder-subtle text-2xl font-medium", children: "\u2013" }), _jsx(PinInput.Input, { index: 3 }), _jsx(PinInput.Input, { index: 4 }), _jsx(PinInput.Input, { index: 5 })] }), _jsx(PinInput.HiddenInput, {})] }), _jsx(Field.ErrorText, { children: o.formState.errors.verificationCode?.message })] })) }), _jsx(Button, { type: "submit", className: "mt-4xl", disabled: step2Form.formState.isSubmitting, children: "Verify" }), _jsxs("div", { className: "mt-3 flex w-full items-center justify-center gap-xs text-sm", children: [_jsx("span", { className: "text-text-secondary-700", children: "Didn't recieve the code?" }), _jsx("button", { type: "button", className: "text-button-secondary-fg font-semibold disabled:cursor-not-allowed disabled:opacity-75", disabled: cooldown.cooling, onClick: async () => {
255
+ await sendVerificationCodeMutation.mutateAsync({
256
+ channel: 'SMS',
257
+ recipient: mobileNumberParser.format(step1Form.getValues('mobileNumber')),
258
+ });
259
+ cooldown.start();
260
+ }, children: cooldown.cooling
261
+ ? `Resend in ${cooldown.countdown}s`
262
+ : 'Resend' })] }), _jsxs("button", { type: "button", className: "text-text-tertiary-600 mx-auto mt-3xl flex w-fit items-center gap-1 text-sm font-semibold", onClick: () => {
263
+ setStep(1);
264
+ step2Form.reset();
265
+ cooldown.stop();
266
+ }, children: [_jsx(ArrowLeftIcon, { className: "size-5" }), "Back"] })] })] }))] }));
267
+ }
268
+ const DEVICE_TIMEZONE = Intl.DateTimeFormat().resolvedOptions().timeZone;
269
+ function DateOfBirthField(props) {
270
+ const [value, setValue] = useControllableState({
271
+ value: props.value,
272
+ defaultValue: props.defaultValue ?? null,
273
+ onChange: props.onChange,
274
+ });
275
+ return (_jsxs(DatePicker.Root, { size: "md", variant: "outline", placeholder: "MM/DD/YYYY", lazyMount: true, unmountOnExit: true, fixedWeeks: true, selectionMode: "single", value: value ? [parseDate(value)] : [], onValueChange: (details) => {
276
+ const value = details.value.at(0)?.toDate(DEVICE_TIMEZONE);
277
+ setValue(value ?? null);
278
+ }, children: [_jsx(DatePicker.Label, { children: "Date of Birth" }), _jsxs(DatePicker.Control, { children: [_jsx(DatePicker.Input, { onBlur: props.onBlur, onFocus: props.onFocus }), _jsx(DatePicker.Trigger, { children: _jsx(CalendarIcon, {}) })] }), _jsx(DatePicker.Positioner, { children: _jsxs(DatePicker.Content, { children: [_jsx(DatePicker.View, { view: "day", children: _jsx(DatePicker.Context, { children: (api) => (_jsxs(_Fragment, { children: [_jsxs(DatePicker.ViewControl, { children: [_jsx(DatePicker.PrevTrigger, { children: _jsx(ChevronLeftIcon, {}) }), _jsx(DatePicker.ViewTrigger, { children: _jsx(DatePicker.RangeText, {}) }), _jsx(DatePicker.NextTrigger, { children: _jsx(ChevronRightIcon, {}) })] }), _jsxs(DatePicker.Table, { children: [_jsx(DatePicker.TableHead, { children: _jsx(DatePicker.TableRow, { children: api.weekDays.map((weekDay, id) => (_jsx(DatePicker.TableHeader, { children: weekDay.short.substring(0, 2) }, id))) }) }), _jsx(DatePicker.TableBody, { children: api.weeks.map((week, id) => (_jsx(DatePicker.TableRow, { children: week.map((day, id) => (_jsx(DatePicker.TableCell, { value: day, children: _jsx(DatePicker.TableCellTrigger, { children: day.day }) }, id))) }, id))) })] })] })) }) }), _jsx(DatePicker.View, { view: "month", children: _jsx(DatePicker.Context, { children: (datePicker) => (_jsxs(_Fragment, { children: [_jsxs(DatePicker.ViewControl, { children: [_jsx(DatePicker.PrevTrigger, { children: _jsx(ChevronLeftIcon, {}) }), _jsx(DatePicker.ViewTrigger, { children: _jsx(DatePicker.RangeText, {}) }), _jsx(DatePicker.NextTrigger, { children: _jsx(ChevronRightIcon, {}) })] }), _jsx(DatePicker.Table, { children: _jsx(DatePicker.TableBody, { children: datePicker
279
+ .getMonthsGrid({ columns: 4, format: 'short' })
280
+ .map((months, id) => (_jsx(DatePicker.TableRow, { children: months.map((month, id) => (_jsx(DatePicker.TableCell, { value: month.value, children: _jsx(DatePicker.TableCellTrigger, { className: "w-[4.425rem]", children: month.label }) }, id))) }, id))) }) })] })) }) }), _jsx(DatePicker.View, { view: "year", children: _jsx(DatePicker.Context, { children: (datePicker) => (_jsxs(_Fragment, { children: [_jsxs(DatePicker.ViewControl, { children: [_jsx(DatePicker.PrevTrigger, { children: _jsx(ChevronLeftIcon, {}) }), _jsx(DatePicker.ViewTrigger, { children: _jsx(DatePicker.RangeText, {}) }), _jsx(DatePicker.NextTrigger, { children: _jsx(ChevronRightIcon, {}) })] }), _jsx(DatePicker.Table, { children: _jsx(DatePicker.TableBody, { children: datePicker
281
+ .getYearsGrid({ columns: 4 })
282
+ .map((years, id) => (_jsx(DatePicker.TableRow, { children: years.map((year, id) => (_jsx(DatePicker.TableCell, { value: year.value, children: _jsx(DatePicker.TableCellTrigger, { className: "w-[4.425rem]", children: year.label }) }, id))) }, id))) }) })] })) }) })] }) })] }));
283
+ }
@@ -192,6 +192,7 @@ export function SignUpForm() {
192
192
  mobileNumber: mobileNumberParser.format(mobileNumber),
193
193
  verificationCode: verificationCode.join(''),
194
194
  referralCode: search.get('referralCode') ?? undefined,
195
+ domain: search.get('domain') ?? undefined,
195
196
  btag: search.get('btag') ?? undefined,
196
197
  });
197
198
  const name = mobileNumberParser.format(mobileNumber);
@@ -251,7 +252,7 @@ export function SignUpForm() {
251
252
  o.field.onChange(details.value);
252
253
  }, onValueComplete: () => {
253
254
  form2Ref.current?.requestSubmit();
254
- }, blurOnComplete: true, readOnly: step2Form.formState.isSubmitting, type: "numeric", children: [_jsxs(PinInput.Control, { className: "grid-cols-[1fr_1fr_1fr_auto_1fr_1fr_1fr] items-center gap-md", children: [_jsx(PinInput.Input, { index: 0 }), _jsx(PinInput.Input, { index: 1 }), _jsx(PinInput.Input, { index: 2 }), _jsx("span", { className: "text-text-placeholder-subtle text-2xl font-medium", children: "\u2013" }), _jsx(PinInput.Input, { index: 3 }), _jsx(PinInput.Input, { index: 4 }), _jsx(PinInput.Input, { index: 5 })] }), _jsx(PinInput.HiddenInput, {})] }), _jsx(Field.ErrorText, { children: o.formState.errors.verificationCode?.message })] })) }), _jsx(Button, { type: "submit", className: "mt-4xl", disabled: step2Form.formState.isSubmitting, children: "Verify" }), _jsxs("div", { className: "mt-3 flex w-full items-center justify-center gap-xs text-sm", children: [_jsx("span", { className: "text-text-secondary-700", children: "Didn't recieve the code?" }), _jsx("button", { type: "button", className: "text-button-secondary-fg font-semibold disabled:cursor-not-allowed disabled:opacity-75", disabled: cooldown.cooling, onClick: async () => {
255
+ }, children: [_jsxs(PinInput.Control, { className: "grid-cols-[1fr_1fr_1fr_auto_1fr_1fr_1fr] items-center gap-md", children: [_jsx(PinInput.Input, { index: 0 }), _jsx(PinInput.Input, { index: 1 }), _jsx(PinInput.Input, { index: 2 }), _jsx("span", { className: "text-text-placeholder-subtle text-2xl font-medium", children: "\u2013" }), _jsx(PinInput.Input, { index: 3 }), _jsx(PinInput.Input, { index: 4 }), _jsx(PinInput.Input, { index: 5 })] }), _jsx(PinInput.HiddenInput, {})] }), _jsx(Field.ErrorText, { children: o.formState.errors.verificationCode?.message })] })) }), _jsx(Button, { type: "submit", className: "mt-4xl", disabled: step2Form.formState.isSubmitting, children: "Verify" }), _jsxs("div", { className: "mt-3 flex w-full items-center justify-center gap-xs text-sm", children: [_jsx("span", { className: "text-text-secondary-700", children: "Didn't recieve the code?" }), _jsx("button", { type: "button", className: "text-button-secondary-fg font-semibold disabled:cursor-not-allowed disabled:opacity-75", disabled: cooldown.cooling, onClick: async () => {
255
256
  await sendVerificationCodeMutation.mutateAsync({
256
257
  channel: 'SMS',
257
258
  recipient: mobileNumberParser.format(step1Form.getValues('mobileNumber')),
@@ -0,0 +1 @@
1
+ export declare function CaptureIdDocument(): import("react/jsx-runtime").JSX.Element;