@opexa/portal-components 0.0.243 → 0.0.245

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 (130) hide show
  1. package/dist/client/hooks/useCamera.js +13 -4
  2. package/dist/client/hooks/useFeatureFlag.d.ts +2 -5
  3. package/dist/client/hooks/useFeatureFlag.js +29 -36
  4. package/dist/client/hooks/useInfiniteQueryHelper.js +1 -1
  5. package/dist/components/Account/Account.lazy.js +6 -3
  6. package/dist/components/AccountInfo/AccountInfo.js +1 -1
  7. package/dist/components/AccountVerification/AccountVerification.js +5 -2
  8. package/dist/components/Banner/Banner.js +2 -1
  9. package/dist/components/BetRecords/BetRecords.client.d.ts +4 -0
  10. package/dist/components/BetRecords/BetRecords.client.js +2 -2
  11. package/dist/components/Bonuses/Bonuses.client.js +13 -8
  12. package/dist/components/GameLaunch/GameLaunchTrigger.js +7 -0
  13. package/dist/components/GameProviders/GameProvidersCarousel.js +2 -2
  14. package/dist/components/Jackpots/JackpotsCarousel/JackpotsCarouselItem.module.css +184 -184
  15. package/dist/components/Jackpots/JackpotsList/JackpotsListItem.module.css +184 -184
  16. package/dist/components/KYC/utils.js +18 -18
  17. package/dist/components/PortalProvider/FeatureFlag.js +14 -6
  18. package/dist/components/Tournaments/TournamentsCarousel/TournamentsCarouselItem.module.css +184 -184
  19. package/dist/components/Tournaments/TournamentsList/TournamentItem.module.css +184 -184
  20. package/dist/components/TransactionRecords/WithdrawalRecordsTable.js +1 -1
  21. package/dist/components/shared/IdDocumentField.client.d.ts +25 -0
  22. package/dist/components/shared/IdDocumentField.client.js +204 -0
  23. package/dist/components/shared/IdDocumentField.d.ts +1 -24
  24. package/dist/components/shared/IdDocumentField.js +7 -201
  25. package/dist/components/shared/SelfieField.client.d.ts +20 -0
  26. package/dist/components/shared/SelfieField.client.js +327 -0
  27. package/dist/components/shared/SelfieField.d.ts +1 -20
  28. package/dist/components/shared/SelfieField.js +7 -315
  29. package/dist/services/queries.d.ts +1 -1
  30. package/dist/services/queries.js +2528 -2527
  31. package/dist/styles/theme.css +694 -694
  32. package/dist/types/index.d.ts +6 -0
  33. package/dist/ui/AlertDialog/AlertDialog.d.ts +88 -88
  34. package/dist/ui/AlertDialog/alertDialog.recipe.d.ts +8 -8
  35. package/dist/ui/Combobox/Combobox.d.ts +42 -42
  36. package/dist/ui/Combobox/combobox.recipe.d.ts +3 -3
  37. package/dist/ui/DatePicker/DatePicker.d.ts +72 -72
  38. package/dist/ui/DatePicker/datePicker.recipe.d.ts +3 -3
  39. package/dist/ui/Dialog/Dialog.d.ts +88 -88
  40. package/dist/ui/Dialog/dialog.recipe.d.ts +8 -8
  41. package/dist/ui/Drawer/Drawer.d.ts +33 -33
  42. package/dist/ui/Drawer/drawer.recipe.d.ts +3 -3
  43. package/dist/ui/Field/Field.d.ts +21 -21
  44. package/dist/ui/Field/field.recipe.d.ts +3 -3
  45. package/dist/ui/Popover/Popover.d.ts +55 -55
  46. package/dist/ui/Popover/popover.recipe.d.ts +5 -5
  47. package/dist/ui/Select/Select.d.ts +45 -45
  48. package/dist/ui/Select/select.recipe.d.ts +3 -3
  49. package/dist/utils/gamesAvailable3pmTo3am.d.ts +1 -0
  50. package/dist/utils/gamesAvailable3pmTo3am.js +1 -0
  51. package/dist/utils/getGameImageUrl.js +4 -6
  52. package/dist/utils/isBetween3amAnd3pm.d.ts +1 -0
  53. package/dist/utils/isBetween3amAnd3pm.js +5 -0
  54. package/package.json +165 -165
  55. package/dist/components/FeatureFlag/FeatureFlag.d.ts +0 -1
  56. package/dist/components/FeatureFlag/FeatureFlag.js +0 -29
  57. package/dist/components/FeatureFlag/index.d.ts +0 -1
  58. package/dist/components/FeatureFlag/index.js +0 -1
  59. package/dist/components/KYC/AutoOpen.d.ts +0 -1
  60. package/dist/components/KYC/AutoOpen.js +0 -40
  61. package/dist/components/KYC/backup/Header.d.ts +0 -1
  62. package/dist/components/KYC/backup/Header.js +0 -8
  63. package/dist/components/KYC/backup/Indicator.d.ts +0 -1
  64. package/dist/components/KYC/backup/Indicator.js +0 -9
  65. package/dist/components/KYC/backup/KYC.d.ts +0 -1
  66. package/dist/components/KYC/backup/KYC.js +0 -14
  67. package/dist/components/KYC/backup/KYC.lazy.d.ts +0 -1
  68. package/dist/components/KYC/backup/KYC.lazy.js +0 -26
  69. package/dist/components/KYC/backup/KYCContext.d.ts +0 -6
  70. package/dist/components/KYC/backup/KYCContext.js +0 -2
  71. package/dist/components/KYC/backup/Step1.d.ts +0 -1
  72. package/dist/components/KYC/backup/Step1.js +0 -13
  73. package/dist/components/KYC/backup/Step2.d.ts +0 -1
  74. package/dist/components/KYC/backup/Step2.js +0 -13
  75. package/dist/components/KYC/backup/Step3.d.ts +0 -1
  76. package/dist/components/KYC/backup/Step3.js +0 -13
  77. package/dist/components/KYC/backup/Step4.d.ts +0 -1
  78. package/dist/components/KYC/backup/Step4.js +0 -7
  79. package/dist/components/KYC/backup/useKYC.d.ts +0 -10
  80. package/dist/components/KYC/backup/useKYC.js +0 -8
  81. package/dist/components/KYC/loadModels.d.ts +0 -1
  82. package/dist/components/KYC/loadModels.js +0 -9
  83. package/dist/components/Messages/Message.d.ts +0 -1
  84. package/dist/components/Messages/Message.js +0 -35
  85. package/dist/components/Messages/MessageContext.d.ts +0 -6
  86. package/dist/components/Messages/MessageContext.js +0 -2
  87. package/dist/components/Messages/MessagePopup.d.ts +0 -1
  88. package/dist/components/Messages/MessagePopup.js +0 -20
  89. package/dist/components/Messages/MessageTrigger.d.ts +0 -8
  90. package/dist/components/Messages/MessageTrigger.js +0 -19
  91. package/dist/components/Quests/CountdownTimer.d.ts +0 -15
  92. package/dist/components/Quests/CountdownTimer.js +0 -33
  93. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuest.d.ts +0 -4
  94. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuest.js +0 -78
  95. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuestModal.d.ts +0 -8
  96. package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuestModal.js +0 -9
  97. package/dist/components/Quests/OnboardingQuest/OnboardingQuest.d.ts +0 -4
  98. package/dist/components/Quests/OnboardingQuest/OnboardingQuest.js +0 -4
  99. package/dist/components/Quests/WageringQuest/WageringQuest.d.ts +0 -4
  100. package/dist/components/Quests/WageringQuest/WageringQuest.js +0 -20
  101. package/dist/components/Quests/WageringQuest/WageringQuestModal.d.ts +0 -9
  102. package/dist/components/Quests/WageringQuest/WageringQuestModal.js +0 -9
  103. package/dist/components/SignUp/SignUp.lazy.d.ts +0 -12
  104. package/dist/components/SignUp/SignUp.lazy.js +0 -18
  105. package/dist/components/SignUp/SignUpContext.d.ts +0 -6
  106. package/dist/components/SignUp/SignUpContext.js +0 -2
  107. package/dist/components/SignUp/SignUpForm.d.ts +0 -1
  108. package/dist/components/SignUp/SignUpForm.js +0 -284
  109. package/dist/components/SignUp/SignUpPagcor/CaptureIdDocument.d.ts +0 -1
  110. package/dist/components/SignUp/SignUpPagcor/CaptureIdDocument.js +0 -198
  111. package/dist/components/SignUp/SignUpPagcor/CaptureSelfie.d.ts +0 -1
  112. package/dist/components/SignUp/SignUpPagcor/CaptureSelfie.js +0 -251
  113. package/dist/components/SignUp/SignUpPagcor/ImageUploader.d.ts +0 -10
  114. package/dist/components/SignUp/SignUpPagcor/ImageUploader.js +0 -41
  115. package/dist/components/SignUp/SignUpPagcor/SignUpFormPagcor.d.ts +0 -1
  116. package/dist/components/SignUp/SignUpPagcor/SignUpFormPagcor.js +0 -429
  117. package/dist/components/SignUp/SignUpPagcor/SignUpPagcor.lazy.d.ts +0 -13
  118. package/dist/components/SignUp/SignUpPagcor/SignUpPagcor.lazy.js +0 -26
  119. package/dist/components/SignUp/SignUpPagcor/SignUpPagcorContext.d.ts +0 -7
  120. package/dist/components/SignUp/SignUpPagcor/SignUpPagcorContext.js +0 -2
  121. package/dist/components/SignUp/SignUpPagcor/useImageUploader.d.ts +0 -11
  122. package/dist/components/SignUp/SignUpPagcor/useImageUploader.js +0 -20
  123. package/dist/constants/BranchCode.d.ts +0 -4
  124. package/dist/constants/BranchCode.js +0 -42
  125. package/dist/icons/BellRingIcon.d.ts +0 -2
  126. package/dist/icons/BellRingIcon.js +0 -4
  127. package/dist/utils/dataUrlToBlob.d.ts +0 -1
  128. package/dist/utils/dataUrlToBlob.js +0 -11
  129. package/dist/utils/resizeImageSize.d.ts +0 -2
  130. package/dist/utils/resizeImageSize.js +0 -11
