@opexa/portal-components 0.0.927 → 0.0.929

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 (183) hide show
  1. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__legacy/QRPHDepositContext.d.ts +2 -2
  2. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__legacy/useQRPHDeposit.d.ts +1 -1
  3. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/Confirmed.d.ts +1 -0
  4. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/Confirmed.js +11 -0
  5. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/Failed.d.ts +1 -0
  6. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/Failed.js +11 -0
  7. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/Form.d.ts +1 -0
  8. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/Form.js +126 -0
  9. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/GeneratingQrCode.d.ts +1 -0
  10. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/GeneratingQrCode.js +10 -0
  11. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/QRPHDeposit.d.ts +1 -0
  12. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/QRPHDeposit.js +12 -0
  13. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/QRPHDepositContext.d.ts +17 -0
  14. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/QRPHDepositContext.js +2 -0
  15. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/QrCodeGenerated.d.ts +1 -0
  16. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/QrCodeGenerated.js +41 -0
  17. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/useQRPHDeposit.d.ts +13 -0
  18. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/useQRPHDeposit.js +91 -0
  19. package/dist/components/DepositWithdrawal/Deposit__legacy/OnlineBankDeposit/OnlineBankDepositContext.d.ts +2 -2
  20. package/dist/components/DepositWithdrawal/Deposit__legacy/OnlineBankDeposit/useOnlineBankDeposit.d.ts +1 -1
  21. package/dist/components/DepositWithdrawal/Deposit__legacy/QRPHDeposit/QRPHDepositContext.d.ts +2 -2
  22. package/dist/components/DepositWithdrawal/Deposit__legacy/QRPHDeposit/useQRPHDeposit.d.ts +1 -1
  23. package/dist/components/DigitainLauncher/Loading.js +1 -1
  24. package/dist/components/Disclaimer/DisclaimerV2.js +4 -9
  25. package/dist/components/Disclaimer/ResponsibleGaming.d.ts +10 -0
  26. package/dist/components/Disclaimer/ResponsibleGaming.js +13 -0
  27. package/dist/components/Disclaimer/TermsOfUse.d.ts +11 -0
  28. package/dist/components/Disclaimer/TermsOfUse.js +13 -0
  29. package/dist/components/FeatureFlag/FeatureFlag.d.ts +1 -0
  30. package/dist/components/FeatureFlag/FeatureFlag.js +29 -0
  31. package/dist/components/FeatureFlag/index.d.ts +1 -0
  32. package/dist/components/FeatureFlag/index.js +1 -0
  33. package/dist/components/ForgotPassword/Crazywin/ForgotPassword.module.css +42 -42
  34. package/dist/components/Jackpots/Jackpots.module.css +288 -288
  35. package/dist/components/Jackpots/JackpotsCarousel/JackpotsCarouselItem.module.css +184 -184
  36. package/dist/components/Jackpots/JackpotsList/JackpotsListItem.module.css +184 -184
  37. package/dist/components/KYC/AutoOpen.d.ts +1 -0
  38. package/dist/components/KYC/AutoOpen.js +40 -0
  39. package/dist/components/KYC/BasicInformation.js +1 -1
  40. package/dist/components/KYC/CaptureIdDocument.d.ts +1 -0
  41. package/dist/components/KYC/CaptureIdDocument.js +219 -0
  42. package/dist/components/KYC/CaptureSelfie.d.ts +1 -0
  43. package/dist/components/KYC/CaptureSelfie.js +285 -0
  44. package/dist/components/KYC/DisplayImage.d.ts +5 -0
  45. package/dist/components/KYC/DisplayImage.js +8 -0
  46. package/dist/components/KYC/FileUpload.d.ts +10 -0
  47. package/dist/components/KYC/FileUpload.js +72 -0
  48. package/dist/components/KYC/IdentityVerification.js +1 -1
  49. package/dist/components/KYC/KYC.lazy.js +1 -1
  50. package/dist/components/KYC/KYCDefault/KYCVerificationStatus.lazy.js +2 -2
  51. package/dist/components/KYC/KYCNonPagCor/KYCVerificationStatus.lazy.js +2 -2
  52. package/dist/components/KYC/KYCVerificationStatus.lazy.js +8 -5
  53. package/dist/components/KYC/NoCameraError.d.ts +7 -0
  54. package/dist/components/KYC/NoCameraError.js +6 -0
  55. package/dist/components/KYC/PersonOverlayDesktop.d.ts +7 -0
  56. package/dist/components/KYC/PersonOverlayDesktop.js +9 -0
  57. package/dist/components/KYC/PersonalInformation.js +1 -1
  58. package/dist/components/KYC/backup/Header.d.ts +1 -0
  59. package/dist/components/KYC/backup/Header.js +8 -0
  60. package/dist/components/KYC/backup/Indicator.d.ts +1 -0
  61. package/dist/components/KYC/backup/Indicator.js +9 -0
  62. package/dist/components/KYC/backup/KYC.d.ts +1 -0
  63. package/dist/components/KYC/backup/KYC.js +14 -0
  64. package/dist/components/KYC/backup/KYC.lazy.d.ts +1 -0
  65. package/dist/components/KYC/backup/KYC.lazy.js +26 -0
  66. package/dist/components/KYC/backup/KYCContext.d.ts +6 -0
  67. package/dist/components/KYC/backup/KYCContext.js +2 -0
  68. package/dist/components/KYC/backup/Step1.d.ts +1 -0
  69. package/dist/components/KYC/backup/Step1.js +13 -0
  70. package/dist/components/KYC/backup/Step2.d.ts +1 -0
  71. package/dist/components/KYC/backup/Step2.js +13 -0
  72. package/dist/components/KYC/backup/Step3.d.ts +1 -0
  73. package/dist/components/KYC/backup/Step3.js +13 -0
  74. package/dist/components/KYC/backup/Step4.d.ts +1 -0
  75. package/dist/components/KYC/backup/Step4.js +7 -0
  76. package/dist/components/KYC/backup/useKYC.d.ts +10 -0
  77. package/dist/components/KYC/backup/useKYC.js +8 -0
  78. package/dist/components/KYC/loadModels.d.ts +1 -0
  79. package/dist/components/KYC/loadModels.js +9 -0
  80. package/dist/components/KYC/utils.d.ts +9 -0
  81. package/dist/components/KYC/utils.js +79 -0
  82. package/dist/components/Messages/Message.d.ts +1 -0
  83. package/dist/components/Messages/Message.js +35 -0
  84. package/dist/components/Messages/MessageContext.d.ts +6 -0
  85. package/dist/components/Messages/MessageContext.js +2 -0
  86. package/dist/components/Messages/MessagePopup.d.ts +1 -0
  87. package/dist/components/Messages/MessagePopup.js +20 -0
  88. package/dist/components/Messages/MessageTrigger.d.ts +8 -0
  89. package/dist/components/Messages/MessageTrigger.js +19 -0
  90. package/dist/components/PortalProvider/CXDTokenObserver.js +11 -11
  91. package/dist/components/Quests/CountdownTimer.d.ts +15 -0
  92. package/dist/components/Quests/CountdownTimer.js +33 -0
  93. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuest.d.ts +4 -0
  94. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuest.js +78 -0
  95. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuestModal.d.ts +8 -0
  96. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuestModal.js +9 -0
  97. package/dist/components/Quests/OnboardingQuest/OnboardingQuest.d.ts +4 -0
  98. package/dist/components/Quests/OnboardingQuest/OnboardingQuest.js +4 -0
  99. package/dist/components/Quests/WageringQuest/WageringQuest.d.ts +4 -0
  100. package/dist/components/Quests/WageringQuest/WageringQuest.js +20 -0
  101. package/dist/components/Quests/WageringQuest/WageringQuestModal.d.ts +9 -0
  102. package/dist/components/Quests/WageringQuest/WageringQuestModal.js +9 -0
  103. package/dist/components/SignUp/SignUp.lazy.d.ts +12 -0
  104. package/dist/components/SignUp/SignUp.lazy.js +18 -0
  105. package/dist/components/SignUp/SignUpContext.d.ts +6 -0
  106. package/dist/components/SignUp/SignUpContext.js +2 -0
  107. package/dist/components/SignUp/SignUpDefault/SignUp.lazy.d.ts +17 -0
  108. package/dist/components/SignUp/SignUpDefault/SignUp.lazy.js +18 -0
  109. package/dist/components/SignUp/SignUpDefault/SignUpContext.d.ts +6 -0
  110. package/dist/components/SignUp/SignUpDefault/SignUpContext.js +2 -0
  111. package/dist/components/SignUp/SignUpDefault/SignUpForm.d.ts +1 -0
  112. package/dist/components/SignUp/SignUpDefault/SignUpForm.js +310 -0
  113. package/dist/components/SignUp/SignUpForm.d.ts +1 -0
  114. package/dist/components/SignUp/SignUpForm.js +284 -0
  115. package/dist/components/SignUp/SignUpKYC/CaptureIdDocument.d.ts +1 -0
  116. package/dist/components/SignUp/SignUpKYC/CaptureIdDocument.js +198 -0
  117. package/dist/components/SignUp/SignUpKYC/CaptureSelfie.d.ts +1 -0
  118. package/dist/components/SignUp/SignUpKYC/CaptureSelfie.js +251 -0
  119. package/dist/components/SignUp/SignUpKYC/ImageUploader.d.ts +10 -0
  120. package/dist/components/SignUp/SignUpKYC/ImageUploader.js +42 -0
  121. package/dist/components/SignUp/SignUpKYC/PersonOverlayDesktop.d.ts +7 -0
  122. package/dist/components/SignUp/SignUpKYC/PersonOverlayDesktop.js +9 -0
  123. package/dist/components/SignUp/SignUpKYC/SignUpFormKYC.d.ts +1 -0
  124. package/dist/components/SignUp/SignUpKYC/SignUpFormKYC.js +464 -0
  125. package/dist/components/SignUp/SignUpKYC/useImageUploader.d.ts +11 -0
  126. package/dist/components/SignUp/SignUpKYC/useImageUploader.js +20 -0
  127. package/dist/components/SignUp/SignUpKYC/utils.d.ts +9 -0
  128. package/dist/components/SignUp/SignUpKYC/utils.js +79 -0
  129. package/dist/components/SignUp/SignUpPagcor/CaptureIdDocument.d.ts +1 -0
  130. package/dist/components/SignUp/SignUpPagcor/CaptureIdDocument.js +198 -0
  131. package/dist/components/SignUp/SignUpPagcor/CaptureSelfie.d.ts +1 -0
  132. package/dist/components/SignUp/SignUpPagcor/CaptureSelfie.js +251 -0
  133. package/dist/components/SignUp/SignUpPagcor/ImageUploader.d.ts +10 -0
  134. package/dist/components/SignUp/SignUpPagcor/ImageUploader.js +41 -0
  135. package/dist/components/SignUp/SignUpPagcor/SignUpFormPagcor.d.ts +1 -0
  136. package/dist/components/SignUp/SignUpPagcor/SignUpFormPagcor.js +429 -0
  137. package/dist/components/SignUp/SignUpPagcor/SignUpPagcor.lazy.d.ts +13 -0
  138. package/dist/components/SignUp/SignUpPagcor/SignUpPagcor.lazy.js +26 -0
  139. package/dist/components/SignUp/SignUpPagcor/SignUpPagcorContext.d.ts +7 -0
  140. package/dist/components/SignUp/SignUpPagcor/SignUpPagcorContext.js +2 -0
  141. package/dist/components/SignUp/SignUpPagcor/useImageUploader.d.ts +11 -0
  142. package/dist/components/SignUp/SignUpPagcor/useImageUploader.js +20 -0
  143. package/dist/components/Tournaments/TournamentsCarousel/TournamentsCarouselItem.module.css +184 -184
  144. package/dist/components/Tournaments/TournamentsList/TournamentItem.module.css +184 -184
  145. package/dist/components/shared/IdDocumentField.client.d.ts +25 -0
  146. package/dist/components/shared/IdDocumentField.client.js +204 -0
  147. package/dist/components/shared/IdDocumentField.d.ts +2 -0
  148. package/dist/components/shared/IdDocumentField.js +11 -0
  149. package/dist/components/shared/SelfieField.client.d.ts +20 -0
  150. package/dist/components/shared/SelfieField.client.js +327 -0
  151. package/dist/components/shared/SelfieField.d.ts +2 -0
  152. package/dist/components/shared/SelfieField.js +11 -0
  153. package/dist/constants/BranchCode.d.ts +4 -0
  154. package/dist/constants/BranchCode.js +42 -0
  155. package/dist/handlers/postTransformIdFrontImage.d.ts +3 -0
  156. package/dist/handlers/postTransformIdFrontImage.js +67 -0
  157. package/dist/handlers/postTransformSelfieImage.d.ts +3 -0
  158. package/dist/handlers/postTransformSelfieImage.js +71 -0
  159. package/dist/handlers.d.ts +43 -0
  160. package/dist/handlers.js +297 -0
  161. package/dist/icons/BellRingIcon.d.ts +2 -0
  162. package/dist/icons/BellRingIcon.js +4 -0
  163. package/dist/images/phone-icon.svg +10 -10
  164. package/dist/services/queries.js +3369 -3369
  165. package/dist/styles/theme.css +776 -776
  166. package/dist/ui/Checkbox/Checkbox.d.ts +23 -23
  167. package/dist/ui/Checkbox/checkbox.recipe.d.ts +3 -3
  168. package/dist/ui/Checkbox/checkbox.recipe.js +1 -1
  169. package/dist/utils/dataUrlToBlob.d.ts +1 -0
  170. package/dist/utils/dataUrlToBlob.js +11 -0
  171. package/dist/utils/gamesAvailable3pmTo3am.d.ts +1 -0
  172. package/dist/utils/gamesAvailable3pmTo3am.js +1 -0
  173. package/dist/utils/getGameName.d.ts +1 -0
  174. package/dist/utils/getGameName.js +6 -0
  175. package/dist/utils/isBetween3amAnd3pm.d.ts +1 -0
  176. package/dist/utils/isBetween3amAnd3pm.js +5 -0
  177. package/dist/utils/resizeImageSize.d.ts +2 -0
  178. package/dist/utils/resizeImageSize.js +11 -0
  179. package/package.json +179 -179
  180. package/dist/components/Banner/Banner.client.d.ts +0 -12
  181. package/dist/components/Banner/Banner.client.js +0 -49
  182. package/dist/components/PortalProvider/AndroidOnlyComponents.d.ts +0 -1
  183. package/dist/components/PortalProvider/AndroidOnlyComponents.js +0 -12
