@opexa/portal-components 0.0.893 → 0.0.895

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 (212) hide show
  1. package/dist/components/DepositWithdrawal/Deposit/AurixPayQRPHDeposit/AurixPayQRPHDepositContext.d.ts +2 -2
  2. package/dist/components/DepositWithdrawal/Deposit/AurixPayQRPHDeposit/useAurixPayQRPHDeposit.d.ts +1 -1
  3. package/dist/components/DepositWithdrawal/Deposit/OnlineBankDeposit/OnlineBankDepositContext.d.ts +2 -2
  4. package/dist/components/DepositWithdrawal/Deposit/OnlineBankDeposit/useOnlineBankDeposit.d.ts +1 -1
  5. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit/QRPHDepositContext.d.ts +2 -2
  6. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit/useQRPHDeposit.d.ts +1 -1
  7. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__legacy/QRPHDepositContext.d.ts +2 -2
  8. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__legacy/useQRPHDeposit.d.ts +1 -1
  9. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/Confirmed.d.ts +1 -0
  10. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/Confirmed.js +11 -0
  11. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/Failed.d.ts +1 -0
  12. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/Failed.js +11 -0
  13. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/Form.d.ts +1 -0
  14. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/Form.js +126 -0
  15. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/GeneratingQrCode.d.ts +1 -0
  16. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/GeneratingQrCode.js +10 -0
  17. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/QRPHDeposit.d.ts +1 -0
  18. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/QRPHDeposit.js +12 -0
  19. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/QRPHDepositContext.d.ts +17 -0
  20. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/QRPHDepositContext.js +2 -0
  21. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/QrCodeGenerated.d.ts +1 -0
  22. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/QrCodeGenerated.js +41 -0
  23. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/useQRPHDeposit.d.ts +13 -0
  24. package/dist/components/DepositWithdrawal/Deposit/QRPHDeposit__next/useQRPHDeposit.js +91 -0
  25. package/dist/components/DepositWithdrawal/Deposit__legacy/OnlineBankDeposit/OnlineBankDepositContext.d.ts +2 -2
  26. package/dist/components/DepositWithdrawal/Deposit__legacy/OnlineBankDeposit/useOnlineBankDeposit.d.ts +1 -1
  27. package/dist/components/DepositWithdrawal/Deposit__legacy/QRPHDeposit/QRPHDepositContext.d.ts +2 -2
  28. package/dist/components/DepositWithdrawal/Deposit__legacy/QRPHDeposit/useQRPHDeposit.d.ts +1 -1
  29. package/dist/components/DigitainLauncher/Loading.js +1 -1
  30. package/dist/components/Disclaimer/DisclaimerV3.js +8 -1
  31. package/dist/components/Disclaimer/ResponsibleGaming.d.ts +10 -0
  32. package/dist/components/Disclaimer/ResponsibleGaming.js +13 -0
  33. package/dist/components/Disclaimer/TermsOfUse.d.ts +11 -0
  34. package/dist/components/Disclaimer/TermsOfUse.js +13 -0
  35. package/dist/components/FeatureFlag/FeatureFlag.d.ts +1 -0
  36. package/dist/components/FeatureFlag/FeatureFlag.js +29 -0
  37. package/dist/components/FeatureFlag/index.d.ts +1 -0
  38. package/dist/components/FeatureFlag/index.js +1 -0
  39. package/dist/components/ForgotPassword/Crazywin/ForgotPassword.module.css +42 -42
  40. package/dist/components/Jackpots/Jackpots.module.css +288 -288
  41. package/dist/components/Jackpots/JackpotsCarousel/JackpotsCarouselItem.module.css +184 -184
  42. package/dist/components/Jackpots/JackpotsList/JackpotsListItem.module.css +184 -184
  43. package/dist/components/KYC/AutoOpen.d.ts +1 -0
  44. package/dist/components/KYC/AutoOpen.js +40 -0
  45. package/dist/components/KYC/BasicInformation.js +1 -1
  46. package/dist/components/KYC/CaptureIdDocument.d.ts +1 -0
  47. package/dist/components/KYC/CaptureIdDocument.js +219 -0
  48. package/dist/components/KYC/CaptureSelfie.d.ts +1 -0
  49. package/dist/components/KYC/CaptureSelfie.js +285 -0
  50. package/dist/components/KYC/DisplayImage.d.ts +5 -0
  51. package/dist/components/KYC/DisplayImage.js +8 -0
  52. package/dist/components/KYC/FileUpload.d.ts +10 -0
  53. package/dist/components/KYC/FileUpload.js +72 -0
  54. package/dist/components/KYC/IdentityVerification.js +1 -1
  55. package/dist/components/KYC/KYC.lazy.js +1 -1
  56. package/dist/components/KYC/KYCDefault/KYCVerificationStatus.lazy.js +2 -2
  57. package/dist/components/KYC/KYCNonPagCor/KYCVerificationStatus.lazy.js +2 -2
  58. package/dist/components/KYC/KYCVerificationStatus.lazy.js +8 -5
  59. package/dist/components/KYC/NoCameraError.d.ts +7 -0
  60. package/dist/components/KYC/NoCameraError.js +6 -0
  61. package/dist/components/KYC/PersonOverlayDesktop.d.ts +7 -0
  62. package/dist/components/KYC/PersonOverlayDesktop.js +9 -0
  63. package/dist/components/KYC/PersonalInformation.js +1 -1
  64. package/dist/components/KYC/backup/Header.d.ts +1 -0
  65. package/dist/components/KYC/backup/Header.js +8 -0
  66. package/dist/components/KYC/backup/Indicator.d.ts +1 -0
  67. package/dist/components/KYC/backup/Indicator.js +9 -0
  68. package/dist/components/KYC/backup/KYC.d.ts +1 -0
  69. package/dist/components/KYC/backup/KYC.js +14 -0
  70. package/dist/components/KYC/backup/KYC.lazy.d.ts +1 -0
  71. package/dist/components/KYC/backup/KYC.lazy.js +26 -0
  72. package/dist/components/KYC/backup/KYCContext.d.ts +6 -0
  73. package/dist/components/KYC/backup/KYCContext.js +2 -0
  74. package/dist/components/KYC/backup/Step1.d.ts +1 -0
  75. package/dist/components/KYC/backup/Step1.js +13 -0
  76. package/dist/components/KYC/backup/Step2.d.ts +1 -0
  77. package/dist/components/KYC/backup/Step2.js +13 -0
  78. package/dist/components/KYC/backup/Step3.d.ts +1 -0
  79. package/dist/components/KYC/backup/Step3.js +13 -0
  80. package/dist/components/KYC/backup/Step4.d.ts +1 -0
  81. package/dist/components/KYC/backup/Step4.js +7 -0
  82. package/dist/components/KYC/backup/useKYC.d.ts +10 -0
  83. package/dist/components/KYC/backup/useKYC.js +8 -0
  84. package/dist/components/KYC/loadModels.d.ts +1 -0
  85. package/dist/components/KYC/loadModels.js +9 -0
  86. package/dist/components/KYC/utils.d.ts +9 -0
  87. package/dist/components/KYC/utils.js +79 -0
  88. package/dist/components/Messages/Message.d.ts +1 -0
  89. package/dist/components/Messages/Message.js +35 -0
  90. package/dist/components/Messages/MessageContext.d.ts +6 -0
  91. package/dist/components/Messages/MessageContext.js +2 -0
  92. package/dist/components/Messages/MessagePopup.d.ts +1 -0
  93. package/dist/components/Messages/MessagePopup.js +20 -0
  94. package/dist/components/Messages/MessageTrigger.d.ts +8 -0
  95. package/dist/components/Messages/MessageTrigger.js +19 -0
  96. package/dist/components/PortalProvider/CXDTokenObserver.js +11 -11
  97. package/dist/components/Quests/CountdownTimer.d.ts +15 -0
  98. package/dist/components/Quests/CountdownTimer.js +33 -0
  99. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuest.d.ts +4 -0
  100. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuest.js +78 -0
  101. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuestModal.d.ts +8 -0
  102. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuestModal.js +9 -0
  103. package/dist/components/Quests/OnboardingQuest/OnboardingQuest.d.ts +4 -0
  104. package/dist/components/Quests/OnboardingQuest/OnboardingQuest.js +4 -0
  105. package/dist/components/Quests/WageringQuest/WageringQuest.d.ts +4 -0
  106. package/dist/components/Quests/WageringQuest/WageringQuest.js +20 -0
  107. package/dist/components/Quests/WageringQuest/WageringQuestModal.d.ts +9 -0
  108. package/dist/components/Quests/WageringQuest/WageringQuestModal.js +9 -0
  109. package/dist/components/SignUp/SignUp.lazy.d.ts +12 -0
  110. package/dist/components/SignUp/SignUp.lazy.js +18 -0
  111. package/dist/components/SignUp/SignUpContext.d.ts +6 -0
  112. package/dist/components/SignUp/SignUpContext.js +2 -0
  113. package/dist/components/SignUp/SignUpDefault/SignUp.lazy.d.ts +17 -0
  114. package/dist/components/SignUp/SignUpDefault/SignUp.lazy.js +18 -0
  115. package/dist/components/SignUp/SignUpDefault/SignUpContext.d.ts +6 -0
  116. package/dist/components/SignUp/SignUpDefault/SignUpContext.js +2 -0
  117. package/dist/components/SignUp/SignUpDefault/SignUpForm.d.ts +1 -0
  118. package/dist/components/SignUp/SignUpDefault/SignUpForm.js +310 -0
  119. package/dist/components/SignUp/SignUpForm.d.ts +1 -0
  120. package/dist/components/SignUp/SignUpForm.js +284 -0
  121. package/dist/components/SignUp/SignUpKYC/CaptureIdDocument.d.ts +1 -0
  122. package/dist/components/SignUp/SignUpKYC/CaptureIdDocument.js +198 -0
  123. package/dist/components/SignUp/SignUpKYC/CaptureSelfie.d.ts +1 -0
  124. package/dist/components/SignUp/SignUpKYC/CaptureSelfie.js +251 -0
  125. package/dist/components/SignUp/SignUpKYC/ImageUploader.d.ts +10 -0
  126. package/dist/components/SignUp/SignUpKYC/ImageUploader.js +42 -0
  127. package/dist/components/SignUp/SignUpKYC/PersonOverlayDesktop.d.ts +7 -0
  128. package/dist/components/SignUp/SignUpKYC/PersonOverlayDesktop.js +9 -0
  129. package/dist/components/SignUp/SignUpKYC/SignUpFormKYC.d.ts +1 -0
  130. package/dist/components/SignUp/SignUpKYC/SignUpFormKYC.js +464 -0
  131. package/dist/components/SignUp/SignUpKYC/useImageUploader.d.ts +11 -0
  132. package/dist/components/SignUp/SignUpKYC/useImageUploader.js +20 -0
  133. package/dist/components/SignUp/SignUpKYC/utils.d.ts +9 -0
  134. package/dist/components/SignUp/SignUpKYC/utils.js +79 -0
  135. package/dist/components/SignUp/SignUpPagcor/CaptureIdDocument.d.ts +1 -0
  136. package/dist/components/SignUp/SignUpPagcor/CaptureIdDocument.js +198 -0
  137. package/dist/components/SignUp/SignUpPagcor/CaptureSelfie.d.ts +1 -0
  138. package/dist/components/SignUp/SignUpPagcor/CaptureSelfie.js +251 -0
  139. package/dist/components/SignUp/SignUpPagcor/ImageUploader.d.ts +10 -0
  140. package/dist/components/SignUp/SignUpPagcor/ImageUploader.js +41 -0
  141. package/dist/components/SignUp/SignUpPagcor/SignUpFormPagcor.d.ts +1 -0
  142. package/dist/components/SignUp/SignUpPagcor/SignUpFormPagcor.js +429 -0
  143. package/dist/components/SignUp/SignUpPagcor/SignUpPagcor.lazy.d.ts +13 -0
  144. package/dist/components/SignUp/SignUpPagcor/SignUpPagcor.lazy.js +26 -0
  145. package/dist/components/SignUp/SignUpPagcor/SignUpPagcorContext.d.ts +7 -0
  146. package/dist/components/SignUp/SignUpPagcor/SignUpPagcorContext.js +2 -0
  147. package/dist/components/SignUp/SignUpPagcor/useImageUploader.d.ts +11 -0
  148. package/dist/components/SignUp/SignUpPagcor/useImageUploader.js +20 -0
  149. package/dist/components/Tournaments/TournamentsCarousel/TournamentsCarouselItem.module.css +184 -184
  150. package/dist/components/Tournaments/TournamentsList/TournamentItem.module.css +184 -184
  151. package/dist/components/Tournaments/TournamentsList/TournamentListItemTable.CrazyWin.d.ts +9 -0
  152. package/dist/components/Tournaments/TournamentsList/TournamentListItemTable.CrazyWin.js +94 -0
  153. package/dist/components/Tournaments/TournamentsList/TournamentListItemTable.HappyBingo.d.ts +9 -0
  154. package/dist/components/Tournaments/TournamentsList/TournamentListItemTable.HappyBingo.js +94 -0
  155. package/dist/components/Tournaments/TournamentsList/TournamentsList.d.ts +1 -0
  156. package/dist/components/Tournaments/TournamentsList/TournamentsList.js +5 -3
  157. package/dist/components/Tournaments/TournamentsList/TournamentsListItem.CrazyWin.d.ts +3 -0
  158. package/dist/components/Tournaments/TournamentsList/TournamentsListItem.CrazyWin.js +37 -0
  159. package/dist/components/Tournaments/TournamentsList/TournamentsListItem.HappyBingo.d.ts +3 -0
  160. package/dist/components/Tournaments/TournamentsList/TournamentsListItem.HappyBingo.js +37 -0
  161. package/dist/components/Tournaments/utils.d.ts +31 -0
  162. package/dist/components/Tournaments/utils.js +106 -0
  163. package/dist/components/shared/IdDocumentField.client.d.ts +25 -0
  164. package/dist/components/shared/IdDocumentField.client.js +204 -0
  165. package/dist/components/shared/IdDocumentField.d.ts +2 -0
  166. package/dist/components/shared/IdDocumentField.js +11 -0
  167. package/dist/components/shared/SelfieField.client.d.ts +20 -0
  168. package/dist/components/shared/SelfieField.client.js +327 -0
  169. package/dist/components/shared/SelfieField.d.ts +2 -0
  170. package/dist/components/shared/SelfieField.js +11 -0
  171. package/dist/constants/BranchCode.d.ts +4 -0
  172. package/dist/constants/BranchCode.js +42 -0
  173. package/dist/handlers/postTransformIdFrontImage.d.ts +3 -0
  174. package/dist/handlers/postTransformIdFrontImage.js +67 -0
  175. package/dist/handlers/postTransformSelfieImage.d.ts +3 -0
  176. package/dist/handlers/postTransformSelfieImage.js +71 -0
  177. package/dist/handlers.d.ts +43 -0
  178. package/dist/handlers.js +297 -0
  179. package/dist/icons/BellRingIcon.d.ts +2 -0
  180. package/dist/icons/BellRingIcon.js +4 -0
  181. package/dist/images/phone-icon.svg +10 -10
  182. package/dist/images/star-trophy.webp +0 -0
  183. package/dist/images/tournament-bg-1.webp +0 -0
  184. package/dist/images/tournament-bg-2.webp +0 -0
  185. package/dist/images/tournament-bg-3.webp +0 -0
  186. package/dist/schemas/forgotPasswordSchema.d.ts +8 -8
  187. package/dist/services/queries.js +3339 -3339
  188. package/dist/styles/theme.css +776 -776
  189. package/dist/ui/Combobox/Combobox.d.ts +42 -42
  190. package/dist/ui/Combobox/combobox.recipe.d.ts +3 -3
  191. package/dist/ui/Menu/Menu.d.ts +198 -198
  192. package/dist/ui/Menu/menu.recipe.d.ts +11 -11
  193. package/dist/ui/Select/Select.d.ts +45 -45
  194. package/dist/ui/Select/select.recipe.d.ts +3 -3
  195. package/dist/ui/Table/Table.d.ts +21 -21
  196. package/dist/ui/Table/table.anatomy.d.ts +1 -1
  197. package/dist/ui/Table/table.recipe.d.ts +3 -3
  198. package/dist/utils/dataUrlToBlob.d.ts +1 -0
  199. package/dist/utils/dataUrlToBlob.js +11 -0
  200. package/dist/utils/gamesAvailable3pmTo3am.d.ts +1 -0
  201. package/dist/utils/gamesAvailable3pmTo3am.js +1 -0
  202. package/dist/utils/getGameName.d.ts +1 -0
  203. package/dist/utils/getGameName.js +6 -0
  204. package/dist/utils/isBetween3amAnd3pm.d.ts +1 -0
  205. package/dist/utils/isBetween3amAnd3pm.js +5 -0
  206. package/dist/utils/resizeImageSize.d.ts +2 -0
  207. package/dist/utils/resizeImageSize.js +11 -0
  208. package/package.json +177 -177
  209. package/dist/components/Banner/Banner.client.d.ts +0 -12
  210. package/dist/components/Banner/Banner.client.js +0 -49
  211. package/dist/components/PortalProvider/AndroidOnlyComponents.d.ts +0 -1
  212. package/dist/components/PortalProvider/AndroidOnlyComponents.js +0 -12
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { format } from 'date-fns';
3
+ import Image from 'next/image';
4
+ import React, { useMemo, useState } from 'react';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import { Award01Icon } from '../../../icons/Award01Icon.js';
7
+ import { ChevronDownIcon } from '../../../icons/ChevronDownIcon.js';
8
+ import { ChevronUpIcon } from '../../../icons/ChevronUpIcon.js';
9
+ import coins from '../../../images/coins.webp';
10
+ import starTrophy from '../../../images/star-trophy.webp';
11
+ import { Tabs } from '../../../ui/Tabs/index.js';
12
+ import { formatNumber } from '../../../utils/formatNumber.js';
13
+ import { CRAZYWIN_TOURNAMENT_VARIATIONS } from '../utils.js';
14
+ import TournamentTable from './TournamentListItemTable.CrazyWin.js';
15
+ import { useTournamentsListItemContext } from './TournamentsListContext.js';
16
+ import { TournamentsListItemGameProviders } from './TournamentsListItemGameProviders.js';
17
+ import { useTournamentsListItemData } from './useTournamentListItemData.js';
18
+ import { useTournamentTimer } from './useTournamentTimer.js';
19
+ export function TournamentsListItemCrazyWin({ index }) {
20
+ const variation = CRAZYWIN_TOURNAMENT_VARIATIONS[index % CRAZYWIN_TOURNAMENT_VARIATIONS.length];
21
+ const tournament = useTournamentsListItemContext();
22
+ const { isLaunchStarts, timeParts, now } = useTournamentTimer({
23
+ activationEndDateTime: tournament.activationEndDateTime,
24
+ activationStartDateTime: tournament.activationStartDateTime,
25
+ });
26
+ const { tournamentReward, filteredGameProviders, localeInfo } = useTournamentsListItemData();
27
+ const isEnded = new Date(tournament.activationEndDateTime) < now;
28
+ const [seeDetails, setSeeDetails] = useState(false);
29
+ const numberOfWinnersText = useMemo(() => `${tournament.winnersCount} winner${Number(tournament.winnersCount) > 1 ? 's' : ''}`, [tournament.winnersCount]);
30
+ return (_jsxs("div", { className: "w-full shrink-0 overflow-hidden rounded-2xl", children: [_jsxs("div", { className: twMerge('relative w-full flex-1 gap-4 rounded-t-[10px] p-4 lg:gap-10 lg:p-6', variation.background), children: [_jsx(Image, { src: variation.bgImage, alt: "treasure chest background", className: "absolute top-0 right-0 hidden h-full w-[720px] rounded-t-[10px] object-cover opacity-20 mix-blend-luminosity [mask-image:linear-gradient(to_right,transparent,black)] lg:block", priority: false, loading: "lazy", unoptimized: true }), _jsx("div", { className: "relative z-1 flex w-full flex-col", children: _jsx("div", { className: "flex h-full flex-col justify-between", children: _jsx("div", { className: "flex w-full justify-between", children: _jsx("div", { className: "flex w-full flex-col", children: _jsx("div", { className: "relative flex w-full justify-between", children: _jsxs("div", { className: "flex w-full flex-col lg:flex-row", children: [_jsxs("div", { className: "flex w-full flex-col", children: [_jsxs("div", { className: "flex w-fit items-center justify-center gap-1 rounded-[10px] border-[#82F0D0] border-[1px] px-[10px] py-1 text-[#82F0D0] text-xs lg:text-sm", children: [_jsx(Award01Icon, { className: "h-4 w-4 text-[#82F0D0]" }), "Multiplier"] }), _jsx("div", { className: "w-1/2 text-left font-bold text-lg lg:w-[68%] lg:text-[32px]", children: tournament.name }), _jsxs("div", { className: "flex flex-col", children: [_jsx("div", { className: twMerge(variation.poolBg, variation.textColor, 'flex w-fit rounded-lg px-2 font-semibold text-[26px] lg:text-[36px]'), children: formatNumber(tournamentReward, {
31
+ currency: localeInfo.currency.code,
32
+ minDecimalPlaces: 2,
33
+ maxDecimalPlaces: 2,
34
+ }) }), _jsx("div", { className: twMerge(variation.poolBg, variation.textColor, 'mt-[6px] flex w-fit rounded-lg px-2 py-1 font-bold text-base lg:text-2xl'), children: numberOfWinnersText })] })] }), _jsxs("div", { className: "flex flex-col items-center justify-between", children: [_jsx("div", { className: twMerge('relative my-4 h-[129px] w-full overflow-hidden rounded-lg lg:hidden', variation.background), children: _jsx(Image, { src: variation.bgImage, alt: "image", className: "h-full w-full object-cover mix-blend-luminosity", priority: false, loading: "lazy", unoptimized: true }) }), _jsxs("div", { className: "flex w-full flex-col", children: [isEnded && (_jsxs("div", { className: twMerge('mb-2 flex flex-col items-center justify-center whitespace-nowrap rounded-md bg-bg-primary px-2 py-1.5 font-semibold text-[#EAAA08] text-sm'), children: [_jsx("span", { className: "font-semibold", children: "Ended" }), _jsx("span", { className: twMerge('text-[9px] text-text-secondary-700'), children: format(tournament.activationEndDateTime, 'MMMM dd, yyyy') })] })), !isLaunchStarts && !isEnded && (_jsx("div", { className: twMerge('mb-2 flex items-center justify-center rounded-md bg-bg-primary py-1 font-semibold text-brand-500 text-sm'), children: "Launching Soon" })), !isEnded && (_jsx("div", { className: "flex h-fit w-full gap-2", children: timeParts.map((part, idx) => (_jsxs(React.Fragment, { children: [_jsxs("div", { className: twMerge(variation.poolBg, variation.textColor, variation.timeBorderColor, 'flex h-fit flex-1 flex-col items-center rounded-lg border-[1px] py-3 lg:w-[59px] lg:py-[6px]'), children: [_jsx("span", { className: "font-semibold text-lg lg:text-2xl", children: String(part.value).padStart(2, '0') }), _jsx("span", { className: "text-2xs lg:text-xs", children: part.label })] }), idx < timeParts.length - 1 && (_jsxs("div", { className: "flex shrink-0 flex-col justify-center gap-1.5 px-1", children: [_jsx("div", { className: "h-1 w-1 rounded-full bg-bg-primary" }), _jsx("div", { className: "h-1 w-1 rounded-full bg-bg-primary" })] }))] }, part.label))) }))] }), _jsx("div", { className: "mt-2xl w-fit", children: _jsx("div", { className: "flex w-full", children: _jsxs("div", { className: "flex h-full flex-row-reverse items-center justify-start lg:flex-col", children: [_jsx(Image, { src: coins, alt: "coins", className: "w-[179.2px] lg:w-[132.26px]", unoptimized: true }), _jsxs("div", { className: "text-start lg:text-center", children: [_jsx("p", { className: "mt-1 font-semibold text-[16px] leading-6", children: "No one has won big yet" }), _jsx("p", { className: "mt-1 text-start text-xs leading-[1.125rem] lg:text-center", children: "You could be the first to win the tournament!" })] })] }) }) })] })] }) }) }) }) }) })] }), _jsxs("div", { className: "relative flex w-full flex-col items-center rounded-b-2xl bg-[#171b26] px-4 text-[#94969C]", children: [_jsxs("div", { className: "flex w-full justify-between py-4", children: [_jsxs("button", { onClick: () => setSeeDetails((v) => !v), type: "button", className: "flex items-center gap-1 font-medium text-sm", children: ["See details", ' ', seeDetails ? (_jsx(ChevronUpIcon, { className: "h-5" })) : (_jsx(ChevronDownIcon, { className: "h-5" }))] }), _jsx("button", { type: "button", className: "inline-flex h-9 items-center justify-center rounded-lg border border-[#333741] px-4 py-2.5 font-semibold text-[#CECFD2]", children: "Tournament Rules" })] }), seeDetails && (_jsxs("div", { className: "mt-2 w-full", children: [_jsx("div", { children: _jsx("div", { className: "mt-[6px] flex justify-between text-[#CECFD2] text-lg", children: _jsxs("div", { className: "flex items-center gap-3 font-semibold", children: [_jsx(Image, { src: starTrophy, alt: "star trophy", unoptimized: true }), "Ranking"] }) }) }), _jsx("div", { children: _jsxs(Tabs.Root, { defaultValue: "current", className: "mt-4", children: [_jsxs(Tabs.List, { className: "flex gap-1 rounded-xl border border-[#1F242F] bg-[#1A1620] p-1 font-semibold text-[#757278] text-sm leading-[0.01em] lg:w-fit", children: [_jsx(Tabs.Trigger, { value: "current", className: "ui-selected:text-white", children: "Current" }), _jsx(Tabs.Trigger, { value: "previous", className: "ui-selected:text-white", children: "Previous" }), _jsx(Tabs.Indicator, { className: "bg-[linear-gradient(241.67deg,#1A534C_1.19%,#051B29_100%)]" })] }), _jsx(Tabs.Content, { value: "current", children: _jsx(TournamentTable, { winnersCount: Number(tournament.winnersCount), rewardSettings: tournament.rewardSettings, leaderboard: tournament.currentLeaderboard
35
+ .edges }) }), _jsx(Tabs.Content, { value: "previous", children: _jsx(TournamentTable, { winnersCount: Number(tournament.winnersCount), rewardSettings: tournament.rewardSettings, leaderboard: tournament.currentLeaderboard
36
+ .edges }) })] }) }), _jsx("div", { className: "w-full", children: Boolean(filteredGameProviders.length) && (_jsx(TournamentsListItemGameProviders, { gameProviders: filteredGameProviders })) })] }))] })] }));
37
+ }
@@ -0,0 +1,3 @@
1
+ export declare function TournamentsListItemHappyBingo({ index }: {
2
+ index: number;
3
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { format } from 'date-fns';
3
+ import Image from 'next/image';
4
+ import React, { useMemo, useState } from 'react';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import { Award01Icon } from '../../../icons/Award01Icon.js';
7
+ import { ChevronDownIcon } from '../../../icons/ChevronDownIcon.js';
8
+ import { ChevronUpIcon } from '../../../icons/ChevronUpIcon.js';
9
+ import star from '../../../images/3d-star.webp';
10
+ import coins from '../../../images/happy-bingo-coins.webp';
11
+ import { Tabs } from '../../../ui/Tabs/index.js';
12
+ import { formatNumber } from '../../../utils/formatNumber.js';
13
+ import { HAPPY_BINGO_TOURNAMENT_VARIATIONS } from '../utils.js';
14
+ import TournamentTable from './TournamentListItemTable.HappyBingo.js';
15
+ import { useTournamentsListItemContext } from './TournamentsListContext.js';
16
+ import { TournamentsListItemGameProviders } from './TournamentsListItemGameProviders.js';
17
+ import { useTournamentsListItemData } from './useTournamentListItemData.js';
18
+ import { useTournamentTimer } from './useTournamentTimer.js';
19
+ export function TournamentsListItemHappyBingo({ index }) {
20
+ const variation = HAPPY_BINGO_TOURNAMENT_VARIATIONS[index % HAPPY_BINGO_TOURNAMENT_VARIATIONS.length];
21
+ const tournament = useTournamentsListItemContext();
22
+ const { isLaunchStarts, timeParts, now } = useTournamentTimer({
23
+ activationEndDateTime: tournament.activationEndDateTime,
24
+ activationStartDateTime: tournament.activationStartDateTime,
25
+ });
26
+ const { tournamentReward, filteredGameProviders, localeInfo } = useTournamentsListItemData();
27
+ const isEnded = new Date(tournament.activationEndDateTime) < now;
28
+ const [seeDetails, setSeeDetails] = useState(false);
29
+ const numberOfWinnersText = useMemo(() => `${tournament.winnersCount} winner${Number(tournament.winnersCount) > 1 ? 's' : ''}`, [tournament.winnersCount]);
30
+ return (_jsxs("div", { className: "w-full shrink-0 overflow-hidden rounded-2xl", children: [_jsxs("div", { className: twMerge('relative w-full flex-1 gap-4 rounded-t-[10px] p-4 lg:gap-10 lg:p-6', variation.background), children: [_jsx(Image, { src: variation.bgImage, alt: "treasure chest background", className: "absolute top-0 right-0 hidden h-full w-[720px] rounded-t-[10px] object-cover opacity-20 mix-blend-luminosity [mask-image:linear-gradient(to_right,transparent,black)] lg:block", priority: false, loading: "lazy", unoptimized: true }), _jsx("div", { className: "relative z-1 flex w-full flex-col", children: _jsx("div", { className: "flex h-full flex-col justify-between", children: _jsx("div", { className: "flex w-full justify-between", children: _jsx("div", { className: "flex w-full flex-col", children: _jsx("div", { className: "relative flex w-full justify-between", children: _jsxs("div", { className: "flex w-full flex-col lg:flex-row", children: [_jsxs("div", { className: "flex w-full flex-col", children: [_jsxs("div", { className: twMerge('flex h-fit w-fit items-center justify-center gap-1 rounded-[8px] border-[1px] bg-[#EFF8FF] px-[10px] py-1 text-xs lg:text-sm', variation.multiplierBadgeColor, variation.multiplierBadgeBorderColor, variation.darkMultiplierBadgeColor, variation.darkMultiplierBadgeBorderColor, variation.darkMultiplierBg), children: [_jsx(Award01Icon, { className: "size-4" }), _jsx("span", { children: "Multiplier" })] }), _jsx("div", { className: "w-1/2 text-left font-bold text-lg lg:w-[68%] lg:text-[32px]", children: tournament.name }), _jsxs("div", { className: "flex flex-col", children: [_jsx("div", { className: twMerge(variation.poolBg, variation.textColor, 'flex w-fit rounded-lg px-2 font-semibold text-[26px] lg:text-[36px]'), children: formatNumber(tournamentReward, {
31
+ currency: localeInfo.currency.code,
32
+ minDecimalPlaces: 2,
33
+ maxDecimalPlaces: 2,
34
+ }) }), _jsx("div", { className: twMerge(variation.poolBg, variation.textColor, 'mt-[6px] flex w-fit rounded-lg px-2 py-1 font-bold text-base lg:text-2xl'), children: numberOfWinnersText })] })] }), _jsxs("div", { className: "flex flex-col items-center justify-between", children: [_jsx("div", { className: twMerge('relative my-4 h-[129px] w-full overflow-hidden rounded-lg lg:hidden', variation.background), children: _jsx(Image, { src: variation.bgImage, alt: "image", className: 'h-full w-full object-cover mix-blend-luminosity', priority: false, loading: "lazy", unoptimized: true }) }), _jsxs("div", { className: "flex w-full flex-col", children: [isEnded && (_jsxs("div", { className: twMerge('mb-2 flex flex-col items-center justify-center whitespace-nowrap rounded-md bg-bg-primary px-2 py-1.5 font-semibold text-[#EAAA08] text-sm'), children: [_jsx("span", { className: "font-semibold", children: "Ended" }), _jsx("span", { className: twMerge('text-[9px] text-text-secondary-700'), children: format(tournament.activationEndDateTime, 'MMMM dd, yyyy') })] })), !isLaunchStarts && !isEnded && (_jsx("div", { className: twMerge('mb-2 flex items-center justify-center rounded-md bg-bg-primary py-1 font-semibold text-brand-500 text-sm'), children: "Launching Soon" })), !isEnded && (_jsx("div", { className: "flex h-fit w-full gap-2", children: timeParts.map((part, idx) => (_jsxs(React.Fragment, { children: [_jsxs("div", { className: twMerge(variation.poolBg, variation.textColor, variation.timeBorderColor, 'flex h-fit flex-1 flex-col items-center rounded-lg border-[1px] py-3 lg:w-[59px] lg:py-[6px]'), children: [_jsx("span", { className: "font-semibold text-lg lg:text-2xl", children: String(part.value).padStart(2, '0') }), _jsx("span", { className: "text-2xs lg:text-xs", children: part.label })] }), idx < timeParts.length - 1 && (_jsxs("div", { className: "flex shrink-0 flex-col justify-center gap-1.5 px-1", children: [_jsx("div", { className: "h-1 w-1 rounded-full bg-bg-primary" }), _jsx("div", { className: "h-1 w-1 rounded-full bg-bg-primary" })] }))] }, part.label))) }))] }), _jsx("div", { className: "mt-2xl w-fit", children: _jsx("div", { className: "flex w-full", children: _jsxs("div", { className: "flex h-full flex-row-reverse items-center justify-start lg:flex-col", children: [_jsx(Image, { src: coins, alt: "coins", className: "w-[179.2px] lg:w-[132.26px]", unoptimized: true }), _jsxs("div", { className: "text-start lg:text-center", children: [_jsx("p", { className: "mt-1 font-semibold text-[16px] leading-6", children: "No one has won big yet" }), _jsx("p", { className: "mt-1 text-start text-xs leading-[1.125rem] lg:text-center", children: "You could be the first to win the tournament!" })] })] }) }) })] })] }) }) }) }) }) })] }), _jsxs("div", { className: "relative flex w-full flex-1 flex-col items-center justify-between bg-white px-4 py-3.5 text-[#475467] dark:bg-[#161B26] dark:text-[#94969C]", children: [_jsxs("div", { className: "flex w-full justify-between", children: [_jsxs("button", { onClick: () => setSeeDetails((v) => !v), type: "button", className: "flex items-center gap-1 font-medium text-sm", children: ["See details", ' ', seeDetails ? (_jsx(ChevronUpIcon, { className: "h-5" })) : (_jsx(ChevronDownIcon, { className: "h-5" }))] }), _jsx("button", { type: "button", className: "inline-flex h-9 items-center justify-center gap-1.5 rounded-lg border border-[#EAAA08] bg-white px-4 py-2.5 font-semibold text-[#A15C07] text-sm shadow-xs transition-colors duration-200 hover:border-[#FDE272] hover:bg-[#FEFBE8] disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:border-[#EAAA08] disabled:hover:bg-white dark:border-[#333741] dark:bg-[#161B26] dark:text-[#CECFD2] dark:disabled:hover:border-[#333741] dark:disabled:hover:bg-[#161B26]", children: "Tournament Rules" })] }), seeDetails && (_jsxs("div", { className: "mt-2 w-full", children: [_jsx("div", { children: _jsx("div", { className: "mt-[6px] flex justify-between text-[#344054] text-lg dark:text-[#CECFD2]", children: _jsxs("div", { className: "flex items-center gap-3 font-semibold", children: [_jsx(Image, { src: star, alt: "3d star", className: "size-6", unoptimized: true }), "Ranking"] }) }) }), _jsx("div", { children: _jsxs(Tabs.Root, { defaultValue: "current", className: "mt-4", children: [_jsxs(Tabs.List, { className: "flex gap-1 rounded-xl border border-[#EAECF0] bg-[#F9FAFB] p-1 font-semibold text-[#667085] text-sm leading-[0.01em] lg:w-fit dark:border-[#1F242F] dark:bg-[#0C111D] dark:text-[#757278]", children: [_jsx(Tabs.Trigger, { value: "current", className: "ui-selected:text-[#475467] ui-selected:dark:text-[#94969C]", children: "Current" }), _jsx(Tabs.Trigger, { value: "previous", className: "ui-selected:text-[#475467] ui-selected:dark:text-[#94969C]", children: "Previous" }), _jsx(Tabs.Indicator, { className: "bg-[white] dark:bg-[#161B26]" })] }), _jsx(Tabs.Content, { value: "current", children: _jsx(TournamentTable, { winnersCount: Number(tournament.winnersCount), rewardSettings: tournament.rewardSettings, leaderboard: tournament.currentLeaderboard
35
+ .edges }) }), _jsx(Tabs.Content, { value: "previous", children: _jsx(TournamentTable, { winnersCount: Number(tournament.winnersCount), rewardSettings: tournament.rewardSettings, leaderboard: tournament.currentLeaderboard
36
+ .edges }) })] }) }), _jsx("div", { className: "w-full", children: Boolean(filteredGameProviders.length) && (_jsx(TournamentsListItemGameProviders, { gameProviders: filteredGameProviders })) })] }))] })] }));
37
+ }
@@ -0,0 +1,31 @@
1
+ export declare const HAPPY_BINGO_TOURNAMENT_VARIATIONS: {
2
+ background: string;
3
+ progressBg: string;
4
+ textColor: string;
5
+ poolBg: string;
6
+ multiplierColor: string;
7
+ multiplierBg: string;
8
+ topRankImgBorderColor: string;
9
+ topRankImgBg: string;
10
+ timeBorderColor: string;
11
+ timeEllipsesColor: string;
12
+ multiplierBadgeColor: string;
13
+ multiplierBadgeBorderColor: string;
14
+ darkMultiplierBadgeColor: string;
15
+ darkMultiplierBadgeBorderColor: string;
16
+ darkMultiplierBg: string;
17
+ bgImage: import("next/image").StaticImageData;
18
+ }[];
19
+ export declare const CRAZYWIN_TOURNAMENT_VARIATIONS: {
20
+ background: string;
21
+ progressBg: string;
22
+ textColor: string;
23
+ poolBg: string;
24
+ multiplierColor: string;
25
+ multiplierBg: string;
26
+ topRankImgBorderColor: string;
27
+ topRankImgBg: string;
28
+ timeBorderColor: string;
29
+ timeEllipsesColor: string;
30
+ bgImage: import("next/image").StaticImageData;
31
+ }[];
@@ -0,0 +1,106 @@
1
+ import tournaBgOne from '../../images/tournament-bg-1.webp';
2
+ import tournaBgTwo from '../../images/tournament-bg-2.webp';
3
+ import tournaBgThree from '../../images/tournament-bg-3.webp';
4
+ export const HAPPY_BINGO_TOURNAMENT_VARIATIONS = [
5
+ // Yellow
6
+ {
7
+ background: 'bg-[linear-gradient(241.67deg,#FFD238_1.19%,#FF7D02_100%)]',
8
+ progressBg: 'bg-[#CA8504]',
9
+ textColor: 'text-[#713B12]',
10
+ poolBg: 'bg-[linear-gradient(180deg,#FFDE21_0%,#FFD012_47%,#FFBF00_100%)]',
11
+ multiplierColor: 'text-[#713B12]',
12
+ multiplierBg: 'bg-[linear-gradient(241.67deg,#FFD238_1.19%,#FF7D02_100%)]',
13
+ topRankImgBorderColor: 'bg-[linear-gradient(180deg,#FFDE21_28.33%,#FFBF00_57.84%,#FF9442_100%)]',
14
+ topRankImgBg: 'bg-[#FFD238]',
15
+ timeBorderColor: 'border-[#ffe74d]',
16
+ timeEllipsesColor: 'bg-[#A15C07]',
17
+ multiplierBadgeColor: 'text-[#B54708]',
18
+ multiplierBadgeBorderColor: 'border-[#FEDF89]',
19
+ darkMultiplierBadgeColor: 'dark:text-[#FEC84B]',
20
+ darkMultiplierBadgeBorderColor: 'dark:border-[#93370D]',
21
+ darkMultiplierBg: 'dark:bg-[#4E1D09]',
22
+ bgImage: tournaBgTwo,
23
+ },
24
+ // Blue
25
+ {
26
+ background: 'bg-[linear-gradient(241.67deg,#01C1FA_1.19%,#015EEA_100%)]',
27
+ progressBg: 'bg-[#01C4FB]',
28
+ textColor: 'text-[#344054]',
29
+ poolBg: 'bg-[linear-gradient(180deg,_#89F7FE_0%,_#66A6FF_100%)]',
30
+ multiplierBg: 'bg-[linear-gradient(241.67deg,_#01C1FA_1.19%,_#015EEA_100%)]',
31
+ multiplierColor: 'text-[#fff]',
32
+ topRankImgBorderColor: 'bg-[linear-gradient(180deg,_#89F7FE_0%,_#66A6FF_100%)]',
33
+ topRankImgBg: 'bg-[#01C1FA]',
34
+ timeBorderColor: 'border-[#85baff]',
35
+ timeEllipsesColor: 'bg-white',
36
+ multiplierBadgeColor: 'text-[#175CD3]',
37
+ multiplierBadgeBorderColor: 'border-[#B2DDFF]',
38
+ darkMultiplierBadgeColor: 'dark:text-[#84CAFF]',
39
+ darkMultiplierBadgeBorderColor: 'dark:border-[#1849A9]',
40
+ darkMultiplierBg: 'dark:bg-[#102A56]',
41
+ bgImage: tournaBgOne,
42
+ },
43
+ // Purple
44
+ {
45
+ background: 'bg-[linear-gradient(45deg,#4300B1_0%,#A531DC_100%)]',
46
+ progressBg: 'bg-[#B485FF]',
47
+ textColor: 'text-[#fff]',
48
+ poolBg: 'bg-[linear-gradient(180deg,#9E77ED_0%,#8057D9_100%)]',
49
+ multiplierBg: 'bg-[linear-gradient(45deg,_#4300B1_0%,_#A531DC_100%)]',
50
+ multiplierColor: 'text-[#fff]',
51
+ topRankImgBorderColor: 'bg-[linear-gradient(180deg,#9E77ED_0%,#8057D9_100%)]',
52
+ topRankImgBg: 'bg-[#5E0DBD]',
53
+ timeBorderColor: 'border-[#9879e0]',
54
+ timeEllipsesColor: 'bg-white',
55
+ multiplierBadgeColor: 'text-[#6941C6]',
56
+ multiplierBadgeBorderColor: 'border-[#E9D7FE]',
57
+ darkMultiplierBadgeColor: 'dark:text-[#D6BBFB]',
58
+ darkMultiplierBadgeBorderColor: 'dark:border-[#53389E]',
59
+ darkMultiplierBg: 'dark:bg-[#2C1C5F]',
60
+ bgImage: tournaBgThree,
61
+ },
62
+ ];
63
+ export const CRAZYWIN_TOURNAMENT_VARIATIONS = [
64
+ // Green
65
+ {
66
+ background: 'bg-[linear-gradient(241.67deg,#1A534C_1.19%,#051B29_100%)]',
67
+ progressBg: 'bg-[#073333]',
68
+ textColor: 'text-[#09232E]',
69
+ poolBg: 'bg-[linear-gradient(6.3deg,#215B5F_4.86%,#88FFD7_119.22%)]',
70
+ multiplierColor: 'text-[#fff]',
71
+ multiplierBg: 'bg-[linear-gradient(241.67deg,#1A534C_1.19%,#051B29_100%)]',
72
+ topRankImgBorderColor: 'bg-[linear-gradient(6.3deg,#215B5F_4.86%,#88FFD7_119.22%)]',
73
+ topRankImgBg: 'bg-[linear-gradient(241.67deg,#1A534C_1.19%,#051B29_100%)]',
74
+ timeBorderColor: 'border-[#4e7c80]',
75
+ timeEllipsesColor: 'bg-[#09232E]',
76
+ bgImage: tournaBgTwo,
77
+ },
78
+ // Purple
79
+ {
80
+ background: 'bg-[linear-gradient(241.67deg,#1C1D83_1.19%,#31033F_100%)]',
81
+ progressBg: 'bg-[#301059]',
82
+ textColor: 'text-[#fff]',
83
+ poolBg: 'bg-[linear-gradient(180deg,#7442D9_0%,#451C7D_100%)]',
84
+ multiplierBg: 'bg-[linear-gradient(241.67deg,#1C1D83_1.19%,#31033F_100%)]',
85
+ multiplierColor: 'text-[#fff]',
86
+ topRankImgBorderColor: 'bg-[linear-gradient(180deg,_#9E77ED_0%,#8057D9_100%)]',
87
+ topRankImgBg: 'bg-[linear-gradient(241.67deg,#1C1D83_1.19%,#31033F_100%)]',
88
+ timeBorderColor: 'border-[#6b4b99]',
89
+ timeEllipsesColor: 'bg-white',
90
+ bgImage: tournaBgThree,
91
+ },
92
+ // Red
93
+ {
94
+ background: 'bg-[linear-gradient(241.67deg,#F86246_1.19%,#5B0A26_100%)]',
95
+ progressBg: 'bg-[#A63D40]',
96
+ textColor: 'text-[#fff]',
97
+ poolBg: 'bg-[linear-gradient(180deg,_#D05C58_0%,_#75222E_100%)]',
98
+ multiplierBg: 'bg-[linear-gradient(241.67deg,#F86246_1.19%,#5B0A26_100%)]',
99
+ multiplierColor: 'text-[#fff]',
100
+ topRankImgBorderColor: 'bg-[linear-gradient(180deg,#D05C58_0%,#75222E_100%)]',
101
+ topRankImgBg: 'bg-[linear-gradient(241.67deg,#F86246_1.19%,#5B0A26_100%)]',
102
+ timeBorderColor: 'border-[#914e59]',
103
+ timeEllipsesColor: 'bg-white',
104
+ bgImage: tournaBgOne,
105
+ },
106
+ ];
@@ -0,0 +1,25 @@
1
+ import { type CSSProperties, type RefObject } from 'react';
2
+ import { type ValidateFileError } from '../../utils/validateFile';
3
+ export interface IdDocumentFieldProps extends UseIdDocumentFieldProps {
4
+ ref?: RefObject<HTMLDivElement | null>;
5
+ id?: string;
6
+ style?: CSSProperties;
7
+ className?: string;
8
+ invalid?: boolean;
9
+ readOnly?: boolean;
10
+ disabled?: boolean;
11
+ required?: boolean;
12
+ onError?: (error: ValidateFileError) => void;
13
+ }
14
+ export declare function IdDocumentField__client(props: IdDocumentFieldProps): import("react/jsx-runtime").JSX.Element;
15
+ /**
16
+ * -------------------------------------
17
+ * Context
18
+ * -------------------------------------
19
+ */
20
+ interface UseIdDocumentFieldProps {
21
+ value?: string;
22
+ onChange?: (value: string) => void;
23
+ defaultValue?: string;
24
+ }
25
+ export {};
@@ -0,0 +1,204 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useFieldContext } from '@ark-ui/react';
3
+ import Image from 'next/image';
4
+ import { useEffect, useId, useRef, useState, } from 'react';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import { useMediaQuery } from 'usehooks-ts';
7
+ import { useCamera } from '../../client/hooks/useCamera.js';
8
+ import { useControllableState } from '../../client/hooks/useControllableState.js';
9
+ import { useDisclosure } from '../../client/hooks/useDisclosure.js';
10
+ import { useFileQuery } from '../../client/hooks/useFileQuery.js';
11
+ import { useUploadImageFileMutation } from '../../client/hooks/useUploadImageFileMutation.js';
12
+ import { createContext } from '../../client/utils/createContext.js';
13
+ import { toaster } from '../../client/utils/toaster.js';
14
+ import { Camera01Icon } from '../../icons/Camera01Icon.js';
15
+ import { CameraOffIcon } from '../../icons/CameraOffIcon.js';
16
+ import { CheckCircleIcon } from '../../icons/CheckCircleIcon.js';
17
+ import { RefreshCcw01Icon } from '../../icons/RefreshCcw01Icon.js';
18
+ import { Spinner02Icon } from '../../icons/Spinner02Icon.js';
19
+ import { UploadCloud02Icon } from '../../icons/UploadCloud02Icon.js';
20
+ import { XIcon } from '../../icons/XIcon.js';
21
+ import { Button } from '../../ui/Button/index.js';
22
+ import { Dialog } from '../../ui/Dialog/index.js';
23
+ import { Portal } from '../../ui/Portal/index.js';
24
+ import { validateFile } from '../../utils/validateFile.js';
25
+ export function IdDocumentField__client(props) {
26
+ const context = useIdDocumentField(props);
27
+ return (_jsxs(IdDocumentFieldProvider, { value: context, children: [_jsxs("div", { ref: props.ref, id: props.id, style: props.style, className: twMerge('border-border-primary bg-bg-primary group relative aspect-[352/180] w-full shrink-0 rounded-xl border p-xl', props.className), onDragOver: (e) => e.preventDefault(), onDragEnter: (e) => e.preventDefault(), onDragLeave: (e) => e.preventDefault(), onDrop: (e) => {
28
+ e.preventDefault();
29
+ const file = e.dataTransfer.files?.[0];
30
+ if (!file)
31
+ return;
32
+ const error = validateFile(file);
33
+ if (error)
34
+ return props.onError?.(error);
35
+ context.mutation.mutate({ file });
36
+ }, "aria-describedby": context.field?.ariaDescribedby, children: [_jsx("input", { id: context.field?.ids?.control, ref: context.inputRef, type: "file", accept: "image/png, image/jpeg", onChange: (e) => {
37
+ const file = e.target.files?.[0];
38
+ if (!file)
39
+ return;
40
+ const error = validateFile(file);
41
+ if (error)
42
+ return props.onError?.(error);
43
+ context.mutation.mutate({ file });
44
+ }, disabled: context.field?.disabled ||
45
+ context.query.isLoading ||
46
+ context.mutation.isPending ||
47
+ props.disabled, readOnly: context.field?.readOnly || props.readOnly, required: context.field?.required || props.required, className: "sr-only" }), !context.query.data?.url && (_jsxs("div", { className: "flex size-full flex-col justify-center", children: [_jsx("div", { className: "border-border-primary shadow-xs mx-auto flex size-8 items-center justify-center rounded-sm border", children: _jsx(UploadCloud02Icon, { className: "text-text-placeholder-subtle size-4" }) }), _jsxs("h2", { className: "text-text-tertiary-600 mt-lg", children: [_jsxs("span", { className: "block text-center text-sm", children: [_jsx("button", { type: "button", onClick: () => {
48
+ context.inputRef.current?.click();
49
+ }, disabled: context.field?.disabled ||
50
+ context.field?.readOnly ||
51
+ context.query.isLoading ||
52
+ context.mutation.isPending ||
53
+ props.disabled ||
54
+ props.readOnly, className: "text-button-secondary-fg font-semibold disabled:opacity-60", children: "Click to upload" }), ' ', "or drag and drop"] }), _jsx("span", { className: "mt-xs block text-center text-xs", children: "PNG, JPG or JPEG (max. 10mb)" }), _jsx("span", { className: "m-txs block text-center text-xs", children: "or" })] }), _jsx(Button, { size: "sm", variant: "outline", className: "mx-auto mt-md w-auto", onClick: () => {
55
+ context.disclosure.setOpen(true);
56
+ }, disabled: context.field?.disabled ||
57
+ context.field?.readOnly ||
58
+ context.query.isLoading ||
59
+ context.mutation.isPending ||
60
+ props.disabled ||
61
+ props.readOnly, children: "Take a photo" })] })), context.query.data?.url && (_jsxs("div", { className: "relative", children: [_jsx(Image, { src: context.query.data.url, alt: "", width: 600, height: 378.08, unoptimized: true, className: "h-auto w-full rounded-md" }), _jsx("button", { type: "button", className: "backdrop-blur-xs absolute right-2 top-2 rounded-full bg-white/10 p-1", onClick: () => {
62
+ context.setValue('');
63
+ }, children: _jsx(XIcon, { className: "size-5" }) })] }))] }), _jsx(Camera, {})] }));
64
+ }
65
+ /**
66
+ * -------------------------------------
67
+ * Camera
68
+ * -------------------------------------
69
+ */
70
+ function Camera() {
71
+ const context = useIdDocumentFieldContext();
72
+ return (_jsx(Dialog.Root, { open: context.disclosure.open, onOpenChange: (details) => {
73
+ context.disclosure.setOpen(details.open);
74
+ }, closeOnEscape: false, closeOnInteractOutside: false, onExitComplete: context.camera.close, 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 overflow-y-auto py-4", children: _jsxs(Dialog.Content, { className: "bg-bg-primary-alt mx-auto w-[calc(100dvw-1rem)] max-w-[calc(100dvw-1rem)] overflow-y-auto rounded-lg px-4 py-5 lg:w-[747px] lg:max-w-[747px] lg:px-3xl lg:py-4xl", children: [_jsx(Dialog.CloseTrigger, { children: _jsx(XIcon, {}) }), _jsx(Dialog.Title, { className: "text-center font-semibold lg:text-xl", children: "Take a Picture of Your Front ID" }), _jsxs(Dialog.Description, { className: "text-text-tertiary-600 mt-md text-center text-xs lg:text-base", children: ["Make sure your ID is clearly visible, well-lit, and not blurry.", ' ', _jsx("br", { className: "hidden lg:block" }), "Avoid glare or reflections, and ensure all corners are within\u00A0the\u00A0frame."] }), _jsxs("div", { className: "relative mt-5 lg:mt-10 lg:px-3xl", children: [_jsx(Video, {}), context.camera.error && (_jsxs("div", { className: "border-border-disabled flex aspect-[4/3] flex-col items-center justify-center rounded-md border bg-black px-4 lg:aspect-video", children: [_jsx(CameraOffIcon, { className: "text-text-placeholder-subtle size-10 text-center lg:size-12" }), _jsx("h2", { className: "mt-3 text-sm font-semibold lg:mt-4 lg:text-base", children: context.camera.error.name }), _jsx("p", { className: "text-text-tertiary-600 mt-0.5 text-center text-xs lg:mt-1 lg:text-sm", children: context.camera.error.message }), _jsx(Button, { size: "xs", variant: "outline", colorScheme: "gray", fullWidth: false, className: "mt-4 lg:mt-5", onClick: () => {
75
+ context.camera.reopen();
76
+ }, children: "Try again" })] })), context.camera.loading && (_jsx("div", { className: "border-border-disabled flex aspect-[4/3] flex-col items-center justify-center rounded-md border bg-black px-4 lg:aspect-video", children: _jsx(Spinner02Icon, { className: "text-text-placeholder size-8" }) })), context.camera.data && (_jsx("div", { className: "border-border-disabled aspect-[4/3] w-full overflow-hidden rounded-md border bg-black lg:aspect-video", children: _jsx(Image, { src: context.camera.data.url, alt: "", width: 600, height: 378.08, unoptimized: true, className: "mx-auto mt-2 block h-[calc(100%-1rem)] w-auto" }) }))] }), !context.camera.data && (_jsx("div", { className: "mt-5 lg:mt-10", children: _jsxs(Button, { className: "disabled:bg-bg-disabled disabled:text-text-disabled mx-auto w-full px-xl py-lg lg:w-[10rem]", onClick: () => {
77
+ context.camera.snap({
78
+ crop: context.guideRef.current?.getBoundingClientRect(),
79
+ });
80
+ }, disabled: context.camera.snapping ||
81
+ context.camera.loading ||
82
+ !!context.camera.error, children: [context.camera.snapping ? (_jsx(Spinner02Icon, { className: "size-5" })) : (_jsx(Camera01Icon, { className: "size-5" })), "Capture"] }) })), context.camera.data && (_jsxs("div", { className: "mt-5 flex gap-3 lg:mt-10 lg:justify-center", children: [_jsxs(Button, { onClick: () => {
83
+ const file = context.camera.data?.file;
84
+ if (!file)
85
+ return;
86
+ context.mutation.mutate({ file });
87
+ context.disclosure.setOpen(false);
88
+ }, className: "w-full lg:w-[10rem]", children: [_jsx(CheckCircleIcon, { className: "size-5" }), "Use Photo"] }), _jsxs(Button, { variant: "outline", colorScheme: "gray", onClick: () => {
89
+ context.camera.reset();
90
+ }, className: "w-full lg:w-[10rem]", children: [_jsx(RefreshCcw01Icon, { className: "size-5" }), " Retake"] })] }))] }) })] }) }));
91
+ }
92
+ /**
93
+ * -------------------------------------
94
+ * Video
95
+ * -------------------------------------
96
+ */
97
+ function Video() {
98
+ const id = useId();
99
+ const context = useIdDocumentFieldContext();
100
+ const [maskBox, setMaskBox] = useState({
101
+ x: 0,
102
+ y: 0,
103
+ width: 0,
104
+ height: 0,
105
+ });
106
+ useEffect(() => {
107
+ const update = () => {
108
+ const guide = context.guideRef.current;
109
+ const mask = context.maskRef.current;
110
+ if (!guide || !mask)
111
+ return;
112
+ const guideRect = guide.getBoundingClientRect();
113
+ const maskRect = mask.getBoundingClientRect();
114
+ const x = guideRect.left - maskRect.left;
115
+ const y = guideRect.top - maskRect.top;
116
+ const width = guideRect.width;
117
+ const height = guideRect.height;
118
+ if (width && height) {
119
+ setMaskBox({
120
+ x,
121
+ y,
122
+ width,
123
+ height,
124
+ });
125
+ }
126
+ };
127
+ const observer = new ResizeObserver(update);
128
+ if (context.guideRef.current)
129
+ observer.observe(context.guideRef.current);
130
+ if (context.maskRef.current)
131
+ observer.observe(context.maskRef.current);
132
+ requestAnimationFrame(update);
133
+ return () => observer.disconnect();
134
+ }, [context.guideRef, context.maskRef]);
135
+ return (_jsxs("div", { className: twMerge('relative h-auto w-full overflow-hidden', !context.camera.data && !context.camera.error && !context.camera.loading
136
+ ? 'block'
137
+ : 'hidden'), children: [_jsx("video", { ...context.camera.videoProps }), _jsx("svg", { className: "pointer-events-none absolute -inset-4 size-[200%]", children: _jsx("defs", { children: _jsxs("mask", { id: id, maskUnits: "userSpaceOnUse", children: [_jsx("rect", { x: "0", y: "0", width: "200%", height: "200%", fill: "white" }), _jsx("rect", { x: maskBox.x, y: maskBox.y, width: maskBox.width, height: maskBox.height, fill: "black", rx: "8", ry: "8" })] }) }) }), _jsx("div", { ref: context.maskRef, className: "absolute -inset-4 size-[200%] bg-black/60 backdrop-blur-sm", style: {
138
+ mask: `url(#${id})`,
139
+ WebkitMask: `url(#${id})`,
140
+ maskRepeat: 'no-repeat',
141
+ WebkitMaskRepeat: 'no-repeat',
142
+ } }), _jsx("div", { ref: context.guideRef, className: "border-utility-warning-700 pointer-events-none absolute left-1/2 top-1/2 z-10 aspect-[85.6/53.98] w-[calc(100%-1rem)] max-w-[24.688rem] -translate-x-1/2 -translate-y-1/2 rounded-md border-2 border-dashed transition-all duration-200" })] }));
143
+ }
144
+ function useIdDocumentField(props) {
145
+ const field = useFieldContext();
146
+ const [value, setValue] = useControllableState({
147
+ value: props.value,
148
+ defaultValue: props.defaultValue ?? '',
149
+ onChange: props.onChange,
150
+ });
151
+ const query = useFileQuery(value, {
152
+ refetchInterval({ state }) {
153
+ return !state.data || state.data.status === 'UPLOADING' ? 1000 : false;
154
+ },
155
+ });
156
+ const mutation = useUploadImageFileMutation({
157
+ onSuccess(id) {
158
+ setValue(id);
159
+ },
160
+ onMutate() {
161
+ setValue('');
162
+ },
163
+ onError(error) {
164
+ toaster.error({
165
+ title: 'Upload Failed',
166
+ description: error.message,
167
+ });
168
+ },
169
+ onSettled() {
170
+ if (inputRef.current) {
171
+ inputRef.current.value = '';
172
+ }
173
+ },
174
+ });
175
+ const inputRef = useRef(null);
176
+ const maskRef = useRef(null);
177
+ const guideRef = useRef(null);
178
+ const desktop = useMediaQuery('(min-width: 1024px)');
179
+ const camera = useCamera({
180
+ video: {
181
+ facingMode: desktop ? 'user' : 'environment',
182
+ },
183
+ });
184
+ const disclosure = useDisclosure({
185
+ onOpenChange(open) {
186
+ if (open) {
187
+ camera.open();
188
+ }
189
+ },
190
+ });
191
+ return {
192
+ field,
193
+ value,
194
+ setValue,
195
+ query,
196
+ mutation,
197
+ camera,
198
+ disclosure,
199
+ inputRef,
200
+ guideRef,
201
+ maskRef,
202
+ };
203
+ }
204
+ const [IdDocumentFieldProvider, useIdDocumentFieldContext] = createContext();
@@ -0,0 +1,2 @@
1
+ import type { IdDocumentFieldProps } from './IdDocumentField.client';
2
+ export declare function IdDocumentField(props: IdDocumentFieldProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,11 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import dynamic from 'next/dynamic';
4
+ import { Spinner02Icon } from '../../icons/Spinner02Icon.js';
5
+ const Component = dynamic(() => import('./IdDocumentField.client.js').then((mod) => mod.IdDocumentField__client), {
6
+ ssr: false,
7
+ loading: () => (_jsx("div", { className: "border-border-primary bg-bg-primary flex aspect-[352/180] w-full shrink-0 items-center justify-center rounded-xl border", children: _jsx(Spinner02Icon, { className: "text-text-quinary size-8" }) })),
8
+ });
9
+ export function IdDocumentField(props) {
10
+ return _jsx(Component, { ...props });
11
+ }
@@ -0,0 +1,20 @@
1
+ import { type CSSProperties, type RefObject } from 'react';
2
+ import { type ValidateFileError } from '../../utils/validateFile';
3
+ export interface SelfieFieldProps extends UseSelfieFieldProps {
4
+ ref?: RefObject<HTMLDivElement | null>;
5
+ id?: string;
6
+ style?: CSSProperties;
7
+ className?: string;
8
+ invalid?: boolean;
9
+ readOnly?: boolean;
10
+ disabled?: boolean;
11
+ required?: boolean;
12
+ onError?: (error: ValidateFileError<'FaceNotFoundError'>) => void;
13
+ }
14
+ export declare function SelfieField__client(props: SelfieFieldProps): import("react/jsx-runtime").JSX.Element;
15
+ interface UseSelfieFieldProps {
16
+ value?: string;
17
+ onChange?: (value: string) => void;
18
+ defaultValue?: string;
19
+ }
20
+ export {};