@@ -1,11 +1,11 @@
1
1
  import { isBoolean, isFunction, isObject } from 'lodash-es';
2
- import { useCallback, useMemo, useRef, useState, } from 'react';
2
+ import { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
3
3
  import invariant from 'tiny-invariant';
4
4
  import { useMediaQuery } from 'usehooks-ts';
5
5
  export function useCamera(options = {}) {
6
6
  const { transform, validate, ...constraints } = options;
7
7
  const videoRef = useRef(null);
8
- const stream = useRef(null);
8
+ const streamRef = useRef(null);
9
9
  const [data, setData] = useState(null);
10
10
  const [error, setError] = useState(null);
11
11
  const [loading, setLoading] = useState(false);
@@ -51,7 +51,7 @@ export function useCamera(options = {}) {
51
51
  },
52
52
  });
53
53
  node.srcObject = result;
54
- stream.current = result;
54
+ streamRef.current = result;
55
55
  setMirror(!isObject(constraints.video)
56
56
  ? true
57
57
  : constraints.video.facingMode === 'environment'
@@ -92,7 +92,7 @@ export function useCamera(options = {}) {
92
92
  setLoading(false);
93
93
  setSnapping(false);
94
94
  return new Promise((resolve) => {
95
- stream.current?.getTracks().forEach((track) => track.stop());
95
+ streamRef.current?.getTracks().forEach((track) => track.stop());
96
96
  videoRef.current?.pause();
97
97
  resolve();
98
98
  });
@@ -218,8 +218,17 @@ export function useCamera(options = {}) {
218
218
  boxSizing: 'border-box',
219
219
  background: 'transparent',
220
220
  transform: mirror ? 'scaleX(-1)' : 'none',
221
+ pointerEvents: 'none',
221
222
  },
222
223
  }), [mirror]);