@@ -1,7 +1,7 @@
1
1
  export declare const QRPHDepositContext: (props: {
2
2
  value: {
3
3
  view: "form" | "qrCode";
4
- status: "waiting" | "failed" | "processing" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
4
+ status: "waiting" | "processing" | "failed" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
5
5
  verify: () => void;
6
6
  reset: () => void;
7
7
  deposit: import("../../../../types").Deposit | null;
@@ -14,7 +14,7 @@ export declare const QRPHDepositContext: (props: {
14
14
  children?: import("react").ReactNode | undefined;
15
15
  }) => React.ReactNode, useQRPHDepositContext: () => {
16
16
  view: "form" | "qrCode";
17
- status: "waiting" | "failed" | "processing" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
17
+ status: "waiting" | "processing" | "failed" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
18
18
  verify: () => void;
19
19
  reset: () => void;
20
20
  deposit: import("../../../../types").Deposit | null;
@@ -2,7 +2,7 @@ import type { Deposit } from '../../../../types';
2
2
  export type UseQRPHDepositReturn = ReturnType<typeof useQRPHDeposit>;
3
3
  export declare function useQRPHDeposit(): {
4
4
  view: "form" | "qrCode";
5
- status: "waiting" | "failed" | "processing" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
5
+ status: "waiting" | "processing" | "failed" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
6
6
  verify: () => void;
7
7
  reset: () => void;
8
8
  deposit: Deposit | null;
@@ -0,0 +1 @@
1
+ export declare function Confirmed(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { CheckCircleIcon } from '../../../../icons/CheckCircleIcon.js';
3
+ import { XIcon } from '../../../../icons/XIcon.js';
4
+ import { AlertDialog } from '../../../../ui/AlertDialog/index.js';
5
+ import { Button } from '../../../../ui/Button/index.js';
6
+ import { Portal } from '../../../../ui/Portal/index.js';
7
+ import { useQRPHDepositContext } from './QRPHDepositContext.js';
8
+ export function Confirmed() {
9
+ const context = useQRPHDepositContext();
10
+ return (_jsx(AlertDialog.Root, { open: context.status === 'confirmed', lazyMount: true, closeOnEscape: false, closeOnInteractOutside: false, children: _jsxs(Portal, { children: [_jsx(AlertDialog.Backdrop, { className: "!z-[calc(var(--z-dialog)+3)]" }), _jsx(AlertDialog.Positioner, { className: "!z-[calc(var(--z-dialog)+4)]", children: _jsxs(AlertDialog.Content, { children: [_jsx("button", { type: "button", className: "absolute top-4 right-4 icon:size-6 p-md text-text-quinary disabled:cursor-not-allowed disabled:opacity-50", onClick: context.reset, children: _jsx(XIcon, {}) }), _jsx("div", { className: "mx-auto flex size-12 items-center justify-center rounded-full bg-bg-success-secondary", children: _jsx(CheckCircleIcon, { className: "size-6 text-text-featured-icon-light-success" }) }), _jsx(AlertDialog.Title, { className: "mt-xl", children: "Your deposit was successful!" }), _jsx(AlertDialog.Description, { className: "mt-xl px-3", children: "The funds have been added to your account." }), _jsx(Button, { className: "mt-4xl w-full", onClick: context.reset, children: "Ok" })] }) })] }) }));
11
+ }
@@ -0,0 +1 @@
1
+ export declare function Failed(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AlertCircleIcon } from '../../../../icons/AlertCircleIcon.js';
3
+ import { XIcon } from '../../../../icons/XIcon.js';
4
+ import { AlertDialog } from '../../../../ui/AlertDialog/index.js';
5
+ import { Button } from '../../../../ui/Button/index.js';
6
+ import { Portal } from '../../../../ui/Portal/index.js';
7
+ import { useQRPHDepositContext } from './QRPHDepositContext.js';
8
+ export function Failed() {
9
+ const context = useQRPHDepositContext();
10
+ return (_jsx(AlertDialog.Root, { open: context.status === 'failed', lazyMount: true, closeOnEscape: false, closeOnInteractOutside: false, children: _jsxs(Portal, { children: [_jsx(AlertDialog.Backdrop, { className: "!z-[calc(var(--z-dialog)+3)]" }), _jsx(AlertDialog.Positioner, { className: "!z-[calc(var(--z-dialog)+4)]", children: _jsxs(AlertDialog.Content, { children: [_jsx("button", { type: "button", className: "absolute top-4 right-4 icon:size-6 p-md text-text-quinary disabled:cursor-not-allowed disabled:opacity-50", onClick: context.reset, children: _jsx(XIcon, {}) }), _jsx("div", { className: "mx-auto flex size-12 items-center justify-center rounded-full bg-bg-error-secondary", children: _jsx(AlertCircleIcon, { className: "size-6 text-text-featured-icon-light-error" }) }), _jsx(AlertDialog.Title, { className: "mt-xl", children: "Your deposit failed or was cancelled." }), _jsx(AlertDialog.Description, { className: "mt-xl px-3", children: "Your deposit was not completed or has been cancelled. You can try again by generating a\u00A0new\u00A0QR code." }), _jsx(Button, { className: "mt-4xl w-full", variant: "outline", onClick: context.regenerateQRCode, children: "Generate New QR Code" })] }) })] }) }));
11
+ }
@@ -0,0 +1 @@
1
+ export declare function Form(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,126 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { zodResolver } from '@hookform/resolvers/zod';
3
+ import Link from 'next/link';
4
+ import { useEffect } from 'react';
5
+ import { Controller, useForm } from 'react-hook-form';
6
+ import { useBoolean } from 'usehooks-ts';
7
+ import { z } from 'zod';
8
+ import { useShallow } from 'zustand/shallow';
9
+ import { useAvailablePromosQuery } from '../../../../client/hooks/useAvailablePromosQuery.js';
10
+ import { useDepositsCountQuery } from '../../../../client/hooks/useDepositsCountQuery.js';
11
+ import { useGlobalStore } from '../../../../client/hooks/useGlobalStore.js';
12
+ import { usePaymentSettingsQuery } from '../../../../client/hooks/usePaymentSettingsQuery.js';
13
+ import { QrCode02Icon } from '../../../../icons/QrCode02Icon.js';
14
+ import { XIcon } from '../../../../icons/XIcon.js';
15
+ import { AlertDialog } from '../../../../ui/AlertDialog/index.js';
16
+ import { Button } from '../../../../ui/Button/index.js';
17
+ import { Field } from '../../../../ui/Field/index.js';
18
+ import { Portal } from '../../../../ui/Portal/index.js';
19
+ import { parseDecimal } from '../../../../utils/parseDecimal.js';
20
+ import { AmountChoices } from '../../AmountChoices.js';
21
+ import { useDepositWithdrawalPropsContext } from '../../DepositWithdrawalContext.js';
22
+ import { AvailablePromos } from '../AvailablePromos.js';
23
+ import { useQRPHDepositContext } from './QRPHDepositContext.js';
24
+ export function Form() {
25
+ const depositWithdrawalProps = useDepositWithdrawalPropsContext();
26
+ const globalStore = useGlobalStore(useShallow((ctx) => ({
27
+ depositWithdrawal: ctx.depositWithdrawal,
28
+ })));
29
+ const context = useQRPHDepositContext();
30
+ const depositsCountQuery = useDepositsCountQuery();
31
+ const depositsCount = depositsCountQuery.data ?? 0;
32
+ const paymentSettingsQuery = usePaymentSettingsQuery();
33
+ const paymentSettings = paymentSettingsQuery.data;
34
+ const gatewaySettings = paymentSettings?.qrphDepositGatewaySettings;
35
+ const maximumAmount = parseDecimal(gatewaySettings?.maximumAmount, 0);
36
+ const minimumAmount = depositsCount <= 0
37
+ ? parseDecimal(paymentSettingsQuery.data?.minimumFirstDepositAmount, 0)
38
+ : parseDecimal(gatewaySettings?.minimumAmount, 0);
39
+ const promosQuery = useAvailablePromosQuery();
40
+ const promos = promosQuery.data ?? [];
41
+ const definition = z
42
+ .object({
43
+ amount: z.string().superRefine((val, ctx) => {
44
+ const n = parseDecimal(val, 0);
45
+ if (val.includes('.')) {
46
+ ctx.addIssue({
47
+ code: z.ZodIssueCode.custom,
48
+ message: 'Amount must be a whole number',
49
+ });
50
+ return;
51
+ }
52
+ if (n < minimumAmount) {
53
+ ctx.addIssue({
54
+ type: 'number',
55
+ code: z.ZodIssueCode.too_small,
56
+ inclusive: true,
57
+ minimum: minimumAmount,
58
+ message: `Minimum amount is ${minimumAmount.toLocaleString()}`,
59
+ });
60
+ }
61
+ if (n > maximumAmount) {
62
+ ctx.addIssue({
63
+ type: 'number',
64
+ code: z.ZodIssueCode.too_big,
65
+ inclusive: true,
66
+ maximum: maximumAmount,
67
+ message: `Maximum amount is ${maximumAmount.toLocaleString()}`,
68
+ });
69
+ }
70
+ }),
71
+ promo: z.string().optional().nullable(),
72
+ })
73
+ .superRefine((value, ctx) => {
74
+ const promo = promos.find((o) => o.id === value.promo);
75
+ const promoMinAmount = parseDecimal(promo?.minimumDepositAmount, 0);
76
+ const promoMaxAmount = parseDecimal(promo?.maximumDepositAmount, 0);
77
+ const amount = parseDecimal(value.amount, 0);
78
+ if (promo && amount < promoMinAmount) {
79
+ ctx.addIssue({
80
+ path: ['amount'],
81
+ code: z.ZodIssueCode.custom,
82
+ message: `Minimum amount for this promo is ${promoMinAmount.toLocaleString()}`,
83
+ });
84
+ }
85
+ if (promo && amount > promoMaxAmount) {
86
+ ctx.addIssue({
87
+ path: ['amount'],
88
+ code: z.ZodIssueCode.custom,
89
+ message: `Maximum amount for this promo is ${promoMaxAmount}`,
90
+ });
91
+ }
92
+ });
93
+ const form = useForm({
94
+ mode: 'all',
95
+ resolver: zodResolver(definition),
96
+ defaultValues: {
97
+ amount: '0',
98
+ promo: globalStore.depositWithdrawal.promo ?? null,
99
+ },
100
+ });
101
+ useEffect(() => {
102
+ if (minimumAmount) {
103
+ form.reset({
104
+ amount: minimumAmount.toString(),
105
+ promo: form.getValues('promo') ?? null,
106
+ });
107
+ }
108
+ }, [form, minimumAmount]);
109
+ const confirm = useBoolean();
110
+ return (_jsxs("form", { onSubmit: (e) => {
111
+ e.preventDefault();
112
+ confirm.setTrue();
113
+ }, noValidate: true, children: [_jsxs(Field.Root, { invalid: !!form.formState.errors.amount, className: "mt-3xl", children: [_jsx(Field.Label, { children: "Enter the amount you want to deposit" }), _jsx(Field.Input, { type: "number", ...form.register('amount') }), _jsx(Field.ErrorText, { children: form.formState.errors.amount?.message })] }), _jsx(AmountChoices, { value: parseDecimal(form.watch('amount'), 0), onChange: (value) => {
114
+ form.setValue('amount', value.toString(), {
115
+ shouldTouch: true,
116
+ shouldDirty: true,
117
+ shouldValidate: true,
118
+ });
119
+ }, min: minimumAmount, max: maximumAmount, className: "mt-lg" }), _jsx(Controller, { control: form.control, name: "promo", render: (o) => (_jsx(AvailablePromos, { value: o.field.value, onChange: (value) => {
120
+ o.field.onChange(value);
121
+ globalStore.depositWithdrawal.setPromo(null);
122
+ }, className: "mt-3xl" })) }), _jsx(Button, { type: "submit", className: "mt-3xl", children: "Deposit" }), depositWithdrawalProps.hasPrivacyPolicyAndTermsOfUse && (_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: confirm.value, lazyMount: true, closeOnEscape: false, closeOnInteractOutside: false, 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.CloseTrigger, { children: _jsx(XIcon, {}) }), _jsx("div", { className: "mx-auto flex size-12 items-center justify-center rounded-full bg-bg-brand-secondary", children: _jsx(QrCode02Icon, { className: "size-6 text-text-featured-icon-light-brand" }) }), _jsx(AlertDialog.Title, { className: "mt-xl", children: "Generate Single Use QR Code" }), _jsx(AlertDialog.Description, { className: "mt-xs px-2", children: "To proceed with your QRPH deposit, please generate a QR code first." }), _jsx(Button, { className: "mt-4xl", variant: "outline", colorScheme: "gray", onClick: form.handleSubmit(async (data) => {
123
+ confirm.setFalse();
124
+ await context.generateQRCode(data);
125
+ }), children: "Generate QR code" })] }) })] }) })] }));
126
+ }
@@ -0,0 +1 @@
1
+ export declare function GeneratingQrCode(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Spinner02Icon } from '../../../../icons/Spinner02Icon.js';
3
+ import { XIcon } from '../../../../icons/XIcon.js';
4
+ import { AlertDialog } from '../../../../ui/AlertDialog/index.js';
5
+ import { Portal } from '../../../../ui/Portal/index.js';
6
+ import { useQRPHDepositContext } from './QRPHDepositContext.js';
7
+ export function GeneratingQrCode() {
8
+ const context = useQRPHDepositContext();
9
+ return (_jsx(AlertDialog.Root, { open: context.status === 'generating-qr-code', lazyMount: true, closeOnEscape: false, closeOnInteractOutside: false, 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.CloseTrigger, { disabled: true, children: _jsx(XIcon, {}) }), _jsx(Spinner02Icon, { className: "mx-auto size-12 text-text-featured-icon-light-brand" }), _jsx(AlertDialog.Title, { className: "mt-xl", children: "Generating Single Use QR Code" }), _jsxs(AlertDialog.Description, { className: "mt-xs px-3", children: [_jsx("span", { className: "block", children: "Please hold tight as we verify the account details and amount. Once verified, a QRPH code will be displayed for you to scan and complete the transaction." }), _jsxs("span", { className: "mt-3 block", children: ["Please wait ", _jsx("span", { className: "font-bold", children: "60" }), " seconds..."] })] })] }) })] }) }));
10
+ }
@@ -0,0 +1 @@
1
+ export declare function QRPHDeposit(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Confirmed } from './Confirmed.js';
3
+ import { Failed } from './Failed.js';
4
+ import { Form } from './Form.js';
5
+ import { GeneratingQrCode } from './GeneratingQrCode.js';
6
+ import { QRPHDepositContext } from './QRPHDepositContext.js';
7
+ import { QrCodeGenerated } from './QrCodeGenerated.js';
8
+ import { useQRPHDeposit } from './useQRPHDeposit.js';
9
+ export function QRPHDeposit() {
10
+ const context = useQRPHDeposit();
11
+ return (_jsxs(QRPHDepositContext, { value: context, children: [_jsx(Form, {}), _jsx(GeneratingQrCode, {}), _jsx(QrCodeGenerated, {}), _jsx(Failed, {}), _jsx(Confirmed, {})] }));
12
+ }
@@ -0,0 +1,17 @@
1
+ export declare const QRPHDepositContext: (props: {
2
+ value: {
3
+ status: "idle" | "confirmed" | "failed" | "generating-qr-code" | "qr-code-generated";
4
+ deposit: import("../../../../types").Deposit | null;
5
+ generateQRCode: (input: import("./useQRPHDeposit").GenerateQRCodeInput) => Promise<void>;
6
+ regenerateQRCode: () => Promise<void>;
7
+ reset: () => void;
8
+ };
9
+ } & {
10
+ children?: import("react").ReactNode | undefined;
11
+ }) => React.ReactNode, useQRPHDepositContext: () => {
12
+ status: "idle" | "confirmed" | "failed" | "generating-qr-code" | "qr-code-generated";
13
+ deposit: import("../../../../types").Deposit | null;
14
+ generateQRCode: (input: import("./useQRPHDeposit").GenerateQRCodeInput) => Promise<void>;
15
+ regenerateQRCode: () => Promise<void>;
16
+ reset: () => void;
17
+ };
@@ -0,0 +1,2 @@
1
+ import { createContext } from '../../../../client/utils/createContext.js';
2
+ export const [QRPHDepositContext, useQRPHDepositContext] = createContext();
@@ -0,0 +1 @@
1
+ export declare function QrCodeGenerated(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import Image from 'next/image';
3
+ import { useBoolean } from 'usehooks-ts';
4
+ import { AlertCircleIcon } from '../../../../icons/AlertCircleIcon.js';
5
+ import { ArrowCircleDownIcon } from '../../../../icons/ArrowCircleDownIcon.js';
6
+ import { QrCode02Icon } from '../../../../icons/QrCode02Icon.js';
7
+ import { XIcon } from '../../../../icons/XIcon.js';
8
+ import qrphIcon from '../../../../images/qrph-icon.png';
9
+ import { AlertDialog } from '../../../../ui/AlertDialog/index.js';
10
+ import { Button } from '../../../../ui/Button/index.js';
11
+ import { Portal } from '../../../../ui/Portal/index.js';
12
+ import { QrCode } from '../../../../ui/QrCode/index.js';
13
+ import { useQRPHDepositContext } from './QRPHDepositContext.js';
14
+ export function QrCodeGenerated() {
15
+ const context = useQRPHDepositContext();
16
+ const confirm = useBoolean(false);
17
+ return (_jsx(AlertDialog.Root, { open: context.status === 'qr-code-generated', lazyMount: true, closeOnEscape: false, closeOnInteractOutside: false, 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("button", { type: "button", className: "absolute top-4 right-4 icon:size-6 p-md text-text-quinary disabled:cursor-not-allowed disabled:opacity-50", onClick: () => {
18
+ if (!confirm.value) {
19
+ confirm.setTrue();
20
+ return;
21
+ }
22
+ confirm.setFalse();
23
+ }, children: _jsx(XIcon, {}) }), !confirm.value ? (_jsx("div", { className: "mx-auto flex size-12 items-center justify-center rounded-full bg-bg-brand-secondary", children: _jsx(QrCode02Icon, { className: "size-6 text-text-featured-icon-light-brand" }) })) : (_jsx("div", { className: "mx-auto flex size-12 items-center justify-center rounded-full bg-bg-error-secondary", children: _jsx(AlertCircleIcon, { className: "size-6 text-text-featured-icon-light-error" }) })), _jsx(AlertDialog.Title, { className: "mt-xl", dangerouslySetInnerHTML: {
24
+ __html: confirm.value
25
+ ? 'Are you sure you want to close this&nbsp;window?'
26
+ : 'Single Use QR Code',
27
+ } }), _jsx(AlertDialog.Description, { className: "mt-xs px-3", children: confirm.value
28
+ ? 'Closing this window will cancel your current deposit. Do you want to continue?'
29
+ : 'Scan the QR code below with your banking app, or upload it to complete your deposit.' }), !confirm.value && (_jsx("div", { className: "mx-auto mt-xl w-[14.125rem] rounded-xl bg-bg-primary-alt p-6", children: _jsxs(QrCode.Root, { value: context.deposit?.qrCode ?? '', encoding: {
30
+ ecc: 'H',
31
+ boostEcc: true,
32
+ }, children: [_jsxs("div", { className: "relative", children: [_jsx(QrCode.Frame, { className: "mx-auto size-[10rem] rounded-[0.25rem] border border-border-primary bg-white", children: _jsx(QrCode.Pattern, {}) }), _jsx(QrCode.Overlay, { className: "bg-white p-0.5", children: _jsx(Image, { src: qrphIcon, alt: "", className: "size-8", width: 40, height: 40 }) })] }), _jsxs(QrCode.DownloadTrigger, { type: "button", fileName: `QRPH-${Date.now()}.jpg`, mimeType: "image/jpeg", className: "mx-auto mt-5 flex w-fit items-center gap-1 font-semibold text-button-tertiary-fg", children: [_jsx(ArrowCircleDownIcon, { className: "size-5" }), "Download QR Code"] })] }) })), confirm.value && (_jsxs("div", { className: "mt-4xl flex gap-lg", children: [_jsx(Button, { variant: "outline", onClick: confirm.setFalse, children: "Go back" }), _jsx(Button, { onClick: () => {
33
+ context.reset();
34
+ setTimeout(() => {
35
+ confirm.setFalse();
36
+ }, 2);
37
+ }, children: "Continue" })] })), !confirm.value && _jsx(Instruction, {})] }) })] }) }));
38
+ }
39
+ function Instruction() {
40
+ return (_jsxs(AlertDialog.Root, { lazyMount: true, closeOnEscape: false, closeOnInteractOutside: false, children: [_jsxs("p", { className: "mt-lg text-center text-text-tertiary-600 text-xs", children: ["Need help using the QR Code?", ' ', _jsx(AlertDialog.Trigger, { className: "text-text-brand", children: "See instructions" })] }), _jsxs(Portal, { children: [_jsx(AlertDialog.Backdrop, { className: "!z-[calc(var(--z-dialog)+3)]" }), _jsx(AlertDialog.Positioner, { className: "!z-[calc(var(--z-dialog)+4)]", children: _jsxs(AlertDialog.Content, { children: [_jsx(AlertDialog.CloseTrigger, { children: _jsx(XIcon, {}) }), _jsx("div", { className: "mx-auto flex size-12 items-center justify-center rounded-full bg-bg-brand-secondary", children: _jsx(QrCode02Icon, { className: "size-6 text-text-featured-icon-light-brand" }) }), _jsx(AlertDialog.Title, { className: "mt-xl", children: "How to Use the QR Code for Payment" }), _jsx(AlertDialog.Description, { className: "mt-xl px-3", children: "Follow these simple steps to complete your\u00A0transaction:" }), _jsx("div", { className: "mt-4 text-sm text-text-tertiary-600", children: _jsxs("ol", { className: "list-decimal pl-4", children: [_jsx("li", { className: "marker:font-mono marker:text-sm", children: "Open your preferred banking or EMI mobile app and select 'Transfer Money' or 'Pay via QR.'" }), _jsx("li", { className: "marker:font-mono marker:text-sm", children: "Scan or upload the generated QR Ph code. If prompted by the app, enter the amount to be sent." }), _jsx("li", { className: "marker:font-mono marker:text-sm", children: "Proceed with the transfer or payment." })] }) })] }) })] })] }));
41
+ }
@@ -0,0 +1,13 @@
1
+ import type { Deposit } from '../../../../types';
2
+ export type UseQRPHDepositReturn = ReturnType<typeof useQRPHDeposit>;
3
+ export interface GenerateQRCodeInput {
4
+ amount: string;
5
+ promo?: string | null;
6
+ }
7
+ export declare function useQRPHDeposit(): {
8
+ status: "idle" | "confirmed" | "failed" | "generating-qr-code" | "qr-code-generated";
9
+ deposit: Deposit | null;
10
+ generateQRCode: (input: GenerateQRCodeInput) => Promise<void>;
11
+ regenerateQRCode: () => Promise<void>;
12
+ reset: () => void;
13
+ };
@@ -0,0 +1,91 @@
1
+ import { useEffect, useRef, useState } from 'react';
2
+ import invariant from 'tiny-invariant';
3
+ import { useShallow } from 'zustand/shallow';
4
+ import { useCreateQRPHDepositMutation } from '../../../../client/hooks/useCreateQRPHDepositMutation.js';
5
+ import { useDepositQuery } from '../../../../client/hooks/useDepositQuery.js';
6
+ import { useGlobalStore } from '../../../../client/hooks/useGlobalStore.js';
7
+ import { useMemberVerificationQuery } from '../../../../client/hooks/useMemberVerificationQuery.js';
8
+ export function useQRPHDeposit() {
9
+ const globalStore = useGlobalStore(useShallow((ctx) => ({
10
+ kycVerificationStatus: ctx.kycVerificationStatus,
11
+ })));
12
+ const inputRef = useRef(null);
13
+ const [deposit, setDeposit] = useState(null);
14
+ const [status, setStatus] = useState('idle');
15
+ const verificationQuery = useMemberVerificationQuery();
16
+ const verificationStatus = verificationQuery.data?.status ?? 'UNVERIFIED';
17
+ const mutation = useCreateQRPHDepositMutation({
18
+ onMutate() {
19
+ setStatus('generating-qr-code');
20
+ },
21
+ onSuccess(data) {
22
+ invariant(data.qrCode);
23
+ setStatus('qr-code-generated');
24
+ setDeposit(data);
25
+ },
26
+ onError() {
27
+ setStatus('failed');
28
+ },
29
+ });
30
+ const query = useDepositQuery(deposit?.id, {
31
+ enabled: !!deposit && status === 'qr-code-generated',
32
+ refetchInterval: (ctx) => {
33
+ if (ctx.state.data?.status === 'APPROVED' ||
34
+ ctx.state.data?.status === 'CONFIRMED' ||
35
+ ctx.state.data?.status === 'CANCELLED' ||
36
+ ctx.state.data?.status === 'REJECTED' ||
37
+ ctx.state.data?.status === 'FAILED') {
38
+ return false;
39
+ }
40
+ return 2000;
41
+ },
42
+ });
43
+ useEffect(() => {
44
+ if (query.data?.status === 'APPROVED' ||
45
+ query.data?.status === 'CONFIRMED') {
46
+ setStatus('confirmed');
47
+ return;
48
+ }
49
+ if (query.data?.status === 'CANCELLED' ||
50
+ query.data?.status === 'REJECTED' ||
51
+ query.data?.status === 'FAILED') {
52
+ setStatus('failed');
53
+ return;
54
+ }
55
+ }, [query.data?.status]);
56
+ const generateQRCode = async (input) => {
57
+ if (verificationStatus === 'PENDING' ||
58
+ verificationStatus === 'UNVERIFIED' ||
59
+ verificationStatus === 'REJECTED' ||
60
+ verificationStatus === 'CREATED') {
61
+ globalStore.kycVerificationStatus.setOpen(true);
62
+ return;
63
+ }
64
+ inputRef.current = input;
65
+ mutation.mutate({
66
+ amount: input.amount,
67
+ promo: input.promo ?? undefined,
68
+ });
69
+ };
70
+ const regenerateQRCode = async () => {
71
+ invariant(inputRef.current);
72
+ mutation.reset();
73
+ await new Promise((resolve) => setTimeout(resolve, 1));
74
+ mutation.mutate({
75
+ amount: inputRef.current.amount,
76
+ promo: inputRef.current.promo ?? undefined,
77
+ });
78
+ };
79
+ const reset = () => {
80
+ setStatus('idle');
81
+ setDeposit(null);
82
+ inputRef.current = null;
83
+ };
84
+ return {
85
+ status,
86
+ deposit,
87
+ generateQRCode,
88
+ regenerateQRCode,
89
+ reset,
90
+ };
91
+ }
@@ -1,7 +1,7 @@
1
1
  export declare const OnlineBankDepositContext: (props: {
2
2
  value: {
3
3
  view: "form" | "vca";
4
- status: "waiting" | "failed" | "processing" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
4
+ status: "waiting" | "processing" | "failed" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
5
5
  verify: () => void;
6
6
  reset: () => void;
7
7
  deposit: import("../../../../types").Deposit | null;
@@ -14,7 +14,7 @@ export declare const OnlineBankDepositContext: (props: {
14
14
  children?: import("react").ReactNode | undefined;
15
15
  }) => React.ReactNode, useOnlineBankDepositContext: () => {
16
16
  view: "form" | "vca";
17
- status: "waiting" | "failed" | "processing" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
17
+ status: "waiting" | "processing" | "failed" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
18
18
  verify: () => void;
19
19
  reset: () => void;
20
20
  deposit: import("../../../../types").Deposit | null;
@@ -2,7 +2,7 @@ import type { Deposit } from '../../../../types';
2
2
  export type UseOnlineBankDepositReturn = ReturnType<typeof useOnlineBankDeposit>;
3
3
  export declare function useOnlineBankDeposit(): {
4
4
  view: "form" | "vca";
5
- status: "waiting" | "failed" | "processing" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
5
+ status: "waiting" | "processing" | "failed" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
6
6
  verify: () => void;
7
7
  reset: () => void;
8
8
  deposit: Deposit | null;
@@ -1,7 +1,7 @@
1
1
  export declare const QRPHDepositContext: (props: {
2
2
  value: {
3
3
  view: "form" | "qrCode";
4
- status: "waiting" | "failed" | "processing" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
4
+ status: "waiting" | "processing" | "failed" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
5
5
  verify: () => void;
6
6
  reset: () => void;
7
7
  deposit: import("../../../../types").Deposit | null;
@@ -14,7 +14,7 @@ export declare const QRPHDepositContext: (props: {
14
14
  children?: import("react").ReactNode | undefined;
15
15
  }) => React.ReactNode, useQRPHDepositContext: () => {
16
16
  view: "form" | "qrCode";
17
- status: "waiting" | "failed" | "processing" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
17
+ status: "waiting" | "processing" | "failed" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
18
18
  verify: () => void;
19
19
  reset: () => void;
20
20
  deposit: import("../../../../types").Deposit | null;
@@ -2,7 +2,7 @@ import type { Deposit } from '../../../../types';
2
2
  export type UseQRPHDepositReturn = ReturnType<typeof useQRPHDeposit>;
3
3
  export declare function useQRPHDeposit(): {
4
4
  view: "form" | "qrCode";
5
- status: "waiting" | "failed" | "processing" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
5
+ status: "waiting" | "processing" | "failed" | "verification-waiting" | "verification-processing" | "verification-failed" | "verification-success";
6
6
  verify: () => void;
7
7
  reset: () => void;
8
8
  deposit: Deposit | null;
@@ -1,5 +1,5 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  export function Loading() {
4
- return (_jsx("div", { className: "flex h-[calc(100vh-400px)] w-full items-center justify-center px-4", children: _jsxs("div", { className: "flex flex-col items-center space-y-4", children: [_jsx("div", { className: "h-10 w-10 animate-spin rounded-full border-4 border-blue-500 border-t-transparent" }), _jsx("p", { className: "font-medium text-gray-700 text-lg", children: "Loading Sports Book\u2026" })] }) }));
4
+ return (_jsx("div", { className: "flex h-[calc(100vh-400px)] w-full items-center justify-center px-4", children: _jsxs("div", { className: "flex flex-col items-center space-y-4", children: [_jsx("div", { className: "border-blue-500 h-10 w-10 animate-spin rounded-full border-4 border-t-transparent" }), _jsx("p", { className: "text-gray-700 text-lg font-medium", children: "Loading Sports Book\u2026" })] }) }));
5
5
  }
@@ -11,7 +11,6 @@ import { useSignOutMutation } from '../../client/hooks/useSignOutMutation.js';
11
11
  import { getSession } from '../../client/services/getSession.js';
12
12
  import { BIOMETRIC_STORAGE_KEY } from '../../client/utils/biometric.js';
13
13
  import { AlertCircleIcon } from '../../icons/AlertCircleIcon.js';
14
- import { AlertTriangleFillIcon } from '../../icons/AlertTriangleFillIcon.js';
15
14
  import { CheckIcon } from '../../icons/CheckIcon.js';
16
15
  import pagcorLogo from '../../images/pagcor2.png';
17
16
  import responsibleGamingLogo from '../../images/responsible-gaming.png';
@@ -52,20 +51,16 @@ export function DisclaimerV2(props) {
52
51
  sessionStorage.clear();
53
52
  },
54
53
  });
55
- return (_jsx(Dialog.Root, { open: disclaimer.open, lazyMount: true, unmountOnExit: true, closeOnEscape: false, closeOnInteractOutside: false, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, {}), _jsx(Dialog.Positioner, { children: _jsxs(Dialog.Content, { className: twMerge('flex h-full scrollbar:h-2 scrollbar:w-2 w-full flex-col items-start gap-y-4 overflow-y-auto scrollbar-thumb:rounded-full scrollbar-thumb:bg-bg-quaternary scrollbar-track:bg-transparent pt-3xl lg:mx-auto lg:h-auto lg:max-h-[85vh] lg:w-[500px] lg:rounded-xl', classNames.root), "aria-label": `${props.siteName} Player Disclaimer`, "aria-describedby": "disclaimer-description", children: [_jsx(Image, { src: props.logo, alt: `${props.siteName} logo`, width: 200, height: 100, className: "mx-auto h-auto w-[120px]", draggable: false }), _jsxs("div", { className: "flex w-full items-center justify-center gap-3xl", children: [_jsx(Image, { src: props.pagcorLogo ?? pagcorLogo, alt: "PAGCOR logo", height: 43, width: 88, className: "h-[43px] w-auto shrink-0", draggable: false, unoptimized: true }), _jsx(Image, { src: props.responsibleGamingLogo ?? responsibleGamingLogo, alt: "Responsible Gaming logo", height: 50, width: 186, className: "h-[50px] w-auto shrink-0", draggable: false, unoptimized: true })] }), _jsx("div", { className: "px-3xl text-sm", children: "The following individuals are prohibited from registering or participating in this online gaming platform." }), _jsx("div", { className: "w-full grow px-3xl", children: _jsxs(Dialog.Description, { className: "space-y-2 text-sm", id: "disclaimer-description", children: [_jsxs("ul", { className: "space-y-1.5 text-left", "aria-label": "Restricted persons list", children: [_jsxs("li", { className: "flex gap-4", children: [_jsx(Circle, {}), "Persons below the legal gambling age of 21."] }), _jsxs("li", { className: "flex gap-4", children: [_jsx(Circle, {}), "Any government official or employee directly involved in the operations of the government or its agencies."] }), _jsxs("li", { className: "flex gap-4", children: [_jsx(Circle, {}), "Member of the Armed Forces of the Philippines, including the Army, Navy, Air Force and the Philippine National Police."] }), _jsxs("li", { className: "flex gap-4", children: [_jsx(Circle, {}), "Individuals listed in PAGCOR's National Database of Restricted Persons (NDRP)"] }), _jsxs("li", { className: "flex gap-4", children: [_jsx(Circle, {}), "Holders of a valid Gaming Employment License (GEL)"] })] }), _jsxs(Checkbox.Root, { checked: checked, onCheckedChange: (e) => {
54
+ return (_jsx(Dialog.Root, { open: disclaimer.open, lazyMount: true, unmountOnExit: true, closeOnEscape: false, closeOnInteractOutside: false, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, {}), _jsx(Dialog.Positioner, { children: _jsxs(Dialog.Content, { className: twMerge('flex h-full scrollbar:h-2 scrollbar:w-2 w-full flex-col items-start gap-y-4 overflow-y-auto scrollbar-thumb:rounded-full scrollbar-thumb:bg-bg-quaternary scrollbar-track:bg-transparent pt-3xl lg:mx-auto lg:h-auto lg:max-h-[85vh] lg:w-[500px] lg:rounded-xl', classNames.root), "aria-label": `${props.siteName} Player Disclaimer`, "aria-describedby": "disclaimer-description", children: [_jsx(Image, { src: props.logo, alt: `${props.siteName} logo`, width: 200, height: 100, className: "mx-auto h-auto w-[120px]", draggable: false }), _jsxs("div", { className: "flex w-full items-center justify-center gap-3xl", children: [_jsx(Image, { src: props.pagcorLogo ?? pagcorLogo, alt: "PAGCOR logo", height: 43, width: 88, className: "h-[43px] w-auto shrink-0", draggable: false, unoptimized: true }), _jsx(Image, { src: props.responsibleGamingLogo ?? responsibleGamingLogo, alt: "Responsible Gaming logo", height: 50, width: 186, className: "h-[50px] w-auto shrink-0", draggable: false, unoptimized: true })] }), _jsx("div", { className: "px-3xl text-sm", children: "The following individuals are prohibited from registering or participating in this online gaming platform." }), _jsx("div", { className: "w-full grow px-3xl", children: _jsxs(Dialog.Description, { className: "space-y-2 text-sm", id: "disclaimer-description", children: [_jsxs("ul", { className: "space-y-1.5 text-left", "aria-label": "Restricted persons list", children: [_jsxs("li", { className: "flex gap-4", children: [_jsx(Circle, {}), "Government Official or employee connected directly with the operation of the Government or any of its agencies."] }), _jsxs("li", { className: "flex gap-4", children: [_jsx(Circle, {}), "Member of the Armed Forces of the Philippines, including the Army, Navy, Air Force, or the Philippine National Police."] }), _jsxs("li", { className: "flex gap-4", children: [_jsx(Circle, {}), "Persons under 21 years of age."] }), _jsxs("li", { className: "flex gap-4", children: [_jsx(Circle, {}), "Persons included in the PAGCOR's National Database of Restricted Persons (NDRP)."] }), _jsxs("li", { className: "flex gap-4", children: [_jsx(Circle, {}), "Accounts that do not complete the full KYC process within the 72-hour period will be subject to permanent suspension and forfeiture of any funds in the account."] }), _jsxs("li", { className: "flex gap-4", children: [_jsx(Circle, {}), "Funds or credits in the account of a player who is found ineligible to play shall mean forfeiture of said funds/credit in favor of the Government."] }), _jsxs("li", { className: "flex gap-4", children: [_jsx(Circle, {}), "You are prohibited from playing in open and public places."] })] }), _jsxs(Checkbox.Root, { checked: checked, onCheckedChange: (e) => {
56
55
  if (e.checked === 'indeterminate')
57
56
  return;
58
57
  globalStore.termsOfUse.setAccepted(e.checked);
59
58
  globalStore.responsibleGaming.setAccepted(e.checked);
60
- }, className: "pt-2.5 pb-2", children: [_jsx(Checkbox.Control, { children: _jsx(Checkbox.Indicator, { asChild: true, children: _jsx(CheckIcon, {}) }) }), _jsxs(Checkbox.Label, { children: ["I have read and agreed to", ' ', _jsx("button", { type: "button", className: "text-brand-400 underline underline-offset-2", onClick: () => {
59
+ }, className: "pt-2.5 pb-2", colorScheme: "neutral", 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, I accept the", ' ', _jsx("button", { type: "button", className: "text-brand-400 underline underline-offset-2", onClick: () => {
61
60
  globalStore.termsOfUse.setOpen(true);
62
61
  globalStore.termsOfUse.setNext('DISCLAIMER');
63
62
  disclaimer.close();
64
- }, children: "Terms of Use" }), ' ', "and", ' ', _jsx("button", { type: "button", className: "text-brand-400 underline underline-offset-2", onClick: () => {
65
- globalStore.responsibleGaming.setOpen(true);
66
- globalStore.responsibleGaming.setNext('DISCLAIMER');
67
- disclaimer.close();
68
- }, children: "Responsible Gaming" })] }), _jsx(Checkbox.HiddenInput, {})] }), showWarning && (_jsxs("div", { className: twMerge('mt-2 flex max-w-full items-center gap-2 break-words rounded-md text-text-error-primary text-xs'), role: "alert", "aria-live": "assertive", children: [_jsx(AlertCircleIcon, { className: "size-5 text-text-error-primary" }), "Please agree to ", props.siteName, "'s Terms of Use and Responsible Gaming to proceed."] })), _jsx("div", { children: "Funds or credits in the account of any individual found ineligible to participate will be forfeited and turned over to the government as required by law" }), _jsxs("div", { children: [_jsxs("div", { className: "mx-auto mb-3 flex items-center justify-center gap-2 font-semibold text-[22px] text-brand-400", children: [_jsx(AlertTriangleFillIcon, { className: "size-6 shrink-0 text-brand-400", "aria-hidden": "true" }), _jsx("span", { children: "PLAY RESPONSIBLY" })] }), _jsxs("div", { className: twMerge('mb-5 flex w-full flex-col items-center rounded-xl bg-bg-secondary p-3', classNames.playResponsiblyDescriptionContainer), children: [_jsx("div", { className: "mb-4 text-center text-sm", children: "Gambling may be fun, but it's easy to fall into addiction if you don't limit yourself." }), _jsx("div", { className: "text-center text-sm", children: "Be a responsible player. Know your limits and recognize when to step back." })] })] }), _jsxs("div", { children: ["Self Exclusion Site:", _jsxs("a", { href: "https://osea.pagcor.ph/", target: "_blank", rel: "noopener noreferrer", className: "break-all text-brand-400", children: [' ', "osea.pagcor.ph"] })] }), _jsxs("div", { children: [_jsx("div", { children: "Visit PAGCOR\u2019s Responsible Gaming Program to know more:" }), _jsxs("a", { href: "https://www.pagcor.ph/regulatory/responsible-gaming.php", target: "_blank", rel: "noopener noreferrer", className: "break-all text-brand-400", children: [' ', "pagcor.ph/regulatory/responsible-gaming.php"] })] })] }) }), _jsxs("div", { className: twMerge('mt-2 flex w-full gap-3 border-bg-secondary border-t px-3xl py-3xl', classNames.buttonsContainer), children: [_jsx(Button, { type: "button", onClick: async () => {
63
+ }, children: "Terms of Use" }), ' ', "and I am not playing in open or public place."] }), _jsx(Checkbox.HiddenInput, {})] }), showWarning && (_jsxs("div", { className: twMerge('mt-2 flex max-w-full items-center gap-2 break-words rounded-md text-text-error-primary text-xs'), role: "alert", "aria-live": "assertive", children: [_jsx(AlertCircleIcon, { className: "size-5 text-text-error-primary" }), "Please agree to ", props.siteName, "'s Terms of Use and Responsible Gaming to proceed."] })), _jsx("div", { children: "Funds or credits in the account of any individual found ineligible to participate will be forfeited and turned over to the government as required by law" }), _jsxs("div", { className: "text-text-secondary-700", children: ["Self Exclusion Site:", _jsxs("a", { href: "https://osea.pagcor.ph/", target: "_blank", rel: "noopener noreferrer", className: "break-all text-brand-400", children: [' ', "osea.pagcor.ph"] })] }), _jsxs("div", { children: [_jsx("div", { className: "text-text-secondary-700", children: "Visit PAGCOR\u2019s Responsible Gaming Program to know more:" }), _jsxs("a", { href: "https://www.pagcor.ph/regulatory/responsible-gaming.php", target: "_blank", rel: "noopener noreferrer", className: "break-all text-brand-400", children: [' ', "pagcor.ph/regulatory/responsible-gaming.php"] })] })] }) }), _jsxs("div", { className: twMerge('mt-2 flex w-full gap-3 border-bg-secondary border-t px-3xl py-3xl', classNames.buttonsContainer), children: [_jsx(Button, { type: "button", onClick: async () => {
69
64
  if (Capacitor.isNativePlatform()) {
70
65
  const session = await getQueryClient().fetchQuery({
71
66
  queryKey: getSessionQueryKey(),
@@ -97,4 +92,4 @@ export function DisclaimerV2(props) {
97
92
  disclaimer.close();
98
93
  }, children: "I Accept" })] })] }) })] }) }));
99
94
  }
100
- const Circle = () => (_jsx("div", { children: _jsx("div", { className: "flex h-4.5 w-4.5 items-center justify-center rounded-full border border-brand-400", children: _jsx("div", { className: "h-3 w-3 rounded-full bg-brand-400" }) }) }));
95
+ const Circle = () => (_jsx("div", { children: _jsx("div", { className: "flex h-4.5 w-4.5 items-center justify-center rounded-full border-[5px] border-brand-400", children: _jsx("div", { className: "h-2 w-2 rounded-full bg-bg-disabled" }) }) }));
@@ -0,0 +1,10 @@
1
+ import { type ImageProps } from 'next/image';
2
+ import type { ReactNode } from 'react';
3
+ export interface ResponsibleGamingProps {
4
+ responsibleGamingContent: string | ReactNode;
5
+ logo: ImageProps['src'];
6
+ open: boolean;
7
+ onCloseAction: () => void;
8
+ responsibleGamingLogo?: ImageProps['src'];
9
+ }
10
+ export declare function ResponsibleGaming({ logo, open, responsibleGamingContent, onCloseAction, ...props }: ResponsibleGamingProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,13 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import Image, {} from 'next/image';
4
+ import pagcorLogo from '../../images/pagcor.png';
5
+ import responsibleGamingLogo from '../../images/responsible-gaming.png';
6
+ import { Button } from '../../ui/Button/index.js';
7
+ import { Dialog } from '../../ui/Dialog/index.js';
8
+ import { Portal } from '../../ui/Portal/index.js';
9
+ export function ResponsibleGaming({ logo, open, responsibleGamingContent, onCloseAction, ...props }) {
10
+ return (_jsx(Dialog.Root, { open: open, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, { className: "z-popover" }), _jsx(Dialog.Positioner, { className: "z-popover", children: _jsxs(Dialog.Content, { className: "flex h-full w-full flex-col items-start overflow-y-auto p-3xl lg:mx-auto lg:h-auto lg:w-[400px] lg:rounded-xl", children: [_jsx(Image, { src: logo, alt: "", width: 200, height: 100, className: "mx-auto h-auto w-[120px]", draggable: false }), _jsxs("div", { className: "w-full grow", children: [_jsx(Dialog.Title, { className: "text-brand-400 mt-3xl text-center text-lg font-semibold", children: "Responsible Gaming" }), _jsx(Dialog.Description, { className: "leading-2xl mt-xs text-sm", children: responsibleGamingContent }), _jsxs("div", { className: "mt-5 flex items-center justify-center gap-3xl", children: [_jsx(Image, { src: pagcorLogo, alt: "", height: 75, width: 88, className: "h-[88px] w-auto shrink-0", draggable: false }), _jsx(Image, { src: props.responsibleGamingLogo ?? responsibleGamingLogo, alt: "", height: 62, width: 186, className: "h-[62px] w-auto shrink-0", draggable: false })] })] }), _jsx("div", { className: "w-full", children: _jsx(Button, { type: "button", className: "mt-3", onClick: () => {
11
+ onCloseAction();
12
+ }, children: "I Agree" }) })] }) })] }) }));
13
+ }
@@ -0,0 +1,11 @@
1
+ import { type ImageProps } from 'next/image';
2
+ import type { ReactNode } from 'react';
3
+ export interface TermsOfUseProps {
4
+ logo: ImageProps['src'];
5
+ open: boolean;
6
+ onCloseAction: () => void;
7
+ termsOfUseContent: string | ReactNode;
8
+ siteName: string;
9
+ responsibleGamingLogo?: ImageProps['src'];
10
+ }
11
+ export declare function TermsOfUse({ logo, open, onCloseAction, siteName, termsOfUseContent, ...props }: TermsOfUseProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,13 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import Image, {} from 'next/image';
4
+ import pagcorLogo from '../../images/pagcor.png';
5
+ import responsibleGamingLogo from '../../images/responsible-gaming.png';
6
+ import { Button } from '../../ui/Button/index.js';
7
+ import { Dialog } from '../../ui/Dialog/index.js';
8
+ import { Portal } from '../../ui/Portal/index.js';
9
+ export function TermsOfUse({ logo, open, onCloseAction, siteName, termsOfUseContent, ...props }) {
10
+ return (_jsx(Dialog.Root, { open: open, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, { className: "z-popover" }), _jsx(Dialog.Positioner, { className: "z-popover", children: _jsxs(Dialog.Content, { className: "flex h-full w-full flex-col items-start overflow-y-auto p-3xl lg:mx-auto lg:h-auto lg:w-[400px] lg:rounded-xl", children: [_jsx(Image, { src: logo, alt: "", width: 200, height: 100, className: "mx-auto h-auto w-[120px]", draggable: false }), _jsxs("div", { className: "w-full grow", children: [_jsxs(Dialog.Title, { className: "text-brand-400 mt-3xl text-center text-lg font-semibold", children: [siteName, " Terms of Use"] }), _jsx(Dialog.Description, { className: "leading-2xl mt-xs text-sm", children: termsOfUseContent }), _jsxs("div", { className: "mt-5 flex items-center justify-center gap-3xl", children: [_jsx(Image, { src: pagcorLogo, alt: "", height: 75, width: 88, className: "h-[88px] w-auto shrink-0", draggable: false }), _jsx(Image, { src: props.responsibleGamingLogo ?? responsibleGamingLogo, alt: "", height: 62, width: 186, className: "h-[62px] w-auto shrink-0", draggable: false })] })] }), _jsx("div", { className: "w-full", children: _jsx(Button, { type: "button", className: "mt-3", onClick: () => {
11
+ onCloseAction();
12
+ }, children: "I Agree" }) })] }) })] }) }));
13
+ }
@@ -0,0 +1 @@
1
+ export declare function FeatureFlag(): import("react/jsx-runtime").JSX.Element | null;