@opexa/portal-components 0.0.113 → 0.0.115
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.
- package/dist/client/hooks/index.d.ts +65 -0
- package/dist/client/hooks/index.js +65 -0
- package/dist/client/hooks/useCreateDigitainGameSessionMutatio.d.ts +2 -0
- package/dist/client/hooks/useCreateDigitainGameSessionMutatio.js +41 -0
- package/dist/client/services/index.d.ts +4 -0
- package/dist/client/services/index.js +4 -0
- package/dist/client/utils/index.d.ts +3 -0
- package/dist/client/utils/index.js +3 -0
- package/dist/components/Bonus/Bonus.client.js +1 -1
- package/dist/components/Cashback/Cashback.client.js +1 -1
- package/dist/components/Disclaimer/DisclaimerV2.js +6 -4
- package/dist/components/Empty.d.ts +10 -0
- package/dist/components/Empty.js +7 -0
- package/dist/components/FavoriteGames/FavoriteGames.client.js +23 -1
- package/dist/components/GameLaunch/GameLaunch.lazy.js +1 -1
- package/dist/components/Games/GameContext.d.ts +2 -0
- package/dist/components/Games/GameContext.js +2 -0
- package/dist/components/GamesSearch/GamesSearch.js +1 -1
- package/dist/components/InfiniteScroll.d.ts +10 -0
- package/dist/components/InfiniteScroll.js +25 -0
- package/dist/components/JackpotCounter/JackpotCounter.client.d.ts +2 -0
- package/dist/components/JackpotCounter/JackpotCounter.client.js +66 -0
- package/dist/components/JackpotCounter/JackpotCounter.d.ts +17 -0
- package/dist/components/JackpotCounter/JackpotCounter.js +21 -0
- package/dist/components/JackpotCounter/JackpotCounterItem.d.ts +18 -0
- package/dist/components/JackpotCounter/JackpotCounterItem.js +109 -0
- package/dist/components/JackpotCounter/JackpotCounterItem.module.css +184 -0
- package/dist/components/JackpotCounter/index.d.ts +1 -0
- package/dist/components/JackpotCounter/index.js +1 -0
- package/dist/components/Jackpots/JackpotDesktop.d.ts +1 -0
- package/dist/components/Jackpots/JackpotDesktop.js +45 -0
- package/dist/components/Jackpots/JackpotGameProviders.d.ts +5 -0
- package/dist/components/Jackpots/JackpotGameProviders.js +41 -0
- package/dist/components/Jackpots/JackpotItemDesktop.d.ts +9 -0
- package/dist/components/Jackpots/JackpotItemDesktop.js +43 -0
- package/dist/components/Jackpots/JackpotItemMobile.d.ts +9 -0
- package/dist/components/Jackpots/JackpotItemMobile.js +44 -0
- package/dist/components/Jackpots/JackpotMobile.d.ts +1 -0
- package/dist/components/Jackpots/JackpotMobile.js +46 -0
- package/dist/components/Jackpots/JackpotRules.d.ts +5 -0
- package/dist/components/Jackpots/JackpotRules.js +11 -0
- package/dist/components/Jackpots/Jackpots.client.d.ts +2 -0
- package/dist/components/Jackpots/Jackpots.client.js +29 -0
- package/dist/components/Jackpots/JackpotsCarousel/JackpotsCarouselItem.module.css +184 -184
- package/dist/components/Jackpots/JackpotsContext.d.ts +4 -0
- package/dist/components/Jackpots/JackpotsContext.js +3 -0
- package/dist/components/Jackpots/JackpotsList/JackpotsListItem.module.css +184 -184
- package/dist/components/Jackpots/useJackpotData.d.ts +14 -0
- package/dist/components/Jackpots/useJackpotData.js +93 -0
- package/dist/components/Jackpots/useJackpotItemData.d.ts +20 -0
- package/dist/components/Jackpots/useJackpotItemData.js +87 -0
- package/dist/components/KYC/Header.d.ts +1 -0
- package/dist/components/KYC/Header.js +6 -0
- package/dist/components/KYC/Step1.d.ts +1 -0
- package/dist/components/KYC/Step1.js +12 -0
- package/dist/components/KYC/Step2.d.ts +1 -0
- package/dist/components/KYC/Step2.js +12 -0
- package/dist/components/KYC/Step3.d.ts +1 -0
- package/dist/components/KYC/Step3.js +11 -0
- package/dist/components/KYC/Step4.d.ts +1 -0
- package/dist/components/KYC/Step4.js +6 -0
- package/dist/components/Messages/MessageItem.d.ts +4 -0
- package/dist/components/Messages/MessageItem.js +34 -0
- package/dist/components/News/News.js +1 -1
- package/dist/components/PortalProvider/WebVitals.d.ts +1 -0
- package/dist/components/PortalProvider/WebVitals.js +8 -0
- package/dist/components/Promo/Promo.client.js +1 -1
- package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuest.d.ts +4 -1
- package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuest.js +30 -38
- package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuestModal.d.ts +8 -0
- package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuestModal.js +8 -0
- package/dist/components/Quests/OnboardingQuest/OnboardingQuest.d.ts +4 -1
- package/dist/components/Quests/OnboardingQuest/OnboardingQuest.js +3 -27
- package/dist/components/Quests/WageringQuest/WageringQuest.d.ts +4 -1
- package/dist/components/Quests/WageringQuest/WageringQuest.js +11 -15
- package/dist/components/Quests/WageringQuest/WageringQuestModal.d.ts +9 -0
- package/dist/components/Quests/WageringQuest/WageringQuestModal.js +8 -0
- package/dist/components/Search/Search.lazy.js +28 -13
- package/dist/components/TopWins/TopWins.client.js +2 -2
- package/dist/components/TournamentCounter/TournamentCounter.client.d.ts +2 -0
- package/dist/components/TournamentCounter/TournamentCounter.client.js +50 -0
- package/dist/components/TournamentCounter/TournamentCounter.d.ts +8 -0
- package/dist/components/TournamentCounter/TournamentCounter.js +21 -0
- package/dist/components/TournamentCounter/TournamentCounterItem.d.ts +8 -0
- package/dist/components/TournamentCounter/TournamentCounterItem.js +106 -0
- package/dist/components/TournamentCounter/index.d.ts +1 -0
- package/dist/components/TournamentCounter/index.js +1 -0
- package/dist/components/Tournaments/TournamentDesktop.d.ts +1 -0
- package/dist/components/Tournaments/TournamentDesktop.js +57 -0
- package/dist/components/Tournaments/TournamentGameProviders.d.ts +5 -0
- package/dist/components/Tournaments/TournamentGameProviders.js +38 -0
- package/dist/components/Tournaments/TournamentItemDesktop.d.ts +7 -0
- package/dist/components/Tournaments/TournamentItemDesktop.js +56 -0
- package/dist/components/Tournaments/TournamentItemMobile.d.ts +7 -0
- package/dist/components/Tournaments/TournamentItemMobile.js +54 -0
- package/dist/components/Tournaments/TournamentMobile.d.ts +1 -0
- package/dist/components/Tournaments/TournamentMobile.js +55 -0
- package/dist/components/Tournaments/TournamentRules.d.ts +5 -0
- package/dist/components/Tournaments/TournamentRules.js +11 -0
- package/dist/components/Tournaments/Tournaments.client.d.ts +2 -0
- package/dist/components/Tournaments/Tournaments.client.js +20 -0
- package/dist/components/Tournaments/TournamentsCarousel/TournamentsCarouselItem.module.css +184 -184
- package/dist/components/Tournaments/TournamentsContext.d.ts +4 -0
- package/dist/components/Tournaments/TournamentsContext.js +3 -0
- package/dist/components/Tournaments/TournamentsList/TournamentItem.module.css +184 -184
- package/dist/components/Tournaments/useTournamentData.d.ts +10 -0
- package/dist/components/Tournaments/useTournamentData.js +72 -0
- package/dist/components/Tournaments/useTournamentItemData.d.ts +16 -0
- package/dist/components/Tournaments/useTournamentItemData.js +64 -0
- package/dist/components/index.d.ts +33 -0
- package/dist/components/index.js +33 -0
- package/dist/constants/envVars.d.ts +5 -0
- package/dist/constants/envVars.js +28 -0
- package/dist/constants/gameProviders.d.ts +5 -0
- package/dist/constants/gameProviders.js +362 -0
- package/dist/constants/gameTypes.d.ts +4 -0
- package/dist/constants/gameTypes.js +64 -0
- package/dist/constants/headerKeys.d.ts +1 -0
- package/dist/constants/headerKeys.js +1 -0
- package/dist/constants/secretQuestions.d.ts +3 -0
- package/dist/constants/secretQuestions.js +24 -0
- package/dist/constants/storageKeys.d.ts +2 -0
- package/dist/constants/storageKeys.js +2 -0
- package/dist/icons/index.d.ts +65 -0
- package/dist/icons/index.js +65 -0
- package/dist/images/hacksaw-gaming.png +0 -0
- package/dist/images/pagcor2.png +0 -0
- package/dist/server/services/index.d.ts +4 -0
- package/dist/server/services/index.js +4 -0
- package/dist/server/utils/index.d.ts +29 -0
- package/dist/server/utils/index.js +29 -0
- package/dist/services/auth.d.ts +21 -2
- package/dist/services/auth.js +25 -6
- package/dist/services/queries.js +2369 -2369
- package/dist/styles/theme.css +699 -699
- package/dist/ui/Presence.d.ts +2 -0
- package/dist/ui/Presence.js +7 -0
- package/dist/ui/Prose.d.ts +2 -0
- package/dist/ui/Prose.js +5 -0
- package/dist/ui/index.d.ts +26 -0
- package/dist/ui/index.js +26 -0
- package/dist/utils/index.d.ts +17 -0
- package/dist/utils/index.js +17 -0
- package/dist/utils/isMobile.d.ts +5 -0
- package/dist/utils/isMobile.js +9 -0
- package/dist/utils/mutationKeys.d.ts +1 -0
- package/dist/utils/mutationKeys.js +4 -0
- package/package.json +163 -163
- package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuestRules.d.ts +0 -6
- package/dist/components/Quests/DailyCheckInQuest/DailyCheckInQuestRules.js +0 -15
- package/dist/components/Quests/OnboardingQuest/OnboardingQuestRules.d.ts +0 -6
- package/dist/components/Quests/OnboardingQuest/OnboardingQuestRules.js +0 -15
- package/dist/components/Quests/WageringQuest/WageringQuestRules.d.ts +0 -7
- package/dist/components/Quests/WageringQuest/WageringQuestRules.js +0 -17
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { tz } from '@date-fns/tz';
|
|
3
|
+
import { format } from 'date-fns';
|
|
4
|
+
import Link from 'next/link';
|
|
5
|
+
import { useShallow } from 'zustand/shallow';
|
|
6
|
+
import { useGlobalStore, useLocaleInfo, useMarkMessageAsReadMutation, } from '../../client/hooks/index.js';
|
|
7
|
+
import { getMessageIcon } from '../../components/Messages/utils.js';
|
|
8
|
+
export function MessageItem({ message }) {
|
|
9
|
+
const {
|
|
10
|
+
/**/
|
|
11
|
+
id, icon, title, content, actions, markedAsRead, dateTimeCreated, } = message;
|
|
12
|
+
const localeInfo = useLocaleInfo();
|
|
13
|
+
const globalStore = useGlobalStore(useShallow((ctx) => ({
|
|
14
|
+
message: ctx.message,
|
|
15
|
+
messages: ctx.messages,
|
|
16
|
+
})));
|
|
17
|
+
const markMessageAsReadMutation = useMarkMessageAsReadMutation();
|
|
18
|
+
const Icon = getMessageIcon(icon);
|
|
19
|
+
const handleViewMessage = async () => {
|
|
20
|
+
globalStore.message.setData(message);
|
|
21
|
+
globalStore.message.setOpen(true);
|
|
22
|
+
globalStore.messages.setOpen(false);
|
|
23
|
+
if (!markedAsRead)
|
|
24
|
+
markMessageAsReadMutation.mutate(id);
|
|
25
|
+
};
|
|
26
|
+
const handleActionClick = (e) => {
|
|
27
|
+
e.stopPropagation();
|
|
28
|
+
globalStore.messages.setOpen(false);
|
|
29
|
+
globalStore.messages.setTab('ALL');
|
|
30
|
+
};
|
|
31
|
+
return (_jsxs("div", { role: "button", tabIndex: 0, className: "border-border-secondary rounded-xs bg-bg-secondary flex h-auto flex-shrink-0 cursor-pointer flex-col border px-3.5 py-2.5", onClick: handleViewMessage, "aria-pressed": "false", children: [_jsxs("div", { className: "flex items-center space-x-2", children: [_jsx("p", { className: "text-text-tertiary-600 text-xs font-normal", children: format(new Date(dateTimeCreated), 'M/d/yyyy - h:mma', {
|
|
32
|
+
in: tz(localeInfo.timezone),
|
|
33
|
+
}) }), !markedAsRead && (_jsx("div", { className: "bg-utility-success-500 h-2.5 w-2.5 rounded-full" }))] }), _jsxs("div", { className: "mb-2 flex items-center space-x-2", children: [_jsx(Icon, { className: "text-brand-400" }), _jsx("p", { className: "text-text-primary-brand text-sm font-semibold", children: title })] }), _jsx("p", { className: "line-clamp-3 text-wrap text-sm font-normal", dangerouslySetInnerHTML: { __html: content } }), actions.length > 0 && (_jsx("div", { className: "mt-2 flex flex-wrap items-center justify-end gap-2", children: actions.map((action, index) => (_jsx(Link, { className: "border-button-secondary-border text-button-secondary-fg rounded-md border px-3 py-2 text-sm", href: action.url, onClick: handleActionClick, children: action.name }, index))) }))] }));
|
|
34
|
+
}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import Image from 'next/image';
|
|
3
3
|
import Link from 'next/link';
|
|
4
4
|
import { ChevronLeftIcon } from '../../icons/ChevronLeftIcon.js';
|
|
5
|
-
import { Prose } from '../../ui/Prose
|
|
5
|
+
import { Prose } from '../../ui/Prose.js';
|
|
6
6
|
export function News(props) {
|
|
7
7
|
return (_jsxs("div", { style: props.style, className: props.className, children: [_jsxs(Link, { href: props.viewAllUrl ?? '/news', className: "text-button-secondary-fg flex items-center gap-lg text-lg font-semibold", children: [_jsx(ChevronLeftIcon, { className: "size-6" }), "Back to all News"] }), _jsx(Image, { src: props.news.image, alt: "", width: 1024, height: 600, className: "mt-3xl block h-auto w-full rounded-xl lg:mt-6" }), _jsx("p", { className: "text-brand-400 mt-xl text-sm font-semibold lg:mt-6", children: props.news.category }), _jsx("h2", { className: "mt-xl text-2xl font-semibold lg:mt-6", children: props.news.title }), _jsx(Prose, { className: "mt-xl lg:mt-6", dangerouslySetInnerHTML: {
|
|
8
8
|
__html: props.news.content,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function WebVitals(): null;
|
|
@@ -11,7 +11,7 @@ import { useLocaleInfo } from '../../client/hooks/useLocaleInfo.js';
|
|
|
11
11
|
import { usePromoQuery } from '../../client/hooks/usePromoQuery.js';
|
|
12
12
|
import { ChevronLeftIcon } from '../../icons/ChevronLeftIcon.js';
|
|
13
13
|
import { Button } from '../../ui/Button/index.js';
|
|
14
|
-
import { Prose } from '../../ui/Prose
|
|
14
|
+
import { Prose } from '../../ui/Prose.js';
|
|
15
15
|
export function Promo__client(props) {
|
|
16
16
|
const localeInfo = useLocaleInfo();
|
|
17
17
|
const availablePromosQuery = useAvailablePromosQuery();
|
|
@@ -3,29 +3,16 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
3
3
|
import { addDays, isEqual, startOfDay } from 'date-fns';
|
|
4
4
|
import { useState } from 'react';
|
|
5
5
|
import { twMerge } from 'tailwind-merge';
|
|
6
|
-
import { useCheckInDailyCheckInQuestMutation } from '../../../client/hooks/
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { CheckIcon } from '../../../icons/CheckIcon.js';
|
|
12
|
-
import { ClockStopWatchIcon } from '../../../icons/ClockStopWatchIcon.js';
|
|
13
|
-
import { InfoCircleIcon } from '../../../icons/InfoCircleIcon.js';
|
|
14
|
-
import { Badge } from '../../../ui/Badge/index.js';
|
|
15
|
-
import { Button } from '../../../ui/Button/index.js';
|
|
16
|
-
import { dataAttr } from '../../../utils/dataAttr.js';
|
|
17
|
-
import { formatNumber } from '../../../utils/formatNumber.js';
|
|
18
|
-
import { getQueryClient } from '../../../utils/getQueryClient.js';
|
|
19
|
-
import { parseDecimal } from '../../../utils/parseDecimal.js';
|
|
20
|
-
import { getAvailableQuestsQueryKey } from '../../../utils/queryKeys.js';
|
|
6
|
+
import { useCheckInDailyCheckInQuestMutation } from '../../../client/hooks/index.js';
|
|
7
|
+
import { toaster } from '../../../client/utils/index.js';
|
|
8
|
+
import { CalendarIcon, CheckIcon, ClockStopWatchIcon, InfoCircleIcon, } from '../../../icons/index.js';
|
|
9
|
+
import { Badge, Button } from '../../../ui/index.js';
|
|
10
|
+
import { getAvailableQuestsQueryKey, getQueryClient } from '../../../utils/index.js';
|
|
21
11
|
import CountdownTimer from '../CountdownTimer.js';
|
|
22
|
-
import {
|
|
23
|
-
|
|
24
|
-
export function DailyCheckInQuest() {
|
|
25
|
-
const quest = useQuestContext();
|
|
12
|
+
import { DailyCheckInQuestModal } from './DailyCheckInQuestModal.js';
|
|
13
|
+
export function DailyCheckInQuest({ quest }) {
|
|
26
14
|
const queryClient = getQueryClient();
|
|
27
|
-
const
|
|
28
|
-
const localeInfo = useLocaleInfo();
|
|
15
|
+
const [showRules, setShowRules] = useState(false);
|
|
29
16
|
const [isExpired, setIsExpired] = useState(false);
|
|
30
17
|
const { name, description, status, lastCheckInDate, progressPercentage, checkInStreak, thirdDayBonusAmount, sixthDayBonusAmount, seventhDayBonusAmount, endDateTime, id, } = quest;
|
|
31
18
|
const today = startOfDay(new Date());
|
|
@@ -33,23 +20,26 @@ export function DailyCheckInQuest() {
|
|
|
33
20
|
? isEqual(today, startOfDay(new Date(lastCheckInDate)))
|
|
34
21
|
: false;
|
|
35
22
|
const checkedInRewards = {
|
|
36
|
-
3:
|
|
37
|
-
6:
|
|
38
|
-
7:
|
|
23
|
+
3: thirdDayBonusAmount,
|
|
24
|
+
6: sixthDayBonusAmount,
|
|
25
|
+
7: seventhDayBonusAmount,
|
|
39
26
|
};
|
|
40
27
|
const dailyCheckedInData = Array.from({ length: 7 }, (_, i) => {
|
|
41
28
|
const day = i + 1;
|
|
42
29
|
return {
|
|
43
30
|
day,
|
|
44
|
-
reward: checkedInRewards[day]
|
|
31
|
+
reward: checkedInRewards[day] ?? 0,
|
|
45
32
|
};
|
|
46
33
|
});
|
|
47
|
-
const
|
|
34
|
+
const { mutate } = useCheckInDailyCheckInQuestMutation({
|
|
48
35
|
onSuccess() {
|
|
49
36
|
toaster.success({
|
|
50
37
|
title: 'Check-in successful 🎉',
|
|
51
38
|
description: 'You’ve successfully checked in for today! Keep it up to maintain your streak!',
|
|
52
39
|
});
|
|
40
|
+
queryClient.invalidateQueries({
|
|
41
|
+
queryKey: getAvailableQuestsQueryKey(),
|
|
42
|
+
});
|
|
53
43
|
},
|
|
54
44
|
onError(e) {
|
|
55
45
|
toaster.error({
|
|
@@ -58,24 +48,26 @@ export function DailyCheckInQuest() {
|
|
|
58
48
|
});
|
|
59
49
|
},
|
|
60
50
|
});
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
})}`
|
|
68
|
-
: '-';
|
|
51
|
+
const handleCheckIn = async () => mutate(id);
|
|
52
|
+
return (_jsxs(_Fragment, { children: [_jsx(DailyCheckInQuestModal, { modalState: {
|
|
53
|
+
isOpen: showRules,
|
|
54
|
+
setIsOpen: setShowRules,
|
|
55
|
+
} }), _jsxs("div", { className: "border-border-primary bg-bg-tertiary flex h-full w-full flex-col space-y-6 rounded-2xl border px-4 pb-6 pt-5", children: [_jsxs("div", { className: "flex flex-col space-y-2", children: [_jsxs("div", { className: "flex max-h-7.5 items-start justify-between", children: [_jsx(CountdownTimer, { endDateTime: endDateTime, renderAction: (timeLeft) => (_jsxs(Badge.Root, { size: "lg", colorScheme: "brand", round: false, children: [_jsx(Badge.Icon, { children: _jsx(ClockStopWatchIcon, {}) }), _jsxs(Badge.Label, { children: [timeLeft.days, "d:", timeLeft.hours, "h:", timeLeft.minutes, "m:", timeLeft.seconds, "s"] })] })), onEnd: () => setIsExpired(true) }), _jsx("div", { role: "button", className: "bg-bg-primary border-border-secondary flex size-9 cursor-pointer items-center justify-center rounded-md border", onClick: () => setShowRules((prev) => !prev), children: _jsx(InfoCircleIcon, { className: "text-text-disabled size-5" }) })] }), _jsx("p", { className: "text-xl font-semibold", children: name }), _jsx("p", { className: "text-text-secondary-700 text-wrap text-sm font-normal", dangerouslySetInnerHTML: { __html: description } })] }), _jsxs("div", { className: "flex w-full flex-col space-y-2", children: [_jsx("div", { className: "grid grid-cols-7", children: dailyCheckedInData.map((item) => {
|
|
56
|
+
const reward = item.reward ? `+₱${item.reward}` : '-';
|
|
69
57
|
return (_jsx("div", { className: twMerge('flex items-center justify-center', item.day <= (checkInStreak || 0)
|
|
70
58
|
? 'text-brand-400'
|
|
71
59
|
: 'text-text-secondary-700'), children: _jsx("p", { children: reward }) }, item.day));
|
|
72
|
-
}) }), _jsx("div", { className: "bg-bg-primary h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "bg-utility-brand-600 h-full rounded-full transition-all duration-300", style: { width: `${progressPercentage}%` } }) }), _jsx("div", { className: "grid grid-cols-7
|
|
60
|
+
}) }), _jsx("div", { className: "bg-bg-primary h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "bg-utility-brand-600 h-full rounded-full transition-all duration-300", style: { width: `${progressPercentage}%` } }) }), _jsx("div", { className: "grid grid-cols-7", children: dailyCheckedInData.map((item) => (_jsx("div", { className: "flex items-center justify-center", children: _jsx(CalendarWithDayNumber, { day: item.day, currentCheckedInDays: checkInStreak || 0 }, item.day) }, item.day))) })] }), _jsx(Button, { onClick: handleCheckIn, className: "disabled:bg-bg-primary disabled:text-text-disabled", disabled: isExpired ||
|
|
73
61
|
status === 'COMPLETED' ||
|
|
74
62
|
status === 'FAILED' ||
|
|
75
|
-
hasCheckedInToday
|
|
76
|
-
checkInDailyQuestMutation.isPending, children: hasCheckedInToday && status === 'IN_PROGRESS' ? (_jsx(CountdownTimer, { endDateTime: startOfDay(addDays(new Date(), 1)).toISOString(), renderAction: (timeLeft) => (_jsxs("div", { className: "flex items-center space-x-0.5", children: [_jsx(CheckIcon, { className: "size-5" }), _jsxs("p", { children: [timeLeft.hours, "h:", timeLeft.minutes, "m:", timeLeft.seconds, "s"] })] })), onEnd: () => {
|
|
63
|
+
hasCheckedInToday, children: hasCheckedInToday && status === 'IN_PROGRESS' ? (_jsx(CountdownTimer, { endDateTime: startOfDay(addDays(new Date(), 1)).toISOString(), renderAction: (timeLeft) => (_jsxs("div", { className: "flex items-center space-x-0.5", children: [_jsx(CheckIcon, {}), _jsxs("p", { children: [timeLeft.hours, "h:", timeLeft.minutes, "m:", timeLeft.seconds, "s"] })] })), onEnd: () => {
|
|
77
64
|
queryClient.invalidateQueries({
|
|
78
65
|
queryKey: getAvailableQuestsQueryKey(),
|
|
79
66
|
});
|
|
80
|
-
} })) : ('Check-In') })] })
|
|
67
|
+
} })) : ('Check-In') })] })] }));
|
|
68
|
+
}
|
|
69
|
+
function CalendarWithDayNumber({ day, currentCheckedInDays, }) {
|
|
70
|
+
return (_jsxs("div", { className: twMerge('group relative h-fit w-fit', day <= currentCheckedInDays
|
|
71
|
+
? 'text-brand-400'
|
|
72
|
+
: 'text-text-secondary-700'), children: [_jsx(CalendarIcon, {}), _jsx("div", { className: "absolute inset-0 mt-1 flex items-center justify-center text-2xs lg:mt-[2px]", children: _jsx("p", { className: "text-center", children: day }) })] }));
|
|
81
73
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Portal } from '@ark-ui/react';
|
|
4
|
+
import { XIcon } from '../../../icons/index.js';
|
|
5
|
+
import { Button, Dialog } from '../../../ui/index.js';
|
|
6
|
+
export function DailyCheckInQuestModal(props) {
|
|
7
|
+
return (_jsx(Dialog.Root, { lazyMount: true, unmountOnExit: true, open: props.modalState.isOpen, onOpenChange: ({ open }) => props.modalState.setIsOpen(open), closeOnEscape: false, closeOnInteractOutside: false, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, { className: "!z-[calc(var(--z-dialog)+1)]" }), _jsx(Dialog.Positioner, { className: "!z-[calc(var(--z-dialog)+2)] flex items-center justify-center", children: _jsxs(Dialog.Content, { className: "min-h-auto mx-auto max-w-[343px] rounded-xl px-4 pb-0 pt-5", children: [_jsx(Dialog.CloseTrigger, { children: _jsx(XIcon, {}) }), _jsxs("div", { className: "flex flex-col space-y-5", children: [_jsx("p", { className: "text-text-primary-900 text-lg font-semibold", children: "Daily Check-In Rules" }), _jsxs("ul", { className: "text-text-tertiary-600 group list-disc text-wrap pl-4 text-sm font-normal", children: [_jsx("li", { children: "Earn rewards just for checking in each day!" }), _jsx("li", { children: "Stay consistent to unlock special rewards on the 3rd, 5th, and 7th day." }), _jsx("li", { children: "Missing a day will reset your streak, starting again from Day 1." }), _jsx("li", { children: "Each check-in unlocks the next one on the following day." }), _jsx("li", { children: "Successfully check in for 7 consecutive days to complete the quest and reset the cycle." })] })] }), _jsx("div", { className: "pb-4 pt-6", children: _jsx(Button, { onClick: () => props.modalState.setIsOpen(false), children: "Ok" }) })] }) })] }) }));
|
|
8
|
+
}
|
|
@@ -1,28 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { useGlobalStore } from '../../../client/hooks/useGlobalStore.js';
|
|
5
|
-
import { CheckIcon } from '../../../icons/CheckIcon.js';
|
|
6
|
-
import { ClockStopWatchIcon } from '../../../icons/ClockStopWatchIcon.js';
|
|
7
|
-
import { CoinsHandIcon } from '../../../icons/CoinsHandIcon.js';
|
|
8
|
-
import { FileCheck02Icon } from '../../../icons/FileCheck02Icon.js';
|
|
9
|
-
import { InfoCircleIcon } from '../../../icons/InfoCircleIcon.js';
|
|
10
|
-
import { Badge } from '../../../ui/Badge/index.js';
|
|
11
|
-
import { Button } from '../../../ui/Button/index.js';
|
|
12
|
-
import { Checkbox } from '../../../ui/Checkbox/index.js';
|
|
13
|
-
import { useQuestContext } from '../QuestsContext.js';
|
|
14
|
-
import { OnboardingQuestRules } from './OnboardingQuestRules.js';
|
|
15
|
-
export function OnboardingQuest() {
|
|
16
|
-
const quest = useQuestContext();
|
|
17
|
-
const disclosure = useDisclosure();
|
|
18
|
-
const globalStore = useGlobalStore(useShallow((ctx) => ({
|
|
19
|
-
kyc: ctx.kyc,
|
|
20
|
-
depositWithdrawal: ctx.depositWithdrawal,
|
|
21
|
-
})));
|
|
22
|
-
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "border-border-primary bg-bg-tertiary flex h-full w-full flex-col space-y-6 rounded-2xl border px-4 pb-6 pt-5", children: [_jsxs("div", { className: "flex flex-col space-y-2", children: [_jsxs("div", { className: "flex max-h-7.5 items-start justify-between", children: [_jsxs(Badge.Root, { size: "lg", colorScheme: "brand", round: false, children: [_jsx(Badge.Icon, { children: _jsx(ClockStopWatchIcon, {}) }), _jsx(Badge.Label, { children: "123" })] }), _jsx("div", { role: "button", className: "bg-bg-primary border-border-secondary flex size-9 cursor-pointer items-center justify-center rounded-md border", children: _jsx(InfoCircleIcon, { className: "text-text-disabled size-5" }) })] }), _jsx("h2", { className: "text-xl font-semibold", children: quest.name }), _jsx("p", { className: "text-text-secondary-700 text-wrap text-sm font-normal", dangerouslySetInnerHTML: { __html: quest.description } })] }), _jsxs("div", { className: "w-full grow space-y-2", children: [_jsxs(Checkbox.Root, { children: [_jsx(Checkbox.Control, { className: "bg-transparent", children: _jsx(Checkbox.Indicator, { asChild: true, children: _jsx(CheckIcon, {}) }) }), _jsx(Checkbox.Label, { className: "text-sm font-medium leading-tight", children: "Complete personal verification" }), _jsx(Checkbox.HiddenInput, {})] }), _jsxs(Checkbox.Root, { children: [_jsx(Checkbox.Control, { className: "bg-transparent", children: _jsx(Checkbox.Indicator, { asChild: true, children: _jsx(CheckIcon, {}) }) }), _jsx(Checkbox.Label, { className: "text-sm font-medium leading-tight", children: "Make your first deposit" }), _jsx(Checkbox.HiddenInput, {})] })] }), _jsxs("div", { className: "flex gap-lg", children: [_jsxs(Button, { size: "sm", onClick: () => {
|
|
23
|
-
globalStore.kyc.setOpen(true);
|
|
24
|
-
}, children: [_jsx(FileCheck02Icon, { className: "size-5" }), "Verify"] }), _jsxs(Button, { size: "sm", onClick: () => {
|
|
25
|
-
globalStore.depositWithdrawal.setTab('DEPOSIT');
|
|
26
|
-
globalStore.depositWithdrawal.setOpen(true);
|
|
27
|
-
}, children: [_jsx(CoinsHandIcon, { className: "size-5" }), "Deposit"] })] })] }), _jsx(OnboardingQuestRules, { open: disclosure.open, onOpenChange: disclosure.setOpen })] }));
|
|
1
|
+
export function OnboardingQuest(props) {
|
|
2
|
+
console.log('OnboardingQuest not implemented', props.quest);
|
|
3
|
+
return null;
|
|
28
4
|
}
|
|
@@ -2,22 +2,18 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
import { twMerge } from 'tailwind-merge';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { ClockStopWatchIcon } from '../../../icons/ClockStopWatchIcon.js';
|
|
8
|
-
import { InfoCircleIcon } from '../../../icons/InfoCircleIcon.js';
|
|
9
|
-
import { Badge } from '../../../ui/Badge/index.js';
|
|
10
|
-
import { parseDecimal } from '../../../utils/parseDecimal.js';
|
|
5
|
+
import { ClockStopWatchIcon, InfoCircleIcon } from '../../../icons/index.js';
|
|
6
|
+
import { Badge } from '../../../ui/index.js';
|
|
11
7
|
import CountdownTimer from '../CountdownTimer.js';
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const quest = useQuestContext();
|
|
16
|
-
const disclosure = useDisclosure();
|
|
17
|
-
const localeInfo = useLocaleInfo();
|
|
8
|
+
import { WageringQuestModal } from './WageringQuestModal.js';
|
|
9
|
+
export function WageringQuest({ quest }) {
|
|
10
|
+
const [showRules, setShowRules] = useState(false);
|
|
18
11
|
const [isExpired, setIsExpired] = useState(false);
|
|
19
12
|
const { progressPercentage, turnover, targetTurnover, name, description, endDateTime, bonus, status, } = quest;
|
|
20
|
-
return (_jsxs(_Fragment, { children: [
|
|
21
|
-
|
|
22
|
-
|
|
13
|
+
return (_jsxs(_Fragment, { children: [_jsx(WageringQuestModal, { questName: name, modalState: {
|
|
14
|
+
isOpen: showRules,
|
|
15
|
+
setIsOpen: setShowRules,
|
|
16
|
+
} }), _jsxs("div", { className: "border-border-primary bg-bg-tertiary flex h-full w-full flex-col space-y-6 rounded-2xl border px-4 pb-6 pt-5", children: [_jsxs("div", { className: "flex flex-col space-y-2", children: [_jsxs("div", { className: "flex max-h-7.5 items-start justify-between", children: [_jsx(CountdownTimer, { endDateTime: endDateTime, renderAction: (timeLeft) => (_jsxs(Badge.Root, { size: "lg", colorScheme: "brand", round: false, children: [_jsx(Badge.Icon, { children: _jsx(ClockStopWatchIcon, {}) }), _jsxs(Badge.Label, { children: [timeLeft.days, "d:", timeLeft.hours, "h:", timeLeft.minutes, "m:", timeLeft.seconds, "s"] })] })), onEnd: () => setIsExpired(true) }), _jsx("div", { role: "button", className: "bg-bg-primary border-border-secondary flex size-9 cursor-pointer items-center justify-center rounded-md border", onClick: () => setShowRules((prev) => !prev), children: _jsx(InfoCircleIcon, { className: "text-text-disabled size-5" }) })] }), _jsx("p", { className: "text-xl font-semibold", children: name }), _jsx("p", { className: "text-text-secondary-700 text-wrap text-sm font-normal", dangerouslySetInnerHTML: { __html: description } })] }), _jsxs("div", { className: "flex w-full flex-col space-y-2", children: [_jsxs("div", { className: "text-text-primary-brand group flex items-center justify-between", children: [_jsxs("p", { children: ["Progress ", parseInt(progressPercentage).toFixed(2), "%"] }), _jsxs("p", { children: [turnover, _jsxs("span", { className: "text-text-quarterary-brand", children: ["/", targetTurnover, " PHP"] })] })] }), _jsx("div", { className: "bg-bg-primary h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "bg-utility-brand-600 h-full rounded-full transition-all duration-300", style: { width: `${progressPercentage}%` } }) })] }), _jsx("div", { className: "flex h-full items-end", children: _jsx("div", { className: "bg-button-secondary-bg border-bg-primary-hover w-full rounded-md border px-3.5 py-2.5 text-center text-white", children: _jsxs("p", { className: twMerge(isExpired || status === 'COMPLETED' || status === 'FAILED'
|
|
17
|
+
? ['opacity-50 grayscale']
|
|
18
|
+
: ''), children: ["Complete to get ", _jsxs("span", { className: "text-brand-400", children: ["\u20B1", bonus] }), ' ', "bonus!"] }) }) })] })] }));
|
|
23
19
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Portal } from '@ark-ui/react';
|
|
4
|
+
import { XIcon } from '../../../icons/index.js';
|
|
5
|
+
import { Button, Dialog } from '../../../ui/index.js';
|
|
6
|
+
export function WageringQuestModal(props) {
|
|
7
|
+
return (_jsx(Dialog.Root, { lazyMount: true, unmountOnExit: true, open: props.modalState.isOpen, onOpenChange: ({ open }) => props.modalState.setIsOpen(open), closeOnEscape: false, closeOnInteractOutside: false, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, { className: "!z-[calc(var(--z-dialog)+1)]" }), _jsx(Dialog.Positioner, { className: "!z-[calc(var(--z-dialog)+2)] flex items-center justify-center", children: _jsxs(Dialog.Content, { className: "min-h-auto mx-auto max-w-[343px] rounded-xl px-4 pb-0 pt-5", children: [_jsx(Dialog.CloseTrigger, { children: _jsx(XIcon, {}) }), _jsxs("div", { className: "flex flex-col space-y-5", children: [_jsx("p", { className: "text-text-primary-900 text-lg font-semibold", children: props.questName }), _jsxs("ul", { className: "text-text-tertiary-600 group list-disc text-wrap pl-4 text-sm font-normal", children: [_jsx("li", { children: "Earn extra rewards just by playing Slots, every bet counts, win or lose!" }), _jsx("li", { children: "Reach the wagering requirement in bets to complete the quest and claim your reward." })] })] }), _jsx("div", { className: "pb-4 pt-6", children: _jsx(Button, { onClick: () => props.modalState.setIsOpen(false), children: "Ok" }) })] }) })] }) }));
|
|
8
|
+
}
|
|
@@ -5,7 +5,9 @@ import Image, {} from 'next/image';
|
|
|
5
5
|
import Link from 'next/link';
|
|
6
6
|
import { useRef, useState } from 'react';
|
|
7
7
|
import { twMerge } from 'tailwind-merge';
|
|
8
|
+
import { useDebounceCallback } from 'usehooks-ts';
|
|
8
9
|
import { useShallow } from 'zustand/shallow';
|
|
10
|
+
import { useControllableState } from '../../client/hooks/useControllableState.js';
|
|
9
11
|
import { useGamesQuery } from '../../client/hooks/useGamesQuery.js';
|
|
10
12
|
import { useGlobalStore } from '../../client/hooks/useGlobalStore.js';
|
|
11
13
|
import { GAME_PROVIDER_DATA } from '../../constants/index.js';
|
|
@@ -16,7 +18,7 @@ import { Dialog } from '../../ui/Dialog/index.js';
|
|
|
16
18
|
import { Field } from '../../ui/Field/index.js';
|
|
17
19
|
import { IconButton } from '../../ui/IconButton/index.js';
|
|
18
20
|
import { Portal } from '../../ui/Portal/index.js';
|
|
19
|
-
import { Presence } from '../../ui/Presence
|
|
21
|
+
import { Presence } from '../../ui/Presence.js';
|
|
20
22
|
import { callIfFn } from '../../utils/callIfFn.js';
|
|
21
23
|
import { getGameImageUrl } from '../../utils/getGameImageUrl.js';
|
|
22
24
|
import { GameLaunchTrigger } from '../GameLaunch/index.js';
|
|
@@ -26,15 +28,23 @@ export function Search(props) {
|
|
|
26
28
|
})));
|
|
27
29
|
const inputRef = useRef(null);
|
|
28
30
|
const [search, setSearch] = useState('');
|
|
31
|
+
const gameProviders = props.gameProviders
|
|
32
|
+
.map((provider) => GAME_PROVIDER_DATA[provider])
|
|
33
|
+
.filter((provider) => provider.name
|
|
34
|
+
.toLowerCase()
|
|
35
|
+
.replace(/\s+/g, '')
|
|
36
|
+
.includes(search.toLowerCase().replace(/\s+/g, '')));
|
|
29
37
|
const gamesQuery = useGamesQuery({
|
|
30
38
|
first: 18,
|
|
31
|
-
search,
|
|
39
|
+
search: gameProviders.length > 0 ? undefined : search,
|
|
32
40
|
filter: {
|
|
33
41
|
type: {
|
|
34
42
|
in: props.gameTypes,
|
|
35
43
|
},
|
|
36
44
|
provider: {
|
|
37
|
-
in:
|
|
45
|
+
in: gameProviders.length > 0
|
|
46
|
+
? gameProviders.map((p) => p.id)
|
|
47
|
+
: props.gameProviders,
|
|
38
48
|
},
|
|
39
49
|
},
|
|
40
50
|
}, {
|
|
@@ -43,12 +53,6 @@ export function Search(props) {
|
|
|
43
53
|
const games = gamesQuery.data?.pages
|
|
44
54
|
.map((page) => page.edges.map((edge) => edge.node))
|
|
45
55
|
.flat() ?? [];
|
|
46
|
-
const gameProviders = props.gameProviders
|
|
47
|
-
.map((provider) => GAME_PROVIDER_DATA[provider])
|
|
48
|
-
.filter((provider) => provider.name
|
|
49
|
-
.toLowerCase()
|
|
50
|
-
.replace(/\s+/g, '')
|
|
51
|
-
.includes(search.toLowerCase().replace(/\s+/g, '')));
|
|
52
56
|
const empty = games.length <= 0 && gameProviders.length <= 0;
|
|
53
57
|
const viewGamesUrl = (data) => {
|
|
54
58
|
return props.viewGamesUrl
|
|
@@ -63,12 +67,10 @@ export function Search(props) {
|
|
|
63
67
|
return (_jsx(Dialog.Root, { open: globalStore.search.open, onOpenChange: (details) => {
|
|
64
68
|
globalStore.search.setOpen(details.open);
|
|
65
69
|
setSearch('');
|
|
66
|
-
}, lazyMount: true, unmountOnExit: true, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, {}), _jsx(Dialog.Positioner, { children: _jsxs(Dialog.Content, { className: "bg-bg-primary lg:min-h-auto mx-auto min-h-full w-full pt-xl lg:mt-[132px] lg:max-w-[1136px] lg:bg-unset lg:pt-0", children: [_jsx(Dialog.Context, { children: (api) => (_jsxs("div", { className: "flex items-center justify-between px-4 lg:hidden", children: [_jsx(Image, { src: props.logo, alt: "", width: 200, height: 40, className: "h-8 w-auto" }), _jsx(IconButton, { size: "sm", colorScheme: "gray", onClick: () => api.setOpen(false), children: _jsx(XIcon, { className: "text-text-quinary size-6" }) })] })) }), _jsx("div", { className: "flex justify-end", children: _jsx(Dialog.Context, { children: (api) => (_jsx("button", { type: "button", onClick: () => api.setOpen(false), className: "hidden size-9 items-center justify-center rounded-md bg-white/20 lg:flex", children: _jsx(XIcon, { className: "size-5 text-white" }) })) }) }), _jsx("div", { className: "mt-2xl px-4 lg:mt-xl lg:px-0", children: _jsxs("div", { className: "relative", children: [_jsx(SearchLgIcon, { className: "text-text-quinary pointer-events-none absolute left-3.5 top-1/2 size-5 -translate-y-1/2" }), _jsx(
|
|
67
|
-
setSearch(e.target.value);
|
|
68
|
-
}, className: "pl-10 pr-16", placeholder: "Search", autoComplete: "off" }), _jsx(Presence, { present: search.length > 0, asChild: true, lazyMount: true, children: _jsx("button", { type: "button", className: "text-text-secondary-700 absolute right-3.5 top-1/2 -translate-y-1/2 font-semibold", onClick: () => {
|
|
70
|
+
}, lazyMount: true, unmountOnExit: true, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, {}), _jsx(Dialog.Positioner, { children: _jsxs(Dialog.Content, { className: "bg-bg-primary lg:min-h-auto mx-auto min-h-full w-full pt-xl lg:mt-[132px] lg:max-w-[1136px] lg:bg-unset lg:pt-0", children: [_jsx(Dialog.Context, { children: (api) => (_jsxs("div", { className: "flex items-center justify-between px-4 lg:hidden", children: [_jsx(Image, { src: props.logo, alt: "", width: 200, height: 40, className: "h-8 w-auto" }), _jsx(IconButton, { size: "sm", colorScheme: "gray", onClick: () => api.setOpen(false), children: _jsx(XIcon, { className: "text-text-quinary size-6" }) })] })) }), _jsx("div", { className: "flex justify-end", children: _jsx(Dialog.Context, { children: (api) => (_jsx("button", { type: "button", onClick: () => api.setOpen(false), className: "hidden size-9 items-center justify-center rounded-md bg-white/20 lg:flex", children: _jsx(XIcon, { className: "size-5 text-white" }) })) }) }), _jsx("div", { className: "mt-2xl px-4 lg:mt-xl lg:px-0", children: _jsxs("div", { className: "relative", children: [_jsx(SearchLgIcon, { className: "text-text-quinary pointer-events-none absolute left-3.5 top-1/2 size-5 -translate-y-1/2" }), _jsx(DebouncedInput, { ref: inputRef, value: search, onChange: setSearch }), _jsx(Presence, { present: search.length > 0, asChild: true, lazyMount: true, children: _jsx("button", { type: "button", className: "text-text-secondary-700 absolute right-3.5 top-1/2 -translate-y-1/2 font-semibold", onClick: () => {
|
|
69
71
|
setSearch('');
|
|
70
72
|
inputRef.current?.focus();
|
|
71
|
-
}, children: "Clear" }) })] }) }), _jsx("div", { className: "lg:bg-bg-primary lg:border-border-primary mt-2xl p-xl pb-3xl lg:mt-2 lg:rounded-xl lg:border", children: search.length <= 0 ? (_jsx(Alert, { message: "Search for your favorite game or provider." })) : search.length >= 1 && search.length <= 2 ? (_jsx(Alert, { message: "Search requires at least 3 characters." })) : (_jsxs(_Fragment, { children: [empty && _jsx(Alert, { message: "No results found" }), !empty && (_jsxs(_Fragment, { children: [gameProviders.length > 0 && (_jsxs(_Fragment, { children: [_jsx("h2", { className: "text-lg font-semibold", children: "Providers" }), _jsx("div", { className: "mt-3.5 grid grid-cols-3 gap-1.5 lg:grid-cols-9 lg:gap-3.5", children: gameProviders.map((provider) => (_jsx(Link, { href: viewGamesUrl(provider), "aria-label": `View ${provider.name} games`, className: twMerge('bg-gray-800 flex h-14 w-full items-center rounded-md', classNames.providerThumbnailRoot), onClick: () => {
|
|
73
|
+
}, children: "Clear" }) })] }) }), _jsx("div", { className: "lg:bg-bg-primary lg:border-border-primary mt-2xl p-xl pb-3xl lg:mt-2 lg:max-h-[41rem] lg:overflow-y-auto lg:rounded-xl lg:border", children: search.length <= 0 ? (_jsx(Alert, { message: "Search for your favorite game or provider." })) : search.length >= 1 && search.length <= 2 ? (_jsx(Alert, { message: "Search requires at least 3 characters." })) : (_jsxs(_Fragment, { children: [empty && _jsx(Alert, { message: "No results found" }), !empty && (_jsxs(_Fragment, { children: [gameProviders.length > 0 && (_jsxs(_Fragment, { children: [_jsx("h2", { className: "text-lg font-semibold", children: "Providers" }), _jsx("div", { className: "mt-3.5 grid grid-cols-3 gap-1.5 lg:grid-cols-9 lg:gap-3.5", children: gameProviders.map((provider) => (_jsx(Link, { href: viewGamesUrl(provider), "aria-label": `View ${provider.name} games`, className: twMerge('bg-gray-800 flex h-14 w-full items-center rounded-md', classNames.providerThumbnailRoot), onClick: () => {
|
|
72
74
|
globalStore.search.setOpen(false);
|
|
73
75
|
}, children: _jsx(Image, { src: props.gameProviderImages?.[provider.id] ??
|
|
74
76
|
provider.logo, alt: "", width: 100, height: 50, className: twMerge('mx-auto h-auto w-full', classNames.providerThumbnailImage) }) }, provider.id))) })] })), games.length > 0 && (_jsxs(_Fragment, { children: [_jsx("h2", { className: "mt-3xl text-lg font-semibold", children: "Games" }), _jsx("div", { className: "mt-3.5 grid grid-cols-3 gap-1.5 lg:grid-cols-9 lg:gap-3.5", children: games.map((game) => (_jsxs(GameLaunchTrigger, { game: game, className: twMerge('block w-full shadow-sm', classNames.gameThumbnailRoot), onClick: () => {
|
|
@@ -78,6 +80,19 @@ export function Search(props) {
|
|
|
78
80
|
provider: game.provider,
|
|
79
81
|
}), alt: "", width: 200, height: 200, priority: true, className: "aspect-square w-full rounded-t-md object-cover" }), _jsx("span", { className: twMerge('bg-bg-tertiary text-text-primary-brand block w-full truncate rounded-b-md px-2 py-2.5 text-center text-xs font-semibold', classNames.gameThumbnailTitle), children: game.name })] }, game.id))) })] })), _jsx(Presence, { present: gamesQuery.hasNextPage, children: _jsx(Button, { variant: "outline", className: "mx-auto mt-12 w-fit", onClick: () => gamesQuery.fetchNextPage(), children: "Load More" }) })] }))] })) })] }) })] }) }));
|
|
80
82
|
}
|
|
83
|
+
function DebouncedInput(props) {
|
|
84
|
+
const [value, setValue] = useControllableState({
|
|
85
|
+
value: props.value,
|
|
86
|
+
defaultValue: props.defaultValue ?? '',
|
|
87
|
+
onChange: props.onChange,
|
|
88
|
+
});
|
|
89
|
+
const setValueDebounced = useDebounceCallback(setValue, 300);
|
|
90
|
+
const [internalValue, setInternalValue] = useState(value);
|
|
91
|
+
return (_jsx(Field.Input, { ref: props.ref, type: "search", value: internalValue, onChange: (e) => {
|
|
92
|
+
setInternalValue(e.target.value);
|
|
93
|
+
setValueDebounced(e.target.value);
|
|
94
|
+
}, className: "pl-10 pr-16", placeholder: "Search", autoComplete: "off" }));
|
|
95
|
+
}
|
|
81
96
|
function Alert({ message }) {
|
|
82
97
|
return (_jsxs("div", { className: "py-lg", role: "alert", "aria-live": "polite", children: [_jsx("div", { className: "bg-bg-secondary shadow-xs border-border-primary mx-auto flex size-12 items-center justify-center rounded-lg border", children: _jsx(SearchLgIcon, { className: "text-text-secondary-700 size-6" }) }), _jsx("p", { className: "text-text-secondary-700 mt-4 text-center", children: message })] }));
|
|
83
98
|
}
|
|
@@ -19,10 +19,10 @@ export function TopWins__client(props) {
|
|
|
19
19
|
return (_jsxs("div", { className: props.className, children: [_jsx("div", { className: "mb-3 text-lg font-semibold md:mb-4", children: props.heading ?? 'Recent Big Wins' }), _jsx("div", { ref: emblaRef, className: "relative lg:overflow-hidden", children: _jsx("div", { className: "flex gap-sm lg:gap-md", children: topWins.map((topWin) => (_jsxs("div", { className: "bg-bg-tertiary border-border-primary flex w-[calc((100%-(0.375rem*2))/3)] shrink-0 flex-col space-y-2 rounded-sm border p-2 text-center lg:w-[calc((100%-(0.5rem*5))/6)] xl:w-[calc((100%-(0.5rem*9))/10)]", children: [_jsx("div", { className: "mx-auto aspect-square w-full", children: topWin.game && (_jsx(Image, { width: 100, height: 100, src: getGameImageUrl({
|
|
20
20
|
id: topWin.game.id,
|
|
21
21
|
provider: topWin.game.provider,
|
|
22
|
-
}), alt: "", className: "size-full rounded-sm object-cover" })) }), _jsxs("div", { className: "space-y-0.5", children: [_jsx("div", { className: "text-text-secondary-700 text-xs", children: topWin.member.name }), _jsx("div", { className: "text-text-primary-brand text-sm font-semibold", children: formatNumber(topWin.payout, {
|
|
22
|
+
}), alt: "", className: "size-full rounded-sm object-cover" })) }), _jsxs("div", { className: "space-y-0.5", children: [_jsx("div", { className: "text-text-secondary-700 text-xs", children: topWin.member.name }), _jsx("div", { className: "text-text-primary-brand break-words text-sm font-semibold", children: formatNumber(topWin.payout, {
|
|
23
23
|
currency: localeInfo.currency.code,
|
|
24
24
|
minDecimalPlaces: 2,
|
|
25
|
-
}) }), _jsxs("div", { className: "text-text-secondary-700 text-xs", children: [formatNumber(topWin.multiplier, {
|
|
25
|
+
}) }), _jsxs("div", { className: "text-text-secondary-700 break-words text-xs", children: [formatNumber(topWin.multiplier, {
|
|
26
26
|
minDecimalPlaces: 2,
|
|
27
27
|
}), "x"] })] })] }, topWin.id))) }) })] }));
|
|
28
28
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import useEmblaCarousel from 'embla-carousel-react';
|
|
4
|
+
import Link from 'next/link';
|
|
5
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
6
|
+
import { useTournamentsQuery } from '../../client/hooks/index.js';
|
|
7
|
+
import { ArrowLeftIcon, ArrowRightIcon, ChevronRightIcon } from '../../icons/index.js';
|
|
8
|
+
import { Button } from '../../ui/index.js';
|
|
9
|
+
import { TournamentCounterItem } from './TournamentCounterItem.js';
|
|
10
|
+
export function TournamentCounter__client(props) {
|
|
11
|
+
const [emblaRef, emblaApi] = useEmblaCarousel({
|
|
12
|
+
align: 'start',
|
|
13
|
+
slidesToScroll: 1,
|
|
14
|
+
});
|
|
15
|
+
const scrollPrev = useCallback(() => {
|
|
16
|
+
if (emblaApi)
|
|
17
|
+
emblaApi.scrollPrev();
|
|
18
|
+
}, [emblaApi]);
|
|
19
|
+
const scrollNext = useCallback(() => {
|
|
20
|
+
if (emblaApi)
|
|
21
|
+
emblaApi.scrollNext();
|
|
22
|
+
}, [emblaApi]);
|
|
23
|
+
const [canScrollPrev, setCanScrollPrev] = useState(false);
|
|
24
|
+
const [canScrollNext, setCanScrollNext] = useState(false);
|
|
25
|
+
const onSelect = useCallback(() => {
|
|
26
|
+
if (!emblaApi)
|
|
27
|
+
return;
|
|
28
|
+
setCanScrollPrev(emblaApi.canScrollPrev());
|
|
29
|
+
setCanScrollNext(emblaApi.canScrollNext());
|
|
30
|
+
}, [emblaApi]);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (!emblaApi)
|
|
33
|
+
return;
|
|
34
|
+
onSelect();
|
|
35
|
+
emblaApi.on('select', onSelect);
|
|
36
|
+
emblaApi.on('reInit', onSelect);
|
|
37
|
+
}, [emblaApi, onSelect]);
|
|
38
|
+
const tournamentsQuery = useTournamentsQuery({
|
|
39
|
+
first: 100,
|
|
40
|
+
filter: {
|
|
41
|
+
status: {
|
|
42
|
+
equal: 'ACTIVE',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
const tournaments = tournamentsQuery.data?.pages[0].edges.map((edge) => edge.node) ?? [];
|
|
47
|
+
if (tournaments.length <= 0)
|
|
48
|
+
return null;
|
|
49
|
+
return (_jsxs("div", { className: props.className, children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "text-lg font-semibold", children: props.heading ?? 'Tournaments' }), _jsxs("div", { className: "flex items-center md:gap-3xl", children: [_jsxs(Link, { href: props.viewAllUrl ?? '/tournaments', className: "text-button-tertiary-fg flex gap-sm text-sm font-semibold", children: ["See All", _jsx(ChevronRightIcon, { className: "size-5 lg:hidden" })] }), _jsxs("div", { className: "hidden lg:flex", children: [_jsx(Button, { disabled: !canScrollPrev, onClick: scrollPrev, variant: "outline", colorScheme: "gray", className: "rounded-r-none border-r-0", "aria-label": "Previous", children: _jsx(ArrowLeftIcon, { className: "size-5" }) }), _jsxs(Button, { disabled: !canScrollNext, onClick: scrollNext, variant: "outline", colorScheme: "gray", className: "rounded-l-none", "aria-label": "Next", children: [_jsx("span", { className: "sr-only", children: "Next" }), _jsx(ArrowRightIcon, { className: "size-5" })] })] })] })] }), _jsx("div", { className: "relative mt-lg lg:overflow-hidden", ref: emblaRef, children: _jsx("div", { className: "flex gap-2.5", children: tournaments.map((tournament, i) => (_jsx(TournamentCounterItem, { tournament: tournament, viewAllUrl: props.viewAllUrl, className: "w-full" }, i))) }) })] }));
|
|
50
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface TournamentCounterProps {
|
|
2
|
+
/** @default "Tournaments" */
|
|
3
|
+
heading?: string;
|
|
4
|
+
/** @default "/tournaments" */
|
|
5
|
+
viewAllUrl?: string;
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function TournamentCounter(props: TournamentCounterProps): Promise<import("react/jsx-runtime").JSX.Element>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { prefetchJackpotsQuery } from '../../server/utils/index.js';
|
|
3
|
+
import { TournamentCounter__client } from './TournamentCounter.client.js';
|
|
4
|
+
export async function TournamentCounter(props) {
|
|
5
|
+
await prefetchJackpotsQuery({
|
|
6
|
+
first: 100,
|
|
7
|
+
filter: {
|
|
8
|
+
status: {
|
|
9
|
+
equal: 'ACTIVE',
|
|
10
|
+
},
|
|
11
|
+
deleted: {
|
|
12
|
+
equal: false,
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
sort: {
|
|
16
|
+
cursor: 'POOL',
|
|
17
|
+
order: 'DESC',
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
return _jsx(TournamentCounter__client, { ...props });
|
|
21
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Tournament } from '@opexa/portal-sdk-core';
|
|
2
|
+
export interface TournamentCounterItemProps {
|
|
3
|
+
tournament: Tournament;
|
|
4
|
+
className?: string;
|
|
5
|
+
/** @default "/tournaments" */
|
|
6
|
+
viewAllUrl?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function TournamentCounterItem({ tournament, className, viewAllUrl, }: TournamentCounterItemProps): import("react/jsx-runtime").JSX.Element;
|