224
+ useEffect(() => {
225
+ return () => {
226
+ setData(null);
227
+ setError(null);
228
+ setLoading(false);
229
+ setSnapping(false);
230
+ };
231
+ }, []);
223
232
  return {
224
233
  snap,
225
234
  open,
@@ -4,12 +4,9 @@ export interface UseFeatureFlagReturn {
4
4
  disable(): Promise<void>;
5
5
  }
6
6
  export declare function useFeatureFlag(): UseFeatureFlagReturn;
7
- interface FeatureFlagEventDetail {
8
- enabled: boolean;
9
- }
10
- type FeatureFlagEvent = CustomEvent<FeatureFlagEventDetail>;
11
7
  interface EventsMap {
12
- 'web-portal::feature-flag': FeatureFlagEvent;
8
+ 'web-portal::feature-flag-enabled': CustomEvent;
9
+ 'web-portal::feature-flag-disabled': CustomEvent;
13
10
  }
14
11
  type Listener<K extends keyof EventsMap> = (this: Window, event: EventsMap[K]) => void;
15
12
  declare global {
@@ -1,52 +1,37 @@
1
- 'use client';
2
- import { useEffect, useState } from 'react';
1
+ import { useCallback, useEffect, useState } from 'react';
3
2
  import { FEATURE_FLAG_LOCAL_STORAGE_KEY } from '../../constants/index.js';
4
- const event = new CustomEvent('web-portal::feature-flag', {
5
- detail: {
6
- enabled: false,
7
- },
8
- bubbles: true,
9
- cancelable: false,
10
- });
11
3
  export function useFeatureFlag() {
12
4
  const [enabled, setEnabled] = useState(false);
13
- function enable() {
5
+ const enable = useCallback(() => {
14
6
  return new Promise((resolve) => {
15
- const event = new CustomEvent('web-portal::feature-flag', {
16
- detail: {
17
- enabled: true,
18
- },
19
- bubbles: true,
20
- cancelable: false,
21
- });
22
- window.dispatchEvent(event);
7
+ localStorage.setItem(FEATURE_FLAG_LOCAL_STORAGE_KEY, '');
8
+ window.dispatchEvent(FEATURE_FLAG_ENABLED_EVENT);
23
9
  resolve();
24
10
  });
25
- }
26
- function disable() {
11
+ }, []);
12
+ const disable = useCallback(() => {
27
13
  return new Promise((resolve) => {
28
- window.dispatchEvent(event);
14
+ localStorage.removeItem(FEATURE_FLAG_LOCAL_STORAGE_KEY);
15
+ window.dispatchEvent(FEATURE_FLAG_DISABLED_EVENT);
29
16
  resolve();
30
17
  });
31
- }
18
+ }, []);
32
19
  useEffect(() => {
33
- if (localStorage.getItem(FEATURE_FLAG_LOCAL_STORAGE_KEY) != null) {
34
- setEnabled(true);
35
- }
20
+ setEnabled(localStorage.getItem(FEATURE_FLAG_LOCAL_STORAGE_KEY) != null);
36
21
  }, []);
37
22
  useEffect(() => {
38
- const handle = (event) => {
39
- if (event.detail.enabled) {
40
- setEnabled(true);
41
- localStorage.setItem(FEATURE_FLAG_LOCAL_STORAGE_KEY, '');
42
- }
43
- else {
44
- setEnabled(false);
45
- localStorage.removeItem(FEATURE_FLAG_LOCAL_STORAGE_KEY);
46
- }
23
+ function handleEnabled() {
24
+ setEnabled(true);
25
+ }
26
+ function handleDisabled() {
27
+ setEnabled(false);
28
+ }
29
+ window.addEventListener('web-portal::feature-flag-enabled', handleEnabled);
30
+ window.addEventListener('web-portal::feature-flag-disabled', handleDisabled);
31
+ return () => {
32
+ window.removeEventListener('web-portal::feature-flag-enabled', handleEnabled);
33
+ window.removeEventListener('web-portal::feature-flag-disabled', handleDisabled);
47
34
  };
48
- window.addEventListener('web-portal::feature-flag', handle);
49
- return () => window.removeEventListener('web-portal::feature-flag', handle);
50
35
  }, []);
51
36
  return {
52
37
  enabled,
@@ -54,3 +39,11 @@ export function useFeatureFlag() {
54
39
  disable,
55
40
  };
56
41
  }
42
+ const FEATURE_FLAG_DISABLED_EVENT = new CustomEvent('web-portal::feature-flag-disabled', {
43
+ bubbles: true,
44
+ cancelable: false,
45
+ });
46
+ const FEATURE_FLAG_ENABLED_EVENT = new CustomEvent('web-portal::feature-flag-enabled', {
47
+ bubbles: true,
48
+ cancelable: false,
49
+ });
@@ -20,7 +20,7 @@ export function useInfiniteQueryHelper(useQuery, variables) {
20
20
  const rows = availablePages.at(page - 1) ?? [];
21
21
  const totalRows = query.data?.pages.at(-1)?.totalCount ?? 0;
22
22
  const totalPages = Math.ceil(totalRows / pageSize);
23
- const hasNextPage = query.data?.pages.at(-1)?.pageInfo.hasNextPage ?? false;
23
+ const hasNextPage = page < totalPages;
24
24
  const hasPrevPage = page > 1;
25
25
  const next = async () => {
26
26
  if (!hasNextPage) {
@@ -2,6 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import Image from 'next/image';
4
4
  import Link from 'next/link';
5
+ import { useRouter } from 'next/navigation';
5
6
  import { twMerge } from 'tailwind-merge';
6
7
  import { useShallow } from 'zustand/shallow';
7
8
  import { useAccountQuery } from '../../client/hooks/useAccountQuery.js';
@@ -45,6 +46,7 @@ const defaultAccountProps = {
45
46
  };
46
47
  const recipe = accountRecipe();
47
48
  export function Account(props) {
49
+ const router = useRouter();
48
50
  const globalStore = useGlobalStore(useShallow((ctx) => ({
49
51
  account: ctx.account,
50
52
  account__mobile: ctx.account__mobile,
@@ -57,14 +59,14 @@ export function Account(props) {
57
59
  }, lazyMount: true, unmountOnExit: true, children: _jsx(Portal, { children: _jsx(Drawer.Positioner, { children: _jsxs(Drawer.Content, { className: twMerge('relative', 'flex', 'flex-col', 'top-[var(--offset-top-mobile)]', 'h-[calc(100%-var(--offset-top-mobile))]', 'w-full', 'px-xl', 'py-6', 'lg:top-[var(--offset-top-desktop)]', 'lg:h-[calc(100%-var(--offset-top-desktop))]'), style: {
58
60
  ['--offset-top-mobile']: mobileOffsetTop,
59
61
  ['--offset-top-desktop']: desktopOffsetTop,
60
- }, children: [_jsx(Profile, {}), _jsx(Wallet, {}), _jsx(Links, {})] }) }) }) }), _jsx(Popover.Root, { open: globalStore.account.open, onOpenChange: (details) => {
62
+ }, children: [_jsx(Profile, {}), _jsx(Wallet, {}), _jsx(Links, { router: router })] }) }) }) }), _jsx(Popover.Root, { open: globalStore.account.open, onOpenChange: (details) => {
61
63
  globalStore.account.setOpen(details.open);
62
64
  }, lazyMount: true, unmountOnExit: true, positioning: {
63
65
  placement: 'bottom',
64
66
  strategy: 'fixed',
65
67
  }, ids: {
66
68
  trigger: 'opexa-portal-components:account-trigger',
67
- }, children: _jsx(Portal, { children: _jsx(Popover.Positioner, { children: _jsxs(Popover.Content, { className: "border-border-primary bg-bg-primary relative z-popover w-[23.438rem] overflow-hidden rounded-xl border p-xl ui-open:animate-fade-in ui-closed:animate-fade-out", children: [_jsx(Profile, {}), _jsx(Wallet, {}), _jsx(Links, {})] }) }) }) })] }));
69
+ }, children: _jsx(Portal, { children: _jsx(Popover.Positioner, { children: _jsxs(Popover.Content, { className: "border-border-primary bg-bg-primary relative z-popover w-[23.438rem] overflow-hidden rounded-xl border p-xl ui-open:animate-fade-in ui-closed:animate-fade-out", children: [_jsx(Profile, {}), _jsx(Wallet, {}), _jsx(Links, { router: router })] }) }) }) })] }));
68
70
  }
69
71
  function Profile() {
70
72
  const accountQuery = useAccountQuery();
@@ -105,7 +107,7 @@ function Wallet() {
105
107
  globalStore.mobileProfile.setOpen(false);
106
108
  }, children: "Deposit" })] })] }));
107
109
  }
108
- function Links() {
110
+ function Links({ router }) {
109
111
  const accountProps = useAccountPropsContext();
110
112
  const globalStore = useGlobalStore(useShallow((ctx) => ({
111
113
  account: ctx.account,
@@ -116,6 +118,7 @@ function Links() {
116
118
  onSuccess() {
117
119
  localStorage.clear();
118
120
  sessionStorage.clear();
121
+ router.replace('/');
119
122
  },
120
123
  });
121
124
  const unreadMessagesCountQuery = useUnreadMessagesCountQuery({}, { refetchInterval: 5000 });
@@ -87,7 +87,7 @@ function PersonalInfo() {
87
87
  ? data.birthDay
88
88
  : undefined,
89
89
  });
90
- }), children: [_jsxs("div", { className: "px-4 py-5 lg:px-3xl lg:py-5", children: [_jsxs(Field.Root, { invalid: !!form.formState.errors.realName, readOnly: !!account?.realName, children: [_jsx(Field.Label, { children: "Real name" }), _jsx(Field.Input, { ...form.register('realName') }), _jsx(Field.ErrorText, { children: form.formState.errors.realName?.message })] }), _jsxs(Field.Root, { className: "mt-6", invalid: !!form.formState.errors.birthDay, readOnly: !!account?.birthDay, children: [_jsx(Field.Label, { children: "Date of birth" }), _jsx(Field.Input, { type: "date", ...form.register('birthDay') }), _jsx(Field.ErrorText, { children: form.formState.errors.birthDay?.message })] })] }), form.formState.isDirty && (_jsxs("div", { className: "border-border-secondary flex justify-end gap-lg border-t px-xl py-lg lg:px-3xl lg:py-xl", children: [_jsx(Button, { size: "sm", variant: "outline", fullWidth: false, disabled: updateAccountMutation.isPending, onClick: () => form.reset(), children: "Cancel" }), _jsx(Button, { type: "submit", size: "sm", fullWidth: false, disabled: !form.formState.isValid || updateAccountMutation.isPending, children: "Save Changes" })] }))] })] }));
90
+ }), children: [_jsxs("div", { className: "px-4 py-5 lg:px-3xl lg:py-5", children: [_jsxs(Field.Root, { invalid: !!form.formState.errors.realName, readOnly: !!account?.realName, children: [_jsx(Field.Label, { children: "Full name" }), _jsx(Field.Input, { ...form.register('realName') }), _jsx(Field.ErrorText, { children: form.formState.errors.realName?.message })] }), _jsxs(Field.Root, { className: "mt-6", invalid: !!form.formState.errors.birthDay, readOnly: !!account?.birthDay, children: [_jsx(Field.Label, { children: "Date of birth" }), _jsx(Field.Input, { type: "date", ...form.register('birthDay') }), _jsx(Field.ErrorText, { children: form.formState.errors.birthDay?.message })] })] }), form.formState.isDirty && (_jsxs("div", { className: "border-border-secondary flex justify-end gap-lg border-t px-xl py-lg lg:px-3xl lg:py-xl", children: [_jsx(Button, { size: "sm", variant: "outline", fullWidth: false, disabled: updateAccountMutation.isPending, onClick: () => form.reset(), children: "Cancel" }), _jsx(Button, { type: "submit", size: "sm", fullWidth: false, disabled: !form.formState.isValid || updateAccountMutation.isPending, children: "Save Changes" })] }))] })] }));
91
91
  }
92
92
  function ContactInfo() {
93
93
  const localeInfo = useLocaleInfo();
@@ -13,6 +13,7 @@ import { FaceIdIcon } from '../../icons/FaceIdIcon.js';
13
13
  import { FileCheck02Icon } from '../../icons/FileCheck02Icon.js';
14
14
  import { FileSearch02Icon } from '../../icons/FileSearch02Icon.js';
15
15
  import { FileX02Icon } from '../../icons/FileX02Icon.js';
16
+ import { Spinner02Icon } from '../../icons/Spinner02Icon.js';
16
17
  import { Button } from '../../ui/Button/index.js';
17
18
  export function AccountVerification(props) {
18
19
  const globalStore = useGlobalStore(useShallow((ctx) => ({
@@ -28,8 +29,10 @@ export function AccountVerification(props) {
28
29
  const empty = verification == null;
29
30
  const pending = verification?.status === 'PENDING';
30
31
  const success = verification?.status === 'VERIFIED' || verification?.status === 'APPROVED';
31
- const failed = verification?.status === 'REJECTED' ||
32
- verification?.status === 'UNVERIFIED';
32
+ const failed = verification?.status === 'REJECTED';
33
+ if (verificationQuery.isLoading) {
34
+ return _jsx(Spinner02Icon, { className: "text-text-brand-primary-600 size-5" });
35
+ }
33
36
  return (_jsxs("div", { className: props.className, children: [_jsxs("div", { className: "flex items-start gap-8", children: [_jsxs("div", { className: "grow", children: [_jsx("h2", { className: "text-text-secondary-700 text-sm font-semibold", children: "Verify your identity" }), _jsx("p", { className: "text-text-tertiary-600 text-sm", children: "Complete personal verification to unlock all features and enhance account security." })] }), _jsx(ark.svg, { asChild: true, className: twMerge('size-6', profileCompletion?.accountVerification
34
37
  ? 'text-text-success-primary'
35
38
  : 'text-text-warning-primary'), children: profileCompletion?.accountVerification ? (_jsx(CheckVerified02Icon, {})) : (_jsx(AlertCircleIcon, {})) })] }), _jsxs("div", { className: "shadow-xs border-border-secondary bg-bg-primary-alt mt-5 rounded-xl border", children: [_jsx("div", { className: "px-4 py-5", children: _jsxs("ul", { className: "space-y-lg", children: [_jsxs("li", { className: "text-text-secondary-700 icon:size-6 icon:text-text-nav-item-button-icon flex items-center gap-lg", children: [_jsx(FileCheck02Icon, {}), "Basic Information"] }), _jsxs("li", { className: "text-text-secondary-700 icon:size-6 icon:text-text-nav-item-button-icon flex items-center gap-lg", children: [_jsx(CreditCard02Icon, {}), "Government ID"] }), _jsxs("li", { className: "text-text-secondary-700 icon:size-6 icon:text-text-nav-item-button-icon flex items-center gap-lg", children: [_jsx(FaceIdIcon, {}), "Facial Verification"] })] }) }), !isKycCompleted && (_jsx("div", { className: "border-border-secondary flex justify-end border-t px-4 py-3 lg:py-xl", children: _jsx(Button, { size: "sm", className: "w-full lg:w-fit", onClick: () => globalStore.kyc.setOpen(true), children: "Verify Now" }) }))] }), success && _jsx(VerificationSuccess, {}), pending && _jsx(VerificationInProgress, {}), failed && _jsx(VerificationFailed, {}), empty && _jsx(VerificationNotSubmitted, {})] }));
@@ -2,6 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import emblaCarouselAutoplay from 'embla-carousel-autoplay';
4
4
  import useEmblaCarousel, {} from 'embla-carousel-react';
5
+ import isMobile from 'is-mobile';
5
6
  import Image from 'next/image';
6
7
  import Link from 'next/link';
7
8
  import { Fragment, useEffect, useState } from 'react';
@@ -30,7 +31,7 @@ export function Banner(props) {
30
31
  };
31
32
  }, [emblaApi]);
32
33
  return (_jsxs("div", { className: twMerge('relative', props.className), children: [_jsx("div", { ref: emblaRef, className: "overflow-hidden", children: _jsx("div", { className: "flex gap-2", children: props.banners.map((banner, index) => {
33
- const img = (_jsx(Image, { src: banner.src, alt: "", width: 1200, height: 300, className: "block h-auto w-full rounded-xl", priority: index === 0 }));
34
+ const img = (_jsx(Image, { src: banner.src, alt: "", width: isMobile() ? 400 : 1200, height: isMobile() ? 225 : 300, className: "block h-auto w-full", priority: index === 0 }));
34
35
  return (_jsx(Fragment, { children: !banner.redirectUrl ? (_jsx("div", { className: "w-full shrink-0", children: img })) : (_jsx(Link, { href: banner.redirectUrl, className: "block w-full shrink-0", "aria-label": `Open ${banner.redirectUrl}`, children: img })) }, index));
35
36
  }) }) }), _jsx("div", { className: "absolute bottom-lg left-1/2 flex w-fit -translate-x-1/2 gap-2", children: props.banners.map((_, index) => (_jsx("button", { type: "button", className: "ui-active:bg-brand-500 bg-gray-300 size-3 shrink-0 rounded-full border border-white transition-all duration-300 ui-active:w-9", onClick: () => {
36
37
  emblaApi?.scrollTo(index);
@@ -16,5 +16,9 @@ export interface BetRecordsProps {
16
16
  */
17
17
  gameProvidersGroup?: Partial<Record<GameType, GameProvider[]>>;
18
18
  className?: string;
19
+ placeholder?: {
20
+ gameProvider?: string;
21
+ status?: string;
22
+ };
19
23
  }
20
24
  export declare function BetRecords__client(props: BetRecordsProps): import("react/jsx-runtime").JSX.Element;
@@ -137,7 +137,7 @@ export function BetRecords__client(props) {
137
137
  });
138
138
  }, lazyMount: true, deselectable: true, positioning: {
139
139
  sameWidth: true,
140
- }, children: [_jsxs(Select.Trigger, { className: "w-full lg:w-[14rem]", children: [_jsx(Select.ValueText, { placeholder: "Game Vendor" }), _jsx(Select.Context, { children: (api) => (_jsx(_Fragment, { children: api.value.length ? (_jsx(Select.ClearTrigger, { asChild: true, children: _jsx("span", { onClick: (e) => {
140
+ }, children: [_jsxs(Select.Trigger, { className: "w-full lg:w-[14rem]", children: [_jsx(Select.ValueText, { placeholder: props.placeholder?.gameProvider ?? 'Game Vendor' }), _jsx(Select.Context, { children: (api) => (_jsx(_Fragment, { children: api.value.length ? (_jsx(Select.ClearTrigger, { asChild: true, children: _jsx("span", { onClick: (e) => {
141
141
  e.stopPropagation();
142
142
  }, children: "Clear" }) })) : (_jsx(Select.Indicator, { asChild: true, children: _jsx(ChevronDownIcon, {}) })) })) })] }), _jsx(Portal, { children: _jsx(Select.Positioner, { children: _jsx(Select.Content, { children: _jsx(Select.ItemGroup, { children: providerCollection.items.map((provider) => (_jsxs(Select.Item, { item: provider, children: [_jsx(Select.ItemText, { children: provider.name }), _jsx(Select.ItemIndicator, { asChild: true, children: _jsx(CheckIcon, {}) })] }, provider.id))) }) }) }) })] }), _jsxs(Select.Root, { collection: statusCollection, value: state.status ? [state.status] : [], onValueChange: (details) => {
143
143
  const value = z
@@ -149,7 +149,7 @@ export function BetRecords__client(props) {
149
149
  });
150
150
  }, lazyMount: true, deselectable: true, positioning: {
151
151
  sameWidth: true,
152
- }, children: [_jsxs(Select.Trigger, { className: "w-full lg:w-[14rem]", children: [_jsx(Select.ValueText, { placeholder: "Status" }), _jsx(Select.Context, { children: (api) => (_jsx(_Fragment, { children: api.value.length ? (_jsx(Select.ClearTrigger, { asChild: true, children: _jsx("span", { onClick: (e) => {
152
+ }, children: [_jsxs(Select.Trigger, { className: "w-full lg:w-[14rem]", children: [_jsx(Select.ValueText, { placeholder: props.placeholder?.status ?? 'Status' }), _jsx(Select.Context, { children: (api) => (_jsx(_Fragment, { children: api.value.length ? (_jsx(Select.ClearTrigger, { asChild: true, children: _jsx("span", { onClick: (e) => {
153
153
  e.stopPropagation();
154
154
  }, children: "Clear" }) })) : (_jsx(Select.Indicator, { asChild: true, children: _jsx(ChevronDownIcon, {}) })) })) })] }), _jsx(Portal, { children: _jsx(Select.Positioner, { children: _jsx(Select.Content, { children: _jsx(Select.ItemGroup, { children: statusCollection.items.map((status) => (_jsxs(Select.Item, { item: status, children: [_jsx(Select.ItemText, { children: capitalize(status, {
155
155
  delimiter: capitalize.delimiters.UNDERSCORE,
@@ -102,22 +102,27 @@ function CashbackBonus(props) {
102
102
  });
103
103
  },
104
104
  });
105
- const balance = parseDecimal(bonus.balance, 0);
106
- const total = parseDecimal(bonus.total, 0);
105
+ const currentAccumulatedCashbackAmount = parseDecimal(bonus.balance, 0);
106
+ const totalAccumulatedCashbackAmount = parseDecimal(bonus.total, 0);
107
107
  const minimumCashback = parseDecimal(props.data.cashback.minimumCashback, 0);
108
- const maximumMonthlyCashback = parseDecimal(props.data.cashback.maximumMonthlyCashback, 0);
109
- const disabled = balance <= 0 || total > maximumMonthlyCashback || balance < minimumCashback;
108
+ const maximumMonthlyCashbackLimit = parseDecimal(props.data.cashback.maximumMonthlyCashback, 0);
109
+ const hasNoCashback = currentAccumulatedCashbackAmount <= 0;
110
+ const hasReachedOrExceededMonthlyLimit = totalAccumulatedCashbackAmount >= maximumMonthlyCashbackLimit;
111
+ const belowMinimumCashbackThreshold = currentAccumulatedCashbackAmount < minimumCashback;
112
+ const disabled = hasNoCashback ||
113
+ hasReachedOrExceededMonthlyLimit ||
114
+ belowMinimumCashbackThreshold;
110
115
  return (_jsxs("div", { className: "border-border-primary bg-bg-tertiary flex flex-col overflow-hidden rounded-2xl border", children: [cashback.banner?.url ? (_jsx(Image, { src: cashback.banner.url, alt: "", width: 400, height: 200, className: "h-[11.25rem] w-full object-cover" })) : (_jsx("div", { style: {
111
116
  background: 'radial-gradient(75.21% 75.21% at 50% 50%, rgba(249, 163, 8, 0.3) 0%, rgba(0, 0, 0, 0) 100%), var(--color-bg-primary-alt)',
112
- }, children: _jsx(Image, { src: moneyOnHand, alt: "", className: "mx-auto h-[11.25rem] w-auto shrink-0 object-cover", draggable: false, width: 600, height: 600 }) })), _jsxs("div", { className: "flex grow flex-col px-xl py-3xl", children: [_jsx("p", { className: "line-clamp-1 text-center text-xl font-semibold text-white", children: cashback.name }), _jsx("h2", { className: "mt-2 text-center text-3xl font-semibold text-white", children: formatNumber(bonus.balance, {
117
+ }, children: _jsx(Image, { src: moneyOnHand, alt: "", className: "mx-auto h-[11.25rem] w-auto shrink-0 object-cover", draggable: false, width: 600, height: 600 }) })), _jsxs("div", { className: "flex grow flex-col px-xl py-3xl", children: [_jsx("p", { className: "line-clamp-1 text-center text-xl font-semibold text-white", children: cashback.name }), _jsx("h2", { className: "mt-2 text-center text-3xl font-semibold text-white", children: formatNumber(currentAccumulatedCashbackAmount, {
113
118
  currency: localeInfo.currency.code,
114
119
  }) }), _jsx("div", { className: "text-text-secondary-700 mt-2 line-clamp-1 text-center text-sm", dangerouslySetInnerHTML: {
115
120
  __html: cashback.description,
116
121
  } }), _jsx("div", { className: "grow" }), disabled ? (_jsxs(Popover.Root, { lazyMount: true, unmountOnExit: true, positioning: {
117
122
  placement: 'top',
118
- }, children: [_jsx(Button, { size: "sm", className: "mt-6", "aria-disabled": true, asChild: true, children: _jsx(Popover.Trigger, { children: "Claim" }) }), _jsx(Popover.Positioner, { children: _jsxs(Popover.Content, { className: "bg-bg-quaternary rounded-md px-2.5 py-2 text-sm font-medium", children: [_jsx(Popover.Arrow, { className: "arrow-bg-bg-quaternary arrow-size-3", children: _jsx(Popover.ArrowTip, {}) }), "You need", ' ', formatNumber(minimumCashback - balance, {
119
- currency: localeInfo.currency.code,
120
- }), ' ', "to claim this cashback."] }) })] })) : (_jsx(Button, { size: "sm", className: "mt-6", disabled: claimCashbackBonusMutation.isPending || disabled, onClick: () => {
123
+ }, children: [_jsx(Button, { size: "sm", className: "mt-6", "aria-disabled": true, asChild: true, children: _jsx(Popover.Trigger, { children: "Claim" }) }), _jsx(Popover.Positioner, { children: _jsxs(Popover.Content, { className: "bg-bg-quaternary rounded-md px-2.5 py-2 text-sm font-medium", children: [_jsx(Popover.Arrow, { className: "arrow-bg-bg-quaternary arrow-size-3", children: _jsx(Popover.ArrowTip, {}) }), hasReachedOrExceededMonthlyLimit ? (_jsx(_Fragment, { children: "You've claimed the maximum cashback for this month." })) : (_jsxs(_Fragment, { children: ["You need", ' ', formatNumber(minimumCashback - currentAccumulatedCashbackAmount, {
124
+ currency: localeInfo.currency.code,
125
+ }), ' ', "to claim this cashback."] }))] }) })] })) : (_jsx(Button, { size: "sm", className: "mt-6", disabled: claimCashbackBonusMutation.isPending || disabled, onClick: () => {
121
126
  claimCashbackBonusMutation.mutate(bonus.id);
122
127
  }, children: "Claim" }))] })] }));
123
128
  }
@@ -6,6 +6,8 @@ import { useCreateGameSessionMutation } from '../../client/hooks/useCreateGameSe
6
6
  import { useGlobalStore } from '../../client/hooks/useGlobalStore.js';
7
7
  import { useSessionQuery } from '../../client/hooks/useSessionQuery.js';
8
8
  import { toaster } from '../../client/utils/toaster.js';
9
+ import { GAMES_AVAILABLE_3PM_TO_3AM } from '../../utils/gamesAvailable3pmTo3am.js';
10
+ import { isBetween3amAnd3pm } from '../../utils/isBetween3amAnd3pm.js';
9
11
  export function GameLaunchTrigger(props) {
10
12
  const sessionQuery = useSessionQuery();
11
13
  const createGameSessionMutation = useCreateGameSessionMutation();
@@ -25,6 +27,11 @@ export function GameLaunchTrigger(props) {
25
27
  : globalStore.gameLaunch.details.status === 'WAITING'
26
28
  ? 'closed'
27
29
  : 'open', ...props, disabled: disabled, onClick: async (e) => {
30
+ // prevent game launch for games that are only available between 3 PM and 3 AM
31
+ if (!isBetween3amAnd3pm() &&
32
+ GAMES_AVAILABLE_3PM_TO_3AM.includes(props.game.name)) {
33
+ return;
34
+ }
28
35
  if (sessionQuery.data?.status === 'unauthenticated') {
29
36
  globalStore.signIn.setOpen(true);
30
37
  return props.onClick?.(e);
@@ -37,8 +37,8 @@ export function GameProvidersCarousel(props) {
37
37
  const viewGamesUrl = (data) => {
38
38
  return props.viewGamesUrl
39
39
  ? callIfFn(props.viewGamesUrl, data)
40
- .replace(':id', data.id)
41
- .replace(':slug', data.slug)
40
+ .replace(':id', data?.id)
41
+ .replace(':slug', data?.slug)
42
42
  : `/providers/${data.slug}`;
43
43
  };
44
44
  const gameProviders = props.gameProviders.map((provider) => GAME_PROVIDER_DATA[provider]);