@orderly.network/trading-points 1.0.2 → 1.1.0-alpha.0
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/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -9
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/usePointsData/usePointsData.ts","../src/hooks/usePointsData/provider.tsx","../src/pages/points/main.tsx","../src/components/leaderboard/generalLeaderboard/generalLeaderboard.script.ts","../src/utils.ts","../src/components/leaderboard/generalLeaderboard/generalLeaderboard.ui.tsx","../src/components/ranking/shared/ranking.ui.tsx","../src/components/ranking/shared/column.tsx","../src/components/ranking/shared/util.ts","../src/components/ranking/generalRanking/generalRanking.script.ts","../src/hooks/useEndReached.ts","../src/components/ranking/generalRanking/generalRanking.widget.tsx","../src/components/leaderboard/generalLeaderboard/generalLeaderboard.widget.tsx","../src/pages/points/countdown.tsx","../src/pages/points/faq.tsx","../src/pages/points/intro.tsx","../src/pages/points/user.tsx","../src/pages/points/page.tsx"],"names":["Flex","cn","useScreen","useCallback","useEffect","useMemo","useState","dateRange","Box","commify","jsx","Fragment","jsxs","column","useRef","useConfig","useQuery","useTranslation","Text","targetDate","now","Divider","ChevronDownIcon","toast"],"mappings":"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","sourcesContent":["import {\n useState,\n useEffect,\n useMemo,\n useCallback,\n Dispatch,\n SetStateAction,\n} from \"react\";\nimport {\n useQuery,\n usePrivateQuery,\n useConfig,\n RefferalAPI,\n noCacheConfig,\n} from \"@orderly.network/hooks\";\nimport { commify, numberToHumanStyle } from \"@orderly.network/utils\";\nimport {\n StagesResponse,\n UserStatistics,\n StageInfo,\n PointsTimeRange,\n} from \"./types\";\n\nexport interface PointsDisplay {\n currentPointsDisplay: string;\n tradingPointsDisplay: string;\n pnlPointsDisplay: string;\n referralPointsDisplay: string;\n rankingDisplay: string;\n}\n\nexport interface UsePointsDataReturn {\n stages: StagesResponse | undefined;\n userStatistics: UserStatistics | undefined;\n isCurrentStagePending?: boolean;\n isCurrentStageCompleted?: boolean;\n currentStage: StageInfo | undefined;\n setCurrentStage: (stage: StageInfo) => void;\n isLoading: boolean;\n isStagesLoading: boolean;\n isUserStatisticsLoading: boolean;\n isNoCampaign: boolean;\n refLink: string;\n refCode: string;\n selectedTimeRange: PointsTimeRange;\n setSelectedTimeRange: Dispatch<SetStateAction<PointsTimeRange>>;\n getRankingUrl: (args: {\n page: number;\n pageSize: number;\n timeRange?: string;\n }) => string | null;\n brokerId?: string | number;\n pointsDisplay: PointsDisplay;\n allTimePointsDisplay: PointsDisplay;\n}\n\nexport function usePointsData(): UsePointsDataReturn {\n const brokerId = useConfig(\"brokerId\");\n const [currentStage, setCurrentStage] = useState<StageInfo | undefined>(\n undefined,\n );\n const [selectedTimeRange, setSelectedTimeRange] =\n useState<PointsTimeRange>(\"this_week\");\n\n const { data: stages, isLoading: isStagesLoading } = useQuery<StagesResponse>(\n brokerId ? `/v1/public/points/stages?broker_id=${brokerId}` : null,\n {\n formatter: (res) => {\n if (res?.rows) {\n // Sort by epoch_period in descending order (smaller numbers at end)\n res.rows.sort(\n (a: StageInfo, b: StageInfo) => b.epoch_period - a.epoch_period,\n );\n }\n return res;\n },\n revalidateOnFocus: false,\n },\n );\n\n useEffect(() => {\n if (\n !stages?.rows ||\n stages.rows.length === 0 ||\n currentStage !== undefined\n ) {\n return;\n }\n\n // Priority: active > pending > completed > first\n let selectedStage = stages.rows[0]; // Default to first\n\n const activeStage = stages.rows.find((stage) => stage.status === \"active\");\n if (activeStage) {\n selectedStage = activeStage;\n } else {\n const pendingStage = [...stages.rows]\n .reverse()\n .find((stage) => stage.status === \"pending\");\n if (pendingStage) {\n selectedStage = pendingStage;\n } else {\n const completedStage = stages.rows.find(\n (stage) => stage.status === \"completed\",\n );\n if (completedStage) {\n selectedStage = completedStage;\n }\n }\n }\n\n setCurrentStage(selectedStage);\n }, [stages, currentStage]);\n\n const { data: userStatistics, isLoading: isUserStatisticsLoading } =\n usePrivateQuery<UserStatistics>(\n currentStage !== undefined\n ? `/v1/client/points/user_statistics?stage=${currentStage.stage_id}`\n : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const { data: referralInfo } = usePrivateQuery<RefferalAPI.ReferralInfo>(\n \"/v1/referral/info\",\n {\n revalidateOnFocus: true,\n errorRetryCount: 3,\n ...noCacheConfig,\n },\n );\n\n const firstCode = useMemo(() => {\n const codes = referralInfo?.referrer_info?.referral_codes;\n if (!codes || codes.length === 0) {\n return undefined;\n }\n return codes[0];\n }, [referralInfo?.referrer_info?.referral_codes]);\n\n const refCode = useMemo(() => {\n return firstCode?.code || \"--\";\n }, [firstCode]);\n\n const refLink = useMemo(() => {\n if (!firstCode || !firstCode.code) {\n return \"--\";\n }\n const referralLinkUrl = window.location.origin;\n return `${referralLinkUrl}?ref=${firstCode.code}`;\n }, [firstCode]);\n\n const getRankingUrl = useCallback(\n (args: { page: number; pageSize: number; timeRange?: string }) => {\n if (!currentStage || !brokerId) return null;\n const searchParams = new URLSearchParams();\n searchParams.set(\"page\", args.page.toString());\n searchParams.set(\"size\", args.pageSize.toString());\n searchParams.set(\"stage\", String(currentStage.stage_id));\n searchParams.set(\"period\", args.timeRange || selectedTimeRange);\n searchParams.set(\"broker_id\", String(brokerId));\n return `/v1/public/points/rankings?${searchParams.toString()}`;\n },\n [brokerId, currentStage, selectedTimeRange],\n );\n\n const isLoading = isStagesLoading || isUserStatisticsLoading;\n\n const isNoCampaign =\n !isStagesLoading && (!stages?.rows || stages.rows.length === 0);\n\n const formatPoints = (value?: number | null) => {\n if (value === undefined || value === null) {\n return \"--\";\n }\n return numberToHumanStyle(value, 2);\n };\n\n const calculateTotalPoints = useCallback(\n (\n breakdown:\n | {\n trading_point: number;\n pnl_point: number;\n referral_point: number;\n }\n | undefined,\n ) => {\n if (!breakdown) return undefined;\n return (\n breakdown.trading_point + breakdown.pnl_point + breakdown.referral_point\n );\n },\n [],\n );\n\n const pointsDisplay = useMemo<PointsDisplay>(() => {\n if (!userStatistics) {\n return {\n currentPointsDisplay: \"--\",\n tradingPointsDisplay: \"--\",\n pnlPointsDisplay: \"--\",\n referralPointsDisplay: \"--\",\n rankingDisplay: \"--\",\n };\n }\n\n const breakdownThisWeek = userStatistics.weekly_breakdown?.this_week;\n const breakdownLastWeek = userStatistics.weekly_breakdown?.last_week;\n\n let selectedBreakdown;\n let ranking;\n\n if (selectedTimeRange === \"all_time\") {\n // For all_time, use the top-level stats\n selectedBreakdown = {\n trading_point: userStatistics.trading_point,\n pnl_point: userStatistics.pnl_point,\n referral_point: userStatistics.referral_point,\n };\n ranking = userStatistics.stage_rank;\n } else if (selectedTimeRange === \"this_week\") {\n selectedBreakdown = breakdownThisWeek;\n ranking = breakdownThisWeek?.rank;\n } else {\n // last_week\n selectedBreakdown = breakdownLastWeek;\n ranking = breakdownLastWeek?.rank;\n }\n\n const currentPoints = calculateTotalPoints(selectedBreakdown) ?? 0;\n\n return {\n currentPointsDisplay: formatPoints(currentPoints),\n tradingPointsDisplay: formatPoints(selectedBreakdown?.trading_point),\n pnlPointsDisplay: formatPoints(selectedBreakdown?.pnl_point),\n referralPointsDisplay: formatPoints(selectedBreakdown?.referral_point),\n rankingDisplay:\n ranking === null || ranking === undefined ? \"--\" : commify(ranking),\n };\n }, [userStatistics, selectedTimeRange, calculateTotalPoints]);\n\n // Compute display values for all_time (for intro page)\n const allTimePointsDisplay = useMemo<PointsDisplay>(() => {\n if (!userStatistics) {\n return {\n currentPointsDisplay: \"--\",\n tradingPointsDisplay: \"--\",\n pnlPointsDisplay: \"--\",\n referralPointsDisplay: \"--\",\n rankingDisplay: \"--\",\n };\n }\n\n const currentPoints =\n calculateTotalPoints({\n trading_point: userStatistics.trading_point,\n pnl_point: userStatistics.pnl_point,\n referral_point: userStatistics.referral_point,\n }) ?? 0;\n\n return {\n currentPointsDisplay: formatPoints(currentPoints),\n tradingPointsDisplay: formatPoints(userStatistics.trading_point),\n pnlPointsDisplay: formatPoints(userStatistics.pnl_point),\n referralPointsDisplay: formatPoints(userStatistics.referral_point),\n rankingDisplay:\n userStatistics.stage_rank === null ||\n userStatistics.stage_rank === undefined\n ? \"--\"\n : commify(userStatistics.stage_rank),\n };\n }, [userStatistics, calculateTotalPoints]);\n\n return {\n stages,\n userStatistics,\n currentStage,\n setCurrentStage,\n isLoading,\n isStagesLoading,\n isUserStatisticsLoading,\n isNoCampaign,\n refLink,\n refCode,\n selectedTimeRange,\n setSelectedTimeRange,\n getRankingUrl,\n brokerId,\n pointsDisplay,\n allTimePointsDisplay,\n isCurrentStagePending: currentStage?.status === \"pending\",\n isCurrentStageCompleted: currentStage?.status === \"completed\",\n };\n}\n","import React, { createContext, useContext, FC, ReactNode } from \"react\";\nimport { usePointsData as usePointsDataHook } from \"./usePointsData\";\nimport type { UsePointsDataReturn } from \"./usePointsData\";\n\nexport type PointsContextValue = UsePointsDataReturn;\n\nconst PointsContext = createContext<PointsContextValue | undefined>(undefined);\n\nexport interface PointsProviderProps {\n children: ReactNode;\n}\n\nexport const PointsProvider: FC<PointsProviderProps> = ({ children }) => {\n const value = usePointsDataHook();\n\n return (\n <PointsContext.Provider value={value}>{children}</PointsContext.Provider>\n );\n};\n\nexport function usePoints(): PointsContextValue {\n const context = useContext(PointsContext);\n if (context === undefined) {\n throw new Error(\"usePoints must be used within a PointsProvider\");\n }\n return context;\n}\n","import { FC } from \"react\";\nimport { Flex, cn, useScreen } from \"@orderly.network/ui\";\nimport { GeneralLeaderboardWidget } from \"../../components/leaderboard/generalLeaderboard\";\nimport { usePoints } from \"../../hooks/usePointsData\";\nimport { Countdown } from \"./countdown\";\nimport { FAQSection } from \"./faq\";\nimport { Intro } from \"./intro\";\nimport { RouteOption } from \"./page\";\nimport { User } from \"./user\";\n\ntype MainProps = {\n onRouteChange: (option: RouteOption) => void;\n};\n\nconst Main: FC<MainProps> = ({ onRouteChange }) => {\n const { isMobile } = useScreen();\n const { isNoCampaign, isCurrentStagePending } = usePoints();\n return (\n <Flex\n direction=\"column\"\n gap={isMobile ? 6 : 10}\n className={cn(\n \"oui-w-full\",\n isMobile\n ? \"oui-px-5 oui-py-6\"\n : \"oui-max-w-[1200px] oui-mx-auto oui-py-[64px] oui-py-12\",\n )}\n >\n <Countdown />\n <Intro />\n {!isNoCampaign && (\n <>\n <User onRouteChange={onRouteChange} />\n {!isCurrentStagePending && <GeneralLeaderboardWidget />}\n </>\n )}\n <FAQSection className=\"oui-w-full\" />\n </Flex>\n );\n};\n\nexport default Main;\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { differenceInDays } from \"date-fns\";\nimport { DateRange, LeaderboardTab } from \"../../../type\";\nimport {\n formatDateRange,\n getDateRange,\n splitCampaignByWeeks,\n WeeklyDateRange,\n getCurrentWeeklyRange,\n getCurrentOrAllTimeRange,\n} from \"../../../utils\";\n\nexport type GeneralLeaderboardScriptReturn = ReturnType<\n typeof useGeneralLeaderboardScript\n>;\n\nexport const FilterDays = [7, 14, 30, 90] as const;\nexport type TFilterDays = (typeof FilterDays)[number];\n\nexport type GeneralLeaderboardScriptOptions = {\n campaignDateRange?: {\n start_time: Date | string;\n end_time: Date | string;\n };\n};\n\nexport function useGeneralLeaderboardScript(\n options?: GeneralLeaderboardScriptOptions,\n) {\n const { campaignDateRange } = options || {};\n\n const weeklyRanges = useMemo(() => {\n if (!campaignDateRange) return [];\n return splitCampaignByWeeks(campaignDateRange);\n }, [campaignDateRange]);\n\n const currentOrAllTimeRange = useMemo(() => {\n return getCurrentOrAllTimeRange(weeklyRanges);\n }, [weeklyRanges]);\n\n const [activeTab, setActiveTab] = useState<LeaderboardTab>(\n LeaderboardTab.Volume,\n );\n const filterState = useFilter({ defaultRange: currentOrAllTimeRange });\n const searchState = useSearch();\n\n const useCampaignDateRange = useMemo(() => {\n return !!campaignDateRange;\n }, [campaignDateRange]);\n\n return {\n ...filterState,\n ...searchState,\n activeTab,\n onTabChange: setActiveTab,\n useCampaignDateRange,\n weeklyRanges,\n currentOrAllTimeRange,\n };\n}\n\nfunction useFilter({ defaultRange }: { defaultRange?: DateRange }) {\n // default is 90d\n const [filterDay, setFilterDay] = useState<TFilterDays | null>(90);\n\n const [dateRange, setDateRange] = useState<DateRange>(getDateRange(90));\n\n const updateFilterDay = (day: TFilterDays) => {\n setFilterDay(day);\n setDateRange(getDateRange(day));\n };\n\n useEffect(() => {\n setDateRange(defaultRange ?? getDateRange(90));\n }, [defaultRange]);\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\") {\n const newDateRange = filter.value;\n setDateRange(newDateRange);\n\n if (newDateRange.from && newDateRange.to) {\n const offsetDay =\n Math.abs(differenceInDays(newDateRange.from, newDateRange.to)) + 1;\n\n const dateRange = getDateRange(offsetDay);\n if (\n formatDateRange(dateRange.from) ===\n formatDateRange(newDateRange.from) &&\n formatDateRange(dateRange.to) === formatDateRange(newDateRange.to)\n ) {\n setFilterDay(offsetDay as any);\n } else {\n setFilterDay(null);\n }\n }\n }\n };\n\n const filterItems = useMemo(() => {\n const dateRangeFilter = {\n type: \"range\",\n name: \"dateRange\",\n value: dateRange,\n max: 90,\n };\n\n return [dateRangeFilter] as any;\n }, [dateRange]);\n\n return {\n filterItems,\n onFilter,\n dateRange,\n filterDay,\n updateFilterDay,\n setDateRange,\n };\n}\n\nfunction useSearch() {\n const [searchValue, setSearchValue] = useState(\"\");\n const onSearchValueChange = useCallback((value: string) => {\n setSearchValue(value);\n }, []);\n\n const clearSearchValue = useCallback(() => {\n setSearchValue(\"\");\n }, []);\n\n return {\n searchValue,\n onSearchValueChange,\n clearSearchValue,\n };\n}\n\n/**\n * Example function demonstrating how to use splitCampaignByWeeks\n * @param campaignDateRange Campaign date range with start_time and end_time\n * @returns Array of weekly date ranges plus \"All time\" option\n */\nexport function useCampaignWeeklyRanges(campaignDateRange: {\n start_time: Date | string;\n end_time: Date | string;\n}): WeeklyDateRange[] {\n return useMemo(() => {\n return splitCampaignByWeeks(campaignDateRange);\n }, [campaignDateRange]);\n}\n\n/**\n * Hook to get current weekly range information\n * @param campaignDateRange Campaign date range with start_time and end_time\n * @returns Object containing current weekly range and related functions\n */\nexport function useCurrentWeeklyRange(campaignDateRange: {\n start_time: Date | string;\n end_time: Date | string;\n}) {\n const weeklyRanges = useCampaignWeeklyRanges(campaignDateRange);\n\n const currentRange = useMemo(() => {\n return getCurrentWeeklyRange(weeklyRanges);\n }, [weeklyRanges]);\n\n const currentOrAllTime = useMemo(() => {\n return getCurrentOrAllTimeRange(weeklyRanges);\n }, [weeklyRanges]);\n\n const isInCurrentWeek = useMemo(() => {\n return currentRange !== null;\n }, [currentRange]);\n\n const getCurrentRangeForDate = useCallback(\n (date: Date) => {\n return getCurrentWeeklyRange(weeklyRanges, date);\n },\n [weeklyRanges],\n );\n\n return {\n weeklyRanges,\n currentRange,\n currentOrAllTime,\n isInCurrentWeek,\n getCurrentRangeForDate,\n };\n}\n","import {\n format,\n subDays,\n addDays,\n isBefore,\n isAfter,\n isWithinInterval,\n} from \"date-fns\";\n\nexport const getDateRange = (offsetDay: number) => {\n return {\n from: subDays(new Date(), offsetDay - 1)!,\n to: new Date()!,\n };\n};\n\n/**\n * Format a date to \"yyyy-MM-dd\" format (e.g., \"2025-03-10\")\n * @param date The date to format\n * @returns Formatted date string\n */\nexport const formatDateRange = (date: Date): string => {\n return format(date, \"yyyy-MM-dd\");\n};\n\nfunction getUTCDateInfo(date: Date) {\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth();\n const day = date.getUTCDate();\n const hours = String(date.getUTCHours()).padStart(2, \"0\");\n const minutes = String(date.getUTCMinutes()).padStart(2, \"0\");\n\n return { year, month, day, hours, minutes };\n}\n\nexport function formatCampaignDate(date: Date | string): string {\n const monthNames = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ];\n if (typeof date === \"string\") {\n date = new Date(date);\n }\n const { year, month, day, hours, minutes } = getUTCDateInfo(date);\n return `${monthNames[month]} ${day}, ${year} ${hours}:${minutes}`;\n}\n\nexport function formatUpdateDate(timestamp: number) {\n const time = new Date(timestamp);\n try {\n return format(time, \"yyyy-MM-dd HH:mm\");\n } catch (error) {\n console.error(\"Error formatting time:\", error);\n return \"\";\n }\n}\n\nexport type WeeklyDateRange = {\n from: Date;\n to: Date;\n label: string;\n};\n\n/**\n * Split campaign date range into weekly periods and add an \"All time\" option\n * @param campaignDateRange Object containing start_time and end_time\n * @returns Array of date ranges with weekly splits plus \"All time\" option\n */\nexport function splitCampaignByWeeks(campaignDateRange: {\n start_time: Date | string;\n end_time: Date | string;\n}): WeeklyDateRange[] {\n const startDate =\n typeof campaignDateRange.start_time === \"string\"\n ? new Date(campaignDateRange.start_time)\n : campaignDateRange.start_time;\n\n const endDate =\n typeof campaignDateRange.end_time === \"string\"\n ? new Date(campaignDateRange.end_time)\n : campaignDateRange.end_time;\n\n const result: WeeklyDateRange[] = [];\n let currentWeekStart = new Date(startDate);\n let weekNumber = 1;\n\n while (isBefore(currentWeekStart, endDate)) {\n // Calculate the end of current week (6 days after start)\n const currentWeekEnd = addDays(currentWeekStart, 6);\n\n // If this week extends beyond the campaign end date, use the campaign end date\n // But subtract 1 millisecond to ensure we don't include the end date itself\n const actualWeekEnd = isAfter(currentWeekEnd, endDate)\n ? new Date(endDate.getTime() - 1)\n : currentWeekEnd;\n\n result.push({\n from: new Date(currentWeekStart),\n to: actualWeekEnd,\n label: `Week ${weekNumber}`,\n });\n\n // If the current week already reached the end date, break\n if (!isBefore(actualWeekEnd, endDate)) {\n break;\n }\n\n // Move to next week\n if (weekNumber === 1) {\n // For week 2 and onwards, start from 00:00:00 UTC of the next day\n const nextDayStart = addDays(currentWeekEnd, 1);\n const year = nextDayStart.getUTCFullYear();\n const month = nextDayStart.getUTCMonth();\n const date = nextDayStart.getUTCDate();\n currentWeekStart = new Date(Date.UTC(year, month, date, 0, 0, 0, 0));\n } else {\n // For subsequent weeks, continue the same pattern\n const nextDayStart = addDays(currentWeekEnd, 1);\n const year = nextDayStart.getUTCFullYear();\n const month = nextDayStart.getUTCMonth();\n const date = nextDayStart.getUTCDate();\n currentWeekStart = new Date(Date.UTC(year, month, date, 0, 0, 0, 0));\n }\n\n weekNumber++;\n\n // Safety check to prevent infinite loop\n if (weekNumber > 100) {\n console.warn(\n \"Too many weeks detected, breaking loop to prevent infinite iteration\",\n );\n break;\n }\n }\n\n // Add \"All time\" option covering the entire campaign period\n // result.push({\n // from: new Date(startDate),\n // to: new Date(endDate),\n // label: \"All time\",\n // });\n\n return result;\n}\n\n/**\n * Find the current weekly range that contains the given date (or current time)\n * @param weeklyRanges Array of weekly date ranges\n * @param targetDate The date to check (defaults to current time)\n * @returns The weekly range that contains the target date, or null if not found\n */\nexport function getCurrentWeeklyRange(\n weeklyRanges: WeeklyDateRange[],\n targetDate: Date = new Date(),\n): WeeklyDateRange | null {\n // Exclude \"All time\" range from the search since it's not a specific weekly period\n const weeklyOnlyRanges = weeklyRanges.filter(\n (range) => range.label !== \"All time\",\n );\n\n // First try exact match\n for (const range of weeklyOnlyRanges) {\n // Ensure range dates are properly converted to Date objects\n const rangeFrom = new Date(range.from);\n const rangeTo = new Date(range.to);\n\n // Check if target date is within the range (inclusive of both start and end)\n if (isWithinInterval(targetDate, { start: rangeFrom, end: rangeTo })) {\n return range;\n }\n }\n\n // If no exact match found, find the closest upcoming range\n // This handles cases where there are gaps between weekly periods\n const targetTime = targetDate.getTime();\n let closestFutureRange: WeeklyDateRange | null = null;\n let smallestGap = Infinity;\n\n for (const range of weeklyOnlyRanges) {\n const rangeFrom = new Date(range.from);\n const rangeFromTime = rangeFrom.getTime();\n\n // If the range starts after the target date, consider it as a candidate\n if (rangeFromTime > targetTime) {\n const gap = rangeFromTime - targetTime;\n if (gap < smallestGap) {\n smallestGap = gap;\n closestFutureRange = range;\n }\n }\n }\n\n // If there's a close upcoming range (within 24 hours), return it\n const ONE_DAY_MS = 24 * 60 * 60 * 1000;\n if (closestFutureRange && smallestGap <= ONE_DAY_MS) {\n return closestFutureRange;\n }\n\n return null;\n}\n\n/**\n * Get the current active weekly range or fallback to \"All time\"\n * @param weeklyRanges Array of weekly date ranges\n * @param targetDate The date to check (defaults to current time)\n * @returns The current weekly range or \"All time\" range as fallback\n */\nexport function getCurrentOrAllTimeRange(\n weeklyRanges: WeeklyDateRange[],\n targetDate: Date = new Date(),\n): WeeklyDateRange | undefined {\n // First try to find current weekly range\n const currentWeekly = getCurrentWeeklyRange(weeklyRanges, targetDate);\n if (currentWeekly) {\n return currentWeekly;\n }\n\n // If not in any weekly range, return \"All time\" range\n return (\n weeklyRanges.find((range) => range.label === \"All time\") ||\n weeklyRanges[weeklyRanges.length - 1]\n );\n}\n","import { FC } from \"react\";\nimport { cn, Box, useScreen } from \"@orderly.network/ui\";\nimport { GeneralRankingWidget } from \"../../ranking/generalRanking\";\nimport { RankingColumnFields } from \"../../ranking/shared/column\";\nimport { GeneralLeaderboardScriptReturn } from \"./generalLeaderboard.script\";\n\nexport type GeneralLeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n campaignDateRange?: {\n start_time: Date | string;\n end_time: Date | string;\n };\n} & GeneralLeaderboardScriptReturn;\n\nexport const GeneralLeaderboard: FC<GeneralLeaderboardProps> = (props) => {\n const { isMobile } = useScreen();\n\n const fields = [\"rank\", \"address\", \"points\"] as RankingColumnFields[];\n\n if (isMobile) {\n return (\n <Box\n pt={2}\n px={3}\n r=\"2xl\"\n intensity={900}\n width=\"100%\"\n className={cn(\n \"oui-trading-leaderboard-general-leaderboard oui-relative\",\n props.className,\n )}\n style={props.style}\n >\n <GeneralRankingWidget address={props.searchValue} fields={fields} />\n </Box>\n );\n }\n\n return (\n <Box\n pt={2}\n px={6}\n r=\"2xl\"\n className={cn(\n \"oui-trading-leaderboard-general-leaderboard oui-relative\",\n \"oui-mx-auto oui-max-w-[992px]\",\n props.className,\n )}\n style={props.style}\n >\n <GeneralRankingWidget address={props.searchValue} fields={fields} />\n </Box>\n );\n};\n","import { FC, useCallback } from \"react\";\nimport {\n cn,\n DataTable,\n Flex,\n Spinner,\n TanstackColumn,\n useScreen,\n} from \"@orderly.network/ui\";\nimport {\n type GeneralRankingData,\n GeneralRankingScriptReturn,\n} from \"../generalRanking/generalRanking.script\";\nimport { type RankingColumnFields, useRankingColumns } from \"./column\";\nimport { getCurrentAddressRowKey } from \"./util\";\n\ntype RankingData = GeneralRankingData;\n\nexport type RankingProps = {\n style?: React.CSSProperties;\n className?: string;\n fields: RankingColumnFields[];\n} & Omit<GeneralRankingScriptReturn, \"dataList\" | \"dataSource\"> & {\n dataList: RankingData[];\n dataSource: RankingData[];\n type?: \"general\" | \"campaign\";\n };\n\nexport const Ranking: FC<RankingProps> = (props) => {\n const column = useRankingColumns(\n props.fields,\n props.address,\n false,\n props.type,\n );\n const { isMobile } = useScreen();\n\n const onRow = useCallback(\n (record: RankingData, index: number) => {\n const isYou = record.key === getCurrentAddressRowKey(props.address!);\n const isFirst = record.rank === 1;\n const isSecond = record.rank === 2;\n const isThird = record.rank === 3;\n\n const showBg = isFirst || isSecond || isThird;\n\n return {\n className: cn(\n \"oui-h-[40px] md:oui-h-[48px]\",\n // use oui-relative to let the background image position based on row\n \"oui-relative\",\n isYou\n ? // add 4px extra height to make row has 2px space\n \"oui-h-[44px] md:oui-h-[52px]\"\n : cn(\n showBg && \"oui-border-b-2 oui-border-b-transparent\",\n isFirst &&\n \"oui-bg-[linear-gradient(270deg,rgba(241,215,121,0.0225)_-2.05%,rgba(255,203,70,0.45)_100%)]\",\n isSecond &&\n \"oui-bg-[linear-gradient(270deg,rgba(255,255,255,0.0225)_-2.05%,rgba(199,199,199,0.45)_100%)]\",\n isThird &&\n \"oui-bg-[linear-gradient(270deg,rgba(255,233,157,0.0225)_-1.3%,rgba(160,101,46,0.45)_100%)]\",\n ),\n ),\n };\n },\n [props.address],\n );\n\n const onCell = useCallback(\n (column: TanstackColumn<RankingData>, record: RankingData) => {\n const isFirstColumn = column.getIsFirstColumn();\n const isLastColumn = column.getIsLastColumn();\n const isRank = [1, 2, 3].includes(record.rank as number);\n return {\n className: cn(\n isFirstColumn &&\n isRank &&\n \"oui-rounded-l-lg oui-mix-blend-luminosity\",\n isLastColumn && isRank && \"oui-rounded-r-lg oui-mix-blend-luminosity\",\n ),\n };\n },\n [props.address],\n );\n\n if (isMobile) {\n return (\n <>\n <DataTable\n classNames={{\n root: \"oui-trading-leaderboard-ranking-table oui-bg-transparent\",\n body: \"oui-text-2xs\",\n scroll: \"oui-overflow-y-hidden oui-h-full\",\n }}\n loading={props.isLoading}\n columns={column}\n bordered\n dataSource={props.dataList}\n generatedRowKey={(record: RankingData) =>\n record.key || record.address\n }\n manualPagination\n manualSorting\n onRow={onRow}\n onCell={onCell}\n />\n <div\n ref={props.sentinelRef}\n className=\"oui-invisible oui-relative oui-top-[-300px] oui-h-px\"\n />\n {props.isLoading && props.dataList.length > 0 && (\n <Flex itemAlign=\"center\" justify=\"center\" width=\"100%\" height={40}>\n <Spinner size=\"sm\" />\n </Flex>\n )}\n </>\n );\n }\n\n return (\n <DataTable\n loading={props.isLoading}\n columns={column}\n bordered\n dataSource={props.dataSource}\n generatedRowKey={(record: RankingData) => record.key || record.address}\n manualPagination\n manualSorting\n pagination={props.pagination}\n classNames={{\n root: cn(\n \"oui-trading-leaderboard-ranking-table\",\n \"oui-bg-transparent\",\n \"oui-rounded-md\",\n \"oui-overflow-hidden\",\n \"!oui-h-[calc(100%_-_53px_-_8px)]\",\n ),\n scroll: \"oui-min-h-[600px] oui-max-h-[1250px]\",\n header: \"oui-bg-base-9\",\n }}\n onRow={onRow}\n onCell={onCell}\n />\n );\n};\n","import { ReactNode, useMemo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Text, Column, Box, cn, toast, useScreen } from \"@orderly.network/ui\";\nimport { commify } from \"@orderly.network/utils\";\nimport firstBadge from \"../../../img/first_badge.png\";\nimport secondBadge from \"../../../img/second_badge.png\";\nimport thirdBadge from \"../../../img/third_badge.png\";\nimport { getCurrentAddressRowKey } from \"./util\";\n\nexport type RankingColumnFields = \"rank\" | \"address\" | \"points\";\n\nexport const useRankingColumns = (\n fields?: RankingColumnFields[],\n address?: string,\n enableSort?: boolean,\n type?: \"general\" | \"campaign\",\n) => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n return useMemo(() => {\n const columns = [\n {\n title: t(\"tradingLeaderboard.rank\"),\n dataIndex: \"rank\",\n width: 50,\n render: (value: number, record: any) => {\n const isYou = record.key === getCurrentAddressRowKey(address!);\n\n let rankIcon: ReactNode;\n let badgeImg: ReactNode = null;\n\n if (!isYou) {\n if (value === 1) {\n rankIcon = <FirstRankIcon />;\n badgeImg = firstBadge;\n } else if (value === 2) {\n rankIcon = <SecondRankIcon />;\n badgeImg = secondBadge;\n } else if (value === 3) {\n rankIcon = <ThirdRankIcon />;\n badgeImg = thirdBadge;\n }\n }\n\n return (\n <>\n {badgeImg && (\n <img\n src={badgeImg as string}\n alt={`${value}th badge`}\n className={cn(\n \"oui-z-0 oui-h-[38px] oui-opacity-30 md:oui-h-[46px]\",\n \"oui-absolute oui-left-0 oui-top-0\",\n \"oui-mix-blend-luminosity\",\n // force create a separate layer in order to fix mix-blend-luminosity not working on ios\n \"oui-transform-gpu\",\n )}\n />\n )}\n <div className=\"oui-relative\">\n {rankIcon || (\n <Box width={20} pl={2} className=\"oui-text-center\">\n {value}\n </Box>\n )}\n </div>\n </>\n );\n },\n },\n {\n title: t(\"common.address\"),\n dataIndex: \"address\",\n render: (value: string, record: any) => {\n const isYou = record.key === getCurrentAddressRowKey(address!);\n if (isMobile && isYou) {\n return <Text>You</Text>;\n }\n\n return (\n <>\n <a\n className=\"oui-flex oui-items-start oui-gap-1\"\n href={`https://orderly-dashboard.orderly.network/address/${value}?broker_id=${record.broker_id}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <Text.formatted\n rule=\"address\"\n key={record.rank}\n onCopy={(e) => {\n e.preventDefault();\n e.stopPropagation();\n navigator.clipboard.writeText(value);\n toast.success(t(\"common.copy.copied\"));\n }}\n className=\"oui-cursor-pointer\"\n >\n {value}\n </Text.formatted>\n {isYou && <Text> (You)</Text>}\n </a>\n </>\n );\n },\n width: 90,\n },\n {\n title: \"Points\",\n dataIndex: \"points\",\n align: isMobile ? \"right\" : \"left\",\n render: (value: number | string) => {\n if (value === undefined || value === null || value === \"\") {\n return \"-\";\n }\n return <Text>{commify(value, 2)}</Text>;\n },\n },\n ] as Column[];\n\n return columns.filter((column) =>\n fields?.includes(column.dataIndex as RankingColumnFields),\n );\n }, [t, isMobile, address, fields, enableSort, type]);\n};\n\nconst FirstRankIcon = () => {\n return (\n <svg\n width=\"25\"\n height=\"25\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.88281 2.5L7.78711 10.3105C6.38111 11.5855 5.5 13.427 5.5 15.5C5.5 19.4 8.6 22.5 12.5 22.5C16.4 22.5 19.5 19.4 19.5 15.5C19.5 13.427 18.6189 11.5855 17.2129 10.3105L21.1172 2.5H15.5L12.5 8.5L9.5 2.5H3.88281ZM12.5 10.5C15.3 10.5 17.5 12.7 17.5 15.5C17.5 18.3 15.3 20.5 12.5 20.5C9.7 20.5 7.5 18.3 7.5 15.5C7.5 12.7 9.7 10.5 12.5 10.5ZM12.5 12.5C12.4 12.8 11.9 13.6992 11 13.6992V14.6992H12.0996V18.5H13.4004H13.5V12.5H12.5Z\"\n fill=\"url(#paint0_linear_21940_39199)\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_21940_39199\"\n x1=\"6.18073\"\n y1=\"6\"\n x2=\"20.1338\"\n y2=\"18.1659\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#8C421D\" />\n <stop offset=\"0.325272\" stopColor=\"#FBE67B\" />\n <stop offset=\"0.535488\" stopColor=\"#FCFBE7\" />\n <stop offset=\"0.769917\" stopColor=\"#F7D14E\" />\n <stop offset=\"1\" stopColor=\"#D4A041\" />\n </linearGradient>\n </defs>\n </svg>\n );\n};\n\nconst SecondRankIcon = () => {\n return (\n <svg\n width=\"25\"\n height=\"25\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.88281 2.5L7.78711 10.3105C6.38111 11.5855 5.5 13.427 5.5 15.5C5.5 19.4 8.6 22.5 12.5 22.5C16.4 22.5 19.5 19.4 19.5 15.5C19.5 13.427 18.6189 11.5855 17.2129 10.3105L21.1172 2.5H15.5L12.5 8.5L9.5 2.5H3.88281ZM12.5 10.5C15.3 10.5 17.5 12.7 17.5 15.5C17.5 18.3 15.3 20.5 12.5 20.5C9.7 20.5 7.5 18.3 7.5 15.5C7.5 12.7 9.7 10.5 12.5 10.5ZM12.5469 12.5C10.7729 12.5 10.481 13.901 10.5 14.5H11.6738C11.6738 14.357 11.809 13.5 12.5 13.5C13.163 13.5 13.291 14.0232 13.291 14.2852C13.291 15.0512 12.245 15.7623 10.5 17.6973V18.5L14.4883 18.4766L14.4863 17.5332H12.2285C13.8425 15.8792 14.5 15.1309 14.5 14.1719C14.5 13.4869 14.1149 12.5 12.5469 12.5Z\"\n fill=\"url(#paint0_linear_21940_39214)\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_21940_39214\"\n x1=\"6.18073\"\n y1=\"6\"\n x2=\"20.1338\"\n y2=\"18.1659\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#7F7F7F\" />\n <stop offset=\"0.325272\" stopColor=\"#D9D9D9\" />\n <stop offset=\"0.535488\" stopColor=\"#F7F6F4\" />\n <stop offset=\"0.769917\" stopColor=\"#D9D9D9\" />\n <stop offset=\"1\" stopColor=\"#7F7F7F\" />\n </linearGradient>\n </defs>\n </svg>\n );\n};\n\nconst ThirdRankIcon = () => {\n return (\n <svg\n width=\"29\"\n height=\"25\"\n viewBox=\"0 0 29 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.88281 2.5L9.78711 10.3105C8.38111 11.5855 7.5 13.427 7.5 15.5C7.5 19.4 10.6 22.5 14.5 22.5C18.4 22.5 21.5 19.4 21.5 15.5C21.5 13.427 20.6189 11.5855 19.2129 10.3105L23.1172 2.5H17.5L14.5 8.5L11.5 2.5H5.88281ZM14.5 10.5C17.3 10.5 19.5 12.7 19.5 15.5C19.5 18.3 17.3 20.5 14.5 20.5C11.7 20.5 9.5 18.3 9.5 15.5C9.5 12.7 11.7 10.5 14.5 10.5ZM14.4688 12.5C13.6927 12.5 12.5898 12.9348 12.5898 14.0918H13.7266C13.7266 13.9118 13.8461 13.4336 14.4941 13.4336C14.6251 13.4336 15.2715 13.4767 15.2715 14.1797C15.2715 14.8967 14.7109 14.9844 14.4219 14.9844H13.8145V15.8906H14.4219C14.5659 15.8906 15.3613 15.8537 15.3613 16.7637C15.3613 16.8837 15.3111 17.5625 14.4961 17.5625C13.8081 17.5625 13.6233 17.0284 13.6562 16.8164H12.5195C12.4615 17.4334 12.9757 18.4961 14.4688 18.4961C15.3018 18.4961 16.5 18.0942 16.5 16.7812C16.5 15.8643 15.8621 15.536 15.5391 15.418C15.6781 15.354 16.4082 14.9771 16.4082 14.1641C16.4082 13.7131 16.2127 12.5 14.4688 12.5Z\"\n fill=\"url(#paint0_linear_21940_39224)\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_21940_39224\"\n x1=\"8.61159\"\n y1=\"5.33333\"\n x2=\"22.7368\"\n y2=\"20.4383\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#B6947E\" />\n <stop offset=\"0.2\" stopColor=\"#8F6959\" />\n <stop offset=\"0.475\" stopColor=\"#F8DAC8\" />\n <stop offset=\"0.67\" stopColor=\"#AC836E\" />\n <stop offset=\"0.83\" stopColor=\"#B6947E\" />\n <stop offset=\"1\" stopColor=\"#F8DCCB\" />\n </linearGradient>\n </defs>\n </svg>\n );\n};\n","export function isSameAddress(address1: string, address2: string) {\n return address1.toLowerCase() === address2.toLowerCase();\n}\n\nexport function getCurrentAddressRowKey(address: string) {\n return `current-address-${address?.toLowerCase()}`;\n}\n","import { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useConfig, useInfiniteQuery, useQuery } from \"@orderly.network/hooks\";\nimport { API } from \"@orderly.network/types\";\nimport { usePagination, useScreen } from \"@orderly.network/ui\";\nimport { useEndReached } from \"../../../hooks/useEndReached\";\nimport { usePoints } from \"../../../hooks/usePointsData\";\nimport { getCurrentAddressRowKey, isSameAddress } from \"../shared/util\";\n\nexport type GeneralRankingData = {\n address: string;\n points?: number;\n rank?: number | string;\n broker_id?: string | number | null;\n key?: string;\n};\n\nexport type GeneralRankingResponse = {\n meta: API.RecordsMeta;\n rows: Array<{\n rank: number;\n address: string;\n total_points: number;\n }>;\n};\nexport type GeneralRankingScriptReturn = ReturnType<\n typeof useGeneralRankingScript\n>;\n\nexport type GeneralRankingScriptOptions = {\n address?: string;\n};\n\nexport function useGeneralRankingScript(options?: GeneralRankingScriptOptions) {\n const { address: searchValue } = options || {};\n\n const brokerId = useConfig(\"brokerId\");\n const { currentStage, userStatistics, getRankingUrl, selectedTimeRange } =\n usePoints();\n const { isMobile } = useScreen();\n\n const { page, pageSize, setPage, parsePagination } = usePagination({\n pageSize: 10,\n });\n\n const { data, isLoading } = useQuery<GeneralRankingResponse>(\n currentStage && brokerId\n ? getRankingUrl({ page, pageSize, timeRange: selectedTimeRange })\n : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const {\n data: infiniteData,\n size,\n setSize,\n isValidating,\n } = useInfiniteQuery<GeneralRankingResponse>(\n (pageIndex: number, previousPageData: any): string | null => {\n // reached the end\n if (previousPageData && !previousPageData.rows?.length) return null;\n if (!isMobile || !currentStage) return null;\n return getRankingUrl({\n page: pageIndex + 1,\n pageSize,\n timeRange: selectedTimeRange,\n });\n },\n {\n initialSize: 1,\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const userDataList = useMemo(() => {\n if (!userStatistics?.address) return [];\n\n let rank: number | string = \"-\";\n let points: number | undefined;\n\n if (selectedTimeRange === \"all_time\") {\n rank = userStatistics.stage_rank ?? \"-\";\n points = userStatistics.stage_points;\n } else if (selectedTimeRange === \"this_week\") {\n rank = userStatistics.weekly_breakdown?.this_week?.rank ?? \"-\";\n const breakdown = userStatistics.weekly_breakdown?.this_week;\n points = breakdown\n ? breakdown.trading_point +\n breakdown.pnl_point +\n breakdown.referral_point\n : undefined;\n } else if (selectedTimeRange === \"last_week\") {\n rank = userStatistics.weekly_breakdown?.last_week?.rank ?? \"-\";\n const breakdown = userStatistics.weekly_breakdown?.last_week;\n points = breakdown\n ? breakdown.trading_point +\n breakdown.pnl_point +\n breakdown.referral_point\n : undefined;\n }\n\n return [\n {\n key: getCurrentAddressRowKey(userStatistics.address),\n address: userStatistics.address,\n rank,\n points,\n broker_id: brokerId ?? null,\n },\n ];\n }, [userStatistics, brokerId, selectedTimeRange]);\n\n const addRankForList = useCallback(\n (list: GeneralRankingData[]) => {\n return list?.map((item, index) => ({\n ...item,\n rank: index + 1 + (page - 1) * pageSize,\n }));\n },\n [page, pageSize],\n );\n\n const dataSource = useMemo(() => {\n const mapped = (data?.rows || []).map((row) => ({\n address: row.address,\n points: row.total_points,\n rank: row.rank,\n broker_id: brokerId ?? null,\n }));\n\n const filtered = searchValue\n ? mapped.filter((item) => isSameAddress(item.address, searchValue || \"\"))\n : mapped;\n\n const finalList = addRankForList(filtered);\n if (page === 1 && !searchValue && userDataList.length) {\n return [...userDataList, ...finalList];\n }\n return finalList;\n }, [data, brokerId, searchValue, addRankForList, page, userDataList]);\n\n const dataList = useMemo(() => {\n if (!infiniteData?.length) return [];\n const flat = infiniteData.map((p) => p.rows).flat();\n const mapped = flat.map((row) => ({\n address: row.address,\n points: row.total_points,\n broker_id: brokerId ?? null,\n }));\n const filtered = searchValue\n ? mapped.filter((item) => isSameAddress(item.address, searchValue))\n : mapped;\n const rankList = addRankForList(filtered);\n if (!searchValue && userDataList.length) {\n return [...userDataList, ...rankList];\n }\n return rankList;\n }, [infiniteData, brokerId, searchValue, addRankForList, userDataList]);\n\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n const pagination = useMemo(\n () =>\n parsePagination({\n total: data?.meta?.total || 0,\n current_page: data?.meta?.current_page || 1,\n records_per_page: pageSize,\n }),\n [data?.meta?.total, data?.meta?.current_page, pageSize],\n );\n\n useEndReached(sentinelRef, () => {\n if (!isValidating && isMobile) {\n setSize(size + 1);\n }\n });\n\n useEffect(() => {\n if (searchValue) setPage(1);\n }, [searchValue, setPage]);\n\n useEffect(() => {\n setPage(1);\n }, [currentStage?.stage_id, setPage]);\n\n useEffect(() => {\n setPage(1);\n setSize(1); // 重置 infinite query\n }, [selectedTimeRange, setPage, setSize]);\n\n return {\n pagination,\n dataSource,\n isLoading: isLoading || isValidating,\n isMobile,\n sentinelRef,\n dataList,\n address: userStatistics?.address,\n };\n}\n","import { useEffect, useRef, MutableRefObject } from \"react\";\n\n/**\n * Listen for the specified element to scroll to the bottom\n */\nexport function useEndReached(\n sentinelRef: MutableRefObject<HTMLDivElement | null>,\n onEndReached?: () => void,\n) {\n const observer = useRef<IntersectionObserver>();\n const cb = useRef(onEndReached);\n\n cb.current = onEndReached;\n\n useEffect(() => {\n const options: IntersectionObserverInit = {\n root: null,\n rootMargin: \"0px\",\n threshold: 0,\n };\n\n const handleObserver = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n cb.current?.();\n }\n });\n };\n\n observer.current = new IntersectionObserver(handleObserver, options);\n\n return () => {\n observer.current?.disconnect();\n };\n }, []);\n\n useEffect(() => {\n if (sentinelRef.current) {\n observer.current?.observe(sentinelRef.current);\n }\n }, [sentinelRef.current]);\n}\n","import { FC } from \"react\";\nimport { Ranking, RankingProps } from \"../shared/ranking.ui\";\nimport {\n GeneralRankingScriptOptions,\n useGeneralRankingScript,\n} from \"./generalRanking.script\";\n\nexport type GeneralRankingWidgetProps = Pick<\n RankingProps,\n \"style\" | \"className\" | \"fields\"\n> &\n GeneralRankingScriptOptions;\n\nexport const GeneralRankingWidget: FC<GeneralRankingWidgetProps> = (props) => {\n const { address, fields, ...rest } = props;\n const state = useGeneralRankingScript({ address });\n return <Ranking {...state} {...rest} fields={fields} type=\"general\" />;\n};\n","import { FC } from \"react\";\nimport { useGeneralLeaderboardScript } from \"./generalLeaderboard.script\";\nimport {\n GeneralLeaderboard,\n GeneralLeaderboardProps,\n} from \"./generalLeaderboard.ui\";\n\nexport type GeneralLeaderboardWidgetProps = Pick<\n GeneralLeaderboardProps,\n \"style\" | \"className\" | \"campaignDateRange\"\n>;\n\nexport const GeneralLeaderboardWidget: FC<GeneralLeaderboardWidgetProps> = (\n props,\n) => {\n const state = useGeneralLeaderboardScript({\n campaignDateRange: props.campaignDateRange,\n });\n\n return (\n <GeneralLeaderboard\n {...state}\n className={props.className}\n style={props.style}\n />\n );\n};\n","import { FC, useState, useEffect } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Box, Flex, Text, useScreen } from \"@orderly.network/ui\";\nimport { usePoints } from \"../../hooks/usePointsData\";\n\ninterface CountdownTimerProps {\n className?: string;\n}\n\ninterface TimeLeft {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nexport const Countdown: FC<CountdownTimerProps> = ({ className }) => {\n const { isMobile } = useScreen();\n const { currentStage } = usePoints();\n const { t } = useTranslation();\n const [timeLeft, setTimeLeft] = useState<TimeLeft>({\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0,\n });\n\n useEffect(() => {\n if (currentStage?.status !== \"pending\" || !currentStage?.start_time) {\n return;\n }\n\n const calculateTimeLeft = (): TimeLeft => {\n const targetDate = currentStage.start_time * 1000; // 转换为毫秒\n const now = new Date().getTime();\n const difference = targetDate - now;\n\n if (difference > 0) {\n return {\n days: Math.floor(difference / (1000 * 60 * 60 * 24)),\n hours: Math.floor((difference / (1000 * 60 * 60)) % 24),\n minutes: Math.floor((difference / 1000 / 60) % 60),\n seconds: Math.floor((difference / 1000) % 60),\n };\n }\n\n return { days: 0, hours: 0, minutes: 0, seconds: 0 };\n };\n\n // Initial calculation\n setTimeLeft(calculateTimeLeft());\n\n // Update every second\n const timer = setInterval(() => {\n setTimeLeft(calculateTimeLeft());\n }, 1000);\n\n return () => clearInterval(timer);\n }, [currentStage]);\n\n const formatNumber = (num: number): string => {\n return num.toString().padStart(2, \"0\");\n };\n\n if (currentStage?.status !== \"pending\" || !currentStage?.start_time) {\n return null;\n }\n\n const targetDate = currentStage.start_time * 1000;\n const now = new Date().getTime();\n\n if (targetDate <= now) {\n return null;\n }\n\n return (\n <Flex\n gap={4}\n itemAlign=\"center\"\n justify=\"center\"\n px={9}\n className={className}\n >\n {!isMobile && (\n <Box\n className=\"oui-w-[200px] oui-h-[1px]\"\n style={{\n background: `linear-gradient(123deg, rgba(176, 132, 233, 0.00) 0%, #DEC4FF 123.91%)`,\n }}\n />\n )}\n <Box className=\"oui-rounded-2xl\" p={5}>\n <Flex direction=\"column\" gap={2} itemAlign=\"center\">\n <Text className=\"oui-text-white/[.36] oui-text-lg\">\n {t(\"tradingPoints.startsIn\")}\n </Text>\n <Flex gap={2} itemAlign=\"center\" justify=\"center\">\n <Flex direction=\"column\" gap={1} itemAlign=\"center\">\n <Text className=\"oui-text-white/98 oui-text-4xl oui-font-bold oui-w-16 oui-text-center\">\n {formatNumber(timeLeft.days)}\n </Text>\n <Text className=\"oui-text-base-contrast-80 oui-text-xs oui-w-16 oui-text-center\">\n {t(\"tradingPoints.days\")}\n </Text>\n </Flex>\n <Box className=\"oui-w-1 oui-h-1 oui-rounded-full oui-bg-base-4\" />\n <Flex direction=\"column\" gap={1} itemAlign=\"center\">\n <Text className=\"oui-text-white/98 oui-text-4xl oui-font-bold oui-w-16 oui-text-center\">\n {formatNumber(timeLeft.hours)}\n </Text>\n <Text className=\"oui-text-base-contrast-80 oui-text-xs oui-w-16 oui-text-center\">\n {t(\"tradingPoints.hours\")}\n </Text>\n </Flex>\n <Box className=\"oui-w-1 oui-h-1 oui-rounded-full oui-bg-base-4\" />\n <Flex direction=\"column\" gap={1} itemAlign=\"center\">\n <Text className=\"oui-text-white/98 oui-text-4xl oui-font-bold oui-w-16 oui-text-center\">\n {formatNumber(timeLeft.minutes)}\n </Text>\n <Text className=\"oui-text-base-contrast-80 oui-text-xs oui-w-16 oui-text-center\">\n {t(\"tradingPoints.minutes\")}\n </Text>\n </Flex>\n <Box className=\"oui-w-1 oui-h-1 oui-rounded-full oui-bg-base-4\" />\n <Flex direction=\"column\" gap={1} itemAlign=\"center\">\n <Text className=\"oui-text-white/98 oui-text-4xl oui-font-bold oui-w-16 oui-text-center\">\n {formatNumber(timeLeft.seconds)}\n </Text>\n <Text className=\"oui-text-base-contrast-80 oui-text-xs oui-w-16 oui-text-center\">\n {t(\"tradingPoints.seconds\")}\n </Text>\n </Flex>\n </Flex>\n </Flex>\n </Box>\n {!isMobile && (\n <Box\n className=\"oui-w-[200px] oui-h-[1px]\"\n style={{\n background: `linear-gradient(270deg, rgba(176, 132, 233, 0.00) 0%, #DEC4FF 123.91%)`,\n }}\n />\n )}\n </Flex>\n );\n};\n","import { FC, useState } from \"react\";\nimport { useConfig } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Box, Flex, Text, cn, useScreen, Divider } from \"@orderly.network/ui\";\nimport { ChevronDownIcon } from \"@orderly.network/ui\";\n\ninterface FAQItemProps {\n question: string;\n answer: string;\n}\n\nconst FAQItem: FC<FAQItemProps> = ({ question, answer }) => {\n const { isMobile } = useScreen();\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <Flex\n onClick={() => setIsOpen(!isOpen)}\n direction=\"column\"\n className=\"oui-w-full\"\n itemAlign={\"start\"}\n >\n <Flex\n gap={4}\n className=\"oui-w-full oui-cursor-pointer hover:oui-opacity-80 oui-transition-opacity\"\n >\n <Text\n className={cn(\n \"oui-flex-1 oui-text-white oui-font-semibold oui-tracking-[0.03em]\",\n isMobile\n ? \"oui-text-lg oui-leading-[26px]\"\n : \"oui-text-xl oui-leading-8\",\n )}\n >\n {question}\n </Text>\n <ChevronDownIcon\n size={24}\n className={cn(\n \"oui-text-white oui-transition-transform oui-duration-300 oui-flex-shrink-0\",\n isOpen && \"oui-rotate-180\",\n )}\n />\n </Flex>\n <Box\n className={cn(\n \"oui-overflow-hidden oui-transition-all oui-duration-300\",\n isOpen && \"oui-mt-4\",\n )}\n style={{\n maxHeight: isOpen ? \"500px\" : \"0px\",\n opacity: isOpen ? 1 : 0,\n }}\n >\n <Text\n className=\"oui-text-base-contrast-54 oui-text-sm oui-leading-relaxed\"\n style={{ whiteSpace: \"pre-line\" }}\n >\n {answer}\n </Text>\n </Box>\n </Flex>\n );\n};\n\ninterface FAQSectionProps {\n className?: string;\n}\n\nexport const FAQSection: FC<FAQSectionProps> = ({ className }) => {\n const brokerName = useConfig(\"brokerName\");\n const { isMobile } = useScreen();\n const { t } = useTranslation();\n const faqData = [\n {\n question: t(\"tradingPoints.faq.whatArePoints.question\"),\n answer: t(\"tradingPoints.faq.whatArePoints.answer\", { brokerName }),\n },\n {\n question: t(\"tradingPoints.faq.allocation.question\"),\n answer: t(\"tradingPoints.faq.allocation.answer\"),\n },\n {\n question: t(\"tradingPoints.faq.distribution.question\"),\n answer: t(\"tradingPoints.faq.distribution.answer\"),\n },\n {\n question: t(\"tradingPoints.faq.pnl.question\"),\n answer: t(\"tradingPoints.faq.pnl.answer\"),\n },\n {\n question: t(\"tradingPoints.faq.referral.question\"),\n answer: t(\"tradingPoints.faq.referral.answer\"),\n },\n ];\n\n return (\n <Flex\n direction=\"column\"\n gap={6}\n className={className}\n itemAlign={\"start\"}\n id=\"points-faq\"\n >\n <Text\n className={cn(\n \"oui-text-base-contrast oui-font-normal oui-tracking-[0.03em]\",\n isMobile\n ? \"oui-text-2xl oui-leading-8\"\n : \"oui-text-3xl oui-leading-10\",\n )}\n >\n {t(\"tradingPoints.faq.title\")}\n </Text>\n <Flex\n direction=\"column\"\n gap={8}\n className=\"oui-w-full\"\n itemAlign={\"start\"}\n >\n {faqData.map((faq, index) => (\n <div key={index} className=\"oui-w-full\">\n <FAQItem question={faq.question} answer={faq.answer} />\n {index < faqData.length - 1 && (\n <Divider className=\"oui-mt-8\" intensity={8} />\n )}\n </div>\n ))}\n </Flex>\n </Flex>\n );\n};\n","import { useState } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n Box,\n Flex,\n Text,\n cn,\n useScreen,\n Divider,\n CopyIcon,\n ChevronDownIcon,\n toast,\n DropdownMenuContent,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuTrigger,\n} from \"@orderly.network/ui\";\nimport { usePoints } from \"../../hooks/usePointsData\";\n\nexport const Intro = () => {\n const { isMobile } = useScreen();\n const {\n currentStage,\n stages,\n setCurrentStage,\n refLink,\n refCode,\n allTimePointsDisplay,\n isNoCampaign,\n } = usePoints();\n\n const [isStageDropdownOpen, setIsStageDropdownOpen] = useState(false);\n\n const { t } = useTranslation();\n\n const onCopyCode = async () => {\n try {\n await navigator.clipboard.writeText(refCode);\n toast.success(t(\"common.copy.copied\"));\n } catch (error) {\n console.error(\"Failed to copy code:\", error);\n }\n };\n\n const onCopyLink = async () => {\n try {\n await navigator.clipboard.writeText(refLink);\n toast.success(t(\"common.copy.copied\"));\n } catch (error) {\n console.error(\"Failed to copy link:\", error);\n }\n };\n\n const handleLearnMore = () => {\n const faqElement = document.getElementById(\"points-faq\");\n if (faqElement) {\n faqElement.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n };\n\n const formatStageDate = (startTime: number, endTime: number | null) => {\n const formatDate = (timestamp: number) => {\n const date = new Date(timestamp * 1000);\n const month = String(date.getUTCMonth() + 1).padStart(2, \"0\");\n const day = String(date.getUTCDate()).padStart(2, \"0\");\n const year = date.getUTCFullYear();\n return `${month}/${day}/${year}`;\n };\n\n const startDate = formatDate(startTime);\n const endDate = endTime ? formatDate(endTime) : \"Recurring\";\n return `${startDate} - ${endDate}`;\n };\n\n return (\n <Flex direction=\"column\" gap={8} className=\"oui-w-full\">\n {isNoCampaign ? (\n <Flex\n direction=\"column\"\n gap={6}\n itemAlign=\"start\"\n className=\"oui-w-full\"\n >\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n gap={4}\n itemAlign={isMobile ? \"start\" : \"center\"}\n justify=\"between\"\n className=\"oui-w-full\"\n >\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n itemAlign={isMobile ? \"start\" : \"center\"}\n className={isMobile ? \"oui-w-full\" : \"\"}\n >\n <Text\n className={cn(\n \"oui-text-base-contrast\",\n isMobile ? \"oui-text-xl\" : \"oui-text-4xl\",\n \"oui-font-600 oui-tracking-[0.03em] oui-leading-tight\",\n )}\n >\n No Active Campaigns\n </Text>\n </Flex>\n </Flex>\n\n {/* Description */}\n <Text\n className={cn(\n \"oui-text-[14px]\",\n \"oui-leading-[20px]\",\n \"oui-font-semibold\",\n \"oui-text-base-contrast-54\",\n )}\n >\n There are currently no active point events. Please wait for the next\n update.\n </Text>\n </Flex>\n ) : (\n <Flex\n direction=\"column\"\n gap={6}\n itemAlign=\"start\"\n className=\"oui-w-full\"\n >\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n gap={4}\n itemAlign={isMobile ? \"start\" : \"center\"}\n justify=\"between\"\n className=\"oui-w-full\"\n >\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n itemAlign={isMobile ? \"start\" : \"center\"}\n className={isMobile ? \"oui-w-full\" : \"\"}\n >\n <Text\n className={cn(\n \"oui-text-base-contrast\",\n isMobile ? \"oui-text-xl\" : \"oui-text-4xl\",\n \"oui-font-600 oui-tracking-[0.03em] oui-leading-tight\",\n )}\n >\n Stage {currentStage?.epoch_period} ·\n </Text>\n <Flex gap={3} itemAlign=\"center\">\n <Text\n className={cn(\n isMobile ? \"oui-text-xl\" : \"oui-text-4xl\",\n \"oui-text-primary\",\n \"oui-text-center\",\n \"oui-pl-2\",\n )}\n >\n {currentStage?.stage_name}\n </Text>\n <img\n src=\"https://oss.woo.org/static/images/sdk/pt-hot.png\"\n alt=\"Hot\"\n className={\n isMobile ? \"oui-w-8 oui-h-8\" : \"oui-w-[48px] oui-h-[48px]\"\n }\n />\n </Flex>\n </Flex>\n\n <DropdownMenuRoot\n open={isStageDropdownOpen}\n onOpenChange={setIsStageDropdownOpen}\n >\n <DropdownMenuTrigger asChild>\n <Flex\n gap={2}\n itemAlign=\"center\"\n px={3}\n py={2}\n className=\"oui-w-[230px] oui-bg-white/[.06] oui-border oui-border-white/[0.12] oui-rounded-md hover:oui-cursor-pointer hover:oui-opacity-80 oui-transition-opacity\"\n >\n <Text className=\"oui-flex-1 oui-text-[11px] oui-tracking-[0.03em] oui-whitespace-nowrap oui-text-white/[.36]\">\n {currentStage\n ? `Stage ${currentStage.epoch_period}: ${formatStageDate(currentStage.start_time, currentStage.end_time)}`\n : \"\"}\n </Text>\n <ChevronDownIcon\n size={12}\n className={cn(\n \"oui-text-white/[.36]\",\n \"oui-transition-transform\",\n isStageDropdownOpen && \"oui-rotate-180\",\n )}\n />\n </Flex>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n onCloseAutoFocus={(e) => e.preventDefault()}\n onClick={(e) => e.stopPropagation()}\n sideOffset={4}\n collisionPadding={{ right: 16 }}\n className={cn(\n \"oui-bg-base-8 oui-w-[230px] oui-p-1 oui-rounded-lg\",\n \"oui-border oui-border-line-6\",\n \"oui-font-semibold\",\n \"oui-shadow-[0px_3px_6px_0px_rgba(0,0,0,0.2)]\",\n )}\n >\n <Flex\n direction=\"column\"\n itemAlign=\"start\"\n gap={0}\n className=\"oui-w-full\"\n >\n {stages?.rows?.map((stage) => {\n const isSelected =\n currentStage?.stage_id === stage.stage_id;\n const isDisabled = stage.status !== \"active\";\n const isActive = stage.status === \"active\";\n return (\n <Flex\n key={stage.stage_id}\n gap={2}\n itemAlign=\"center\"\n px={2}\n py={2}\n r=\"sm\"\n onClick={() => {\n setCurrentStage(stage);\n setIsStageDropdownOpen(false);\n }}\n className={cn(\n \"oui-rounded oui-relative oui-w-full\",\n \"hover:oui-cursor-pointer hover:oui-opacity-80\",\n isSelected\n ? \"oui-bg-base-5\"\n : \"hover:oui-bg-base-5/50\",\n )}\n >\n <Text\n className={cn(\n \"oui-text-[11px] oui-tracking-[0.03em] oui-whitespace-nowrap\",\n isSelected\n ? \"oui-text-base-contrast-54 oui-font-semibold\"\n : \"oui-text-white/[.36]\",\n )}\n >\n {`Stage ${stage.epoch_period}: ${formatStageDate(stage.start_time, stage.end_time)}`}\n </Text>\n {isActive && (\n <Box className=\"oui-w-1 oui-h-1 oui-rounded-full oui-bg-primary oui-flex-shrink-0\" />\n )}\n </Flex>\n );\n })}\n </Flex>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </Flex>\n\n {/* Description */}\n <Text\n className={cn(\n \"oui-text-[14px]\",\n \"oui-leading-[20px]\",\n \"oui-font-semibold\",\n \"oui-text-base-contrast-54\",\n )}\n >\n {currentStage?.stage_description}\n <span\n className=\"oui-text-primary hover:oui-underline oui-cursor-pointer\"\n onClick={handleLearnMore}\n >\n {\" \"}\n {t(\"tradingPoints.learnMore\")}\n </span>\n </Text>\n </Flex>\n )}\n {/* Stage Points Cards */}\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n gap={6}\n className=\"oui-w-full\"\n >\n {/* Stage Points & Ranking Card */}\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n gap={6}\n itemAlign={isMobile ? \"stretch\" : \"center\"}\n p={5}\n r=\"2xl\"\n style={{ height: isMobile ? \"\" : 104 }}\n className={cn(\n \"oui-border oui-border-line\",\n !isMobile && \"oui-gap-12\",\n isMobile ? \"oui-w-full\" : \"oui-flex-1\",\n )}\n >\n <Flex\n direction=\"column\"\n gap={2}\n className=\"oui-flex-1\"\n itemAlign=\"start\"\n >\n <Text className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em]\">\n {t(\"tradingPoints.stagePoints\")}\n </Text>\n <Text className=\"oui-text-base-contrast oui-text-[28px] oui-tracking-[0.03em] oui-leading-9\">\n {allTimePointsDisplay.currentPointsDisplay}\n </Text>\n </Flex>\n {!isMobile && (\n <Box\n className={cn(\"oui-w-[1px]\", \"oui-h-full\", \"oui-bg-white/[0.08]\")}\n />\n )}\n {isMobile && <Divider intensity={8} />}\n <Flex\n direction=\"column\"\n gap={2}\n className=\"oui-flex-1\"\n itemAlign=\"start\"\n >\n <Text className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em]\">\n {t(\"tradingPoints.stageRanking\")}\n </Text>\n <Text className=\"oui-text-base-contrast oui-text-[28px] oui-tracking-[0.03em] oui-leading-9\">\n {allTimePointsDisplay.rankingDisplay}\n </Text>\n </Flex>\n </Flex>\n\n {/* Referral Card */}\n <Flex\n p={5}\n r=\"2xl\"\n style={{ height: 104 }}\n className={cn(\n \"oui-border oui-border-line\",\n isMobile ? \"oui-w-full\" : \"oui-flex-1\",\n \"oui-h-[128px]\",\n )}\n >\n <Flex direction=\"column\" gap={4} className=\"oui-w-full\">\n <Flex gap={2} itemAlign=\"center\" className=\"oui-w-full\">\n <Text className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em]\">\n {t(\"tradingPoints.referralCode\")}\n </Text>\n <Flex\n gap={2}\n itemAlign=\"center\"\n justify=\"end\"\n className=\"oui-flex-1\"\n >\n <Text className=\"oui-text-base-contrast oui-text-sm oui-tracking-[0.03em]\">\n {refCode}\n </Text>\n <CopyIcon\n size={16}\n className=\"oui-text-white hover:oui-cursor-pointer hover:oui-opacity-80 oui-transition-opacity\"\n onClick={onCopyCode}\n />\n </Flex>\n </Flex>\n <Flex gap={2} itemAlign=\"start\" className=\"oui-w-full\">\n <Text className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em] oui-flex-shrink-0\">\n {t(\"tradingPoints.referralLink\")}\n </Text>\n <Flex\n gap={2}\n itemAlign=\"start\"\n className=\"oui-flex-1 oui-min-w-0\"\n >\n <Text className=\"oui-text-base-contrast oui-text-sm oui-tracking-[0.03em] oui-flex-1 oui-truncate oui-text-right\">\n {refLink}\n </Text>\n <CopyIcon\n size={16}\n className=\"oui-text-white hover:oui-cursor-pointer hover:oui-opacity-80 oui-transition-opacity\"\n onClick={onCopyLink}\n />\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n );\n};\n","import { FC, useCallback } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n Box,\n Flex,\n Text,\n cn,\n useScreen,\n Divider,\n Button,\n Tooltip,\n toast,\n} from \"@orderly.network/ui\";\n// import { AuthGuard } from \"@orderly.network/ui-connector\";\nimport { usePoints } from \"../../hooks/usePointsData\";\nimport { RouteOption } from \"./page\";\n\ntype UserProps = {\n onRouteChange: (option: RouteOption) => void;\n};\n\nexport const User: FC<UserProps> = ({ onRouteChange }) => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const {\n refLink,\n selectedTimeRange,\n setSelectedTimeRange,\n pointsDisplay,\n userStatistics,\n isCurrentStageCompleted,\n } = usePoints();\n\n const timeRangeOptions = [\n { value: \"this_week\" as const, label: t(\"tradingPoints.thisWeek\") },\n { value: \"last_week\" as const, label: t(\"tradingPoints.lastWeek\") },\n { value: \"all_time\" as const, label: t(\"tradingPoints.all\") },\n ];\n\n if (isCurrentStageCompleted) {\n if (selectedTimeRange !== \"all_time\") {\n setSelectedTimeRange(\"all_time\");\n }\n timeRangeOptions.splice(0, 2);\n }\n\n const timeRangeButtonClass = cn(\n \"oui-inline-flex oui-items-center oui-justify-center oui-whitespace-nowrap\",\n \"oui-box-content oui-rounded oui-px-3 oui-h-7\",\n \"oui-font-medium oui-text-2xs oui-text-base-contrast-36\",\n \"hover:oui-text-base-contrast-54 hover:oui-bg-base-5\",\n \"oui-bg-base-7\",\n \"data-[state=active]:oui-bg-base-5 data-[state=active]:oui-text-base-contrast\",\n \"oui-transition-all focus-visible:oui-outline-none\",\n \"focus-visible:oui-ring-2 focus-visible:oui-ring-ring focus-visible:oui-ring-offset-2\",\n \"disabled:oui-pointer-events-none disabled:oui-opacity-50\",\n );\n\n const currentPointsDisplay = pointsDisplay.currentPointsDisplay;\n const rankingDisplay = pointsDisplay.rankingDisplay;\n const tradingPointsDisplay = pointsDisplay.tradingPointsDisplay;\n const pnlPointsDisplay = pointsDisplay.pnlPointsDisplay;\n const referralPointsDisplay = pointsDisplay.referralPointsDisplay;\n\n const formatReferralBoost = (value: number | null | undefined) => {\n return value !== null && value !== undefined ? value : \"--\";\n };\n\n const goToPerp = useCallback(() => {\n onRouteChange({\n href: \"/perp\",\n name: \"Perp\",\n });\n }, [onRouteChange]);\n\n const onCopy = async () => {\n try {\n await navigator.clipboard.writeText(refLink);\n toast.success(t(\"common.copy.copied\"));\n } catch (error) {\n console.error(\"Failed to copy link:\", error);\n }\n };\n\n const userStats = (\n <>\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n gap={4}\n itemAlign=\"stretch\"\n className=\"oui-w-full\"\n >\n <Flex\n direction=\"column\"\n gap={2}\n className={isMobile ? \"oui-w-full\" : \"oui-w-[200px]\"}\n >\n <Flex direction=\"column\" gap={3} p={4} r=\"2xl\">\n <Text className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em] oui-decoration-dotted oui-text-center oui-w-full\">\n {t(\"tradingPoints.currentPoints\")}\n </Text>\n <Text className=\"oui-text-transparent oui-bg-clip-text oui-gradient-brand oui-text-3xl oui-tracking-[0.03em] oui-text-center oui-w-full oui-h-10 oui-leading-10\">\n {currentPointsDisplay}\n </Text>\n </Flex>\n <Divider className=\"oui-w-full\" intensity={8} />\n <Flex direction=\"column\" gap={3} p={4} r=\"2xl\">\n <Text className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em] oui-text-center oui-w-full\">\n {t(\"tradingPoints.ranking\")}\n </Text>\n <Text className=\"oui-text-transparent oui-bg-clip-text oui-gradient-brand oui-text-3xl oui-tracking-[0.03em] oui-text-center oui-w-full oui-h-10 oui-leading-10\">\n {rankingDisplay}\n </Text>\n </Flex>\n </Flex>\n\n {!isMobile && (\n <Divider\n className=\"oui-self-stretch\"\n intensity={8}\n direction=\"vertical\"\n />\n )}\n {isMobile && <Divider intensity={8} />}\n\n <Flex\n direction=\"column\"\n className={isMobile ? \"oui-w-full\" : \"oui-flex-1\"}\n >\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n gap={6}\n className=\"oui-w-full oui-h-full\"\n >\n <Flex\n direction=\"column\"\n gap={3}\n itemAlign=\"center\"\n justify=\"center\"\n p={4}\n r=\"xl\"\n intensity={800}\n className={cn(\n \"oui-backdrop-blur-sm\",\n isMobile ? \"oui-w-full\" : \"oui-flex-1 oui-h-full\",\n )}\n >\n <Tooltip\n content={t(\"tradingPoints.tradePointsTooltip\")}\n className=\"oui-max-w-[300px] oui-bg-primary-darken\"\n >\n <Text\n className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em] oui-text-center oui-w-full\n \"\n style={{\n textDecorationLine: \"underline\",\n textDecorationStyle: \"dotted\",\n textUnderlineOffset: \"30%\",\n }}\n >\n {t(\"tradingPoints.tradePoints\")}\n </Text>\n </Tooltip>\n\n <Text className=\"oui-text-base-contrast oui-text-[28px] oui-tracking-[0.03em] oui-text-center oui-w-full oui-leading-9\">\n {tradingPointsDisplay}\n </Text>\n <Button size=\"md\" onClick={goToPerp}>\n <Text>{t(\"tradingPoints.tradeNow\")}</Text>\n </Button>\n </Flex>\n\n <Flex\n direction=\"column\"\n gap={3}\n itemAlign=\"center\"\n justify=\"center\"\n p={4}\n r=\"xl\"\n intensity={800}\n className={cn(\n \"oui-backdrop-blur-sm\",\n isMobile ? \"oui-w-full\" : \"oui-flex-1 oui-h-full\",\n )}\n >\n <Tooltip\n content={t(\"tradingPoints.pnlPointsTooltip\")}\n className=\"oui-max-w-[300px] oui-bg-primary-darken\"\n >\n <Text\n className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em] oui-text-center oui-w-full\"\n style={{\n textDecorationLine: \"underline\",\n textDecorationStyle: \"dotted\",\n textUnderlineOffset: \"30%\",\n }}\n >\n {t(\"tradingPoints.pnlPoints\")}\n </Text>\n </Tooltip>\n <Text className=\"oui-text-base-contrast oui-text-[28px] oui-tracking-[0.03em] oui-text-center oui-w-full oui-leading-9\">\n {pnlPointsDisplay}\n </Text>\n <Button size=\"md\" onClick={goToPerp}>\n <Text>{t(\"tradingPoints.tradeNow\")}</Text>\n </Button>\n </Flex>\n\n <Flex\n direction=\"column\"\n gap={3}\n itemAlign=\"center\"\n justify=\"center\"\n p={4}\n r=\"xl\"\n intensity={800}\n className={cn(\n \"oui-backdrop-blur-sm\",\n isMobile ? \"oui-w-full\" : \"oui-flex-1 oui-h-full\",\n )}\n >\n <Tooltip\n content={t(\"tradingPoints.referralPointsTooltip\", {\n l1: formatReferralBoost(userStatistics?.l1_referral_boost),\n l2: formatReferralBoost(userStatistics?.l2_referral_boost),\n })}\n className=\"oui-max-w-[300px] oui-bg-primary-darken\"\n >\n <Text\n className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em] oui-text-center oui-w-full\"\n style={{\n textDecorationLine: \"underline\",\n textDecorationStyle: \"dotted\",\n textUnderlineOffset: \"30%\",\n }}\n >\n {t(\"tradingPoints.referralPoints\")}\n </Text>\n </Tooltip>\n <Text className=\"oui-text-base-contrast oui-text-[28px] oui-tracking-[0.03em] oui-text-center oui-w-full oui-leading-9\">\n {referralPointsDisplay}\n </Text>\n <Button variant=\"outlined\" size=\"md\" onClick={onCopy}>\n <Text className=\"oui-text-base-contrast-54\">\n {t(\"tradingPoints.copyLink\")}\n </Text>\n </Button>\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </>\n );\n\n return (\n <Flex direction=\"column\" gap={6} className=\"oui-w-full\">\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n gap={isMobile ? 4 : 0}\n itemAlign={isMobile ? \"start\" : \"center\"}\n justify=\"between\"\n className=\"oui-w-full\"\n >\n <Text\n className={cn(\n \"oui-text-base-contrast\",\n isMobile ? \"oui-text-2xl\" : \"oui-text-3xl\",\n \"oui-tracking-[0.03em]\",\n )}\n >\n {t(\"tradingPoints.myPoints\")}\n </Text>\n <Flex gap={2} itemAlign=\"center\">\n {timeRangeOptions.map((option) => (\n <button\n key={option.value}\n onClick={() => setSelectedTimeRange(option.value)}\n data-state={\n selectedTimeRange === option.value ? \"active\" : \"inactive\"\n }\n className={timeRangeButtonClass}\n >\n {option.label}\n </button>\n ))}\n </Flex>\n </Flex>\n <Box p={6} r=\"2xl\" className=\"oui-border oui-border-line oui-w-full\">\n {/* <AuthGuard buttonProps={{ size: \"lg\", fullWidth: true }}>\n {userStats}\n </AuthGuard> */}\n {userStats}\n </Box>\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport { PointsProvider } from \"../../hooks/usePointsData\";\nimport Main from \"./main\";\n\nexport type RouteOption = {\n href: string;\n name: string;\n scope?: string;\n target?: string;\n};\n\nexport type PointSystemPageProps = {\n onRouteChange: (option: RouteOption) => void;\n};\n\nexport const PointSystemPage: FC<PointSystemPageProps> = (props) => {\n return (\n <PointsProvider>\n <Main onRouteChange={props.onRouteChange} />\n </PointsProvider>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/usePointsData/usePointsData.ts","../src/hooks/usePointsData/provider.tsx","../src/pages/points/main.tsx","../src/components/leaderboard/generalLeaderboard/generalLeaderboard.script.ts","../src/utils.ts","../src/components/leaderboard/generalLeaderboard/generalLeaderboard.ui.tsx","../src/components/ranking/shared/ranking.ui.tsx","../src/components/ranking/shared/column.tsx","../src/components/ranking/shared/util.ts","../src/components/ranking/generalRanking/generalRanking.script.ts","../src/hooks/useEndReached.ts","../src/components/ranking/generalRanking/generalRanking.widget.tsx","../src/components/leaderboard/generalLeaderboard/generalLeaderboard.widget.tsx","../src/pages/points/countdown.tsx","../src/pages/points/faq.tsx","../src/pages/points/intro.tsx","../src/pages/points/user.tsx","../src/pages/points/page.tsx"],"names":["Flex","cn","useScreen","useCallback","useEffect","useMemo","useState","dateRange","Box","commify","jsx","Fragment","jsxs","column","useRef","useConfig","useQuery","useTranslation","Text","targetDate","now","Divider","ChevronDownIcon","toast"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AACP,SAAS,SAAS,0BAA0B;AAyCrC,SAAS,gBAAqC;AACnD,QAAM,WAAW,UAAU,UAAU;AACrC,QAAM,CAAC,cAAc,eAAe,IAAI;AAAA,IACtC;AAAA,EACF;AACA,QAAM,CAAC,mBAAmB,oBAAoB,IAC5C,SAA0B,WAAW;AAEvC,QAAM,EAAE,MAAM,QAAQ,WAAW,gBAAgB,IAAI;AAAA,IACnD,WAAW,sCAAsC,QAAQ,KAAK;AAAA,IAC9D;AAAA,MACE,WAAW,CAAC,QAAQ;AAClB,YAAI,KAAK,MAAM;AAEb,cAAI,KAAK;AAAA,YACP,CAAC,GAAc,MAAiB,EAAE,eAAe,EAAE;AAAA,UACrD;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MACA,mBAAmB;AAAA,IACrB;AAAA,EACF;AAEA,YAAU,MAAM;AACd,QACE,CAAC,QAAQ,QACT,OAAO,KAAK,WAAW,KACvB,iBAAiB,QACjB;AACA;AAAA,IACF;AAGA,QAAI,gBAAgB,OAAO,KAAK,CAAC;AAEjC,UAAM,cAAc,OAAO,KAAK,KAAK,CAAC,UAAU,MAAM,WAAW,QAAQ;AACzE,QAAI,aAAa;AACf,sBAAgB;AAAA,IAClB,OAAO;AACL,YAAM,eAAe,CAAC,GAAG,OAAO,IAAI,EACjC,QAAQ,EACR,KAAK,CAAC,UAAU,MAAM,WAAW,SAAS;AAC7C,UAAI,cAAc;AAChB,wBAAgB;AAAA,MAClB,OAAO;AACL,cAAM,iBAAiB,OAAO,KAAK;AAAA,UACjC,CAAC,UAAU,MAAM,WAAW;AAAA,QAC9B;AACA,YAAI,gBAAgB;AAClB,0BAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,oBAAgB,aAAa;AAAA,EAC/B,GAAG,CAAC,QAAQ,YAAY,CAAC;AAEzB,QAAM,EAAE,MAAM,gBAAgB,WAAW,wBAAwB,IAC/D;AAAA,IACE,iBAAiB,SACb,2CAA2C,aAAa,QAAQ,KAChE;AAAA,IACJ;AAAA,MACE,WAAW,CAAC,QAAQ;AAAA,MACpB,mBAAmB;AAAA,IACrB;AAAA,EACF;AAEF,QAAM,EAAE,MAAM,aAAa,IAAI;AAAA,IAC7B;AAAA,IACA;AAAA,MACE,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,GAAG;AAAA,IACL;AAAA,EACF;AAEA,QAAM,YAAY,QAAQ,MAAM;AAC9B,UAAM,QAAQ,cAAc,eAAe;AAC3C,QAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,aAAO;AAAA,IACT;AACA,WAAO,MAAM,CAAC;AAAA,EAChB,GAAG,CAAC,cAAc,eAAe,cAAc,CAAC;AAEhD,QAAM,UAAU,QAAQ,MAAM;AAC5B,WAAO,WAAW,QAAQ;AAAA,EAC5B,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,UAAU,QAAQ,MAAM;AAC5B,QAAI,CAAC,aAAa,CAAC,UAAU,MAAM;AACjC,aAAO;AAAA,IACT;AACA,UAAM,kBAAkB,OAAO,SAAS;AACxC,WAAO,GAAG,eAAe,QAAQ,UAAU,IAAI;AAAA,EACjD,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,gBAAgB;AAAA,IACpB,CAAC,SAAiE;AAChE,UAAI,CAAC,gBAAgB,CAAC;AAAU,eAAO;AACvC,YAAM,eAAe,IAAI,gBAAgB;AACzC,mBAAa,IAAI,QAAQ,KAAK,KAAK,SAAS,CAAC;AAC7C,mBAAa,IAAI,QAAQ,KAAK,SAAS,SAAS,CAAC;AACjD,mBAAa,IAAI,SAAS,OAAO,aAAa,QAAQ,CAAC;AACvD,mBAAa,IAAI,UAAU,KAAK,aAAa,iBAAiB;AAC9D,mBAAa,IAAI,aAAa,OAAO,QAAQ,CAAC;AAC9C,aAAO,8BAA8B,aAAa,SAAS,CAAC;AAAA,IAC9D;AAAA,IACA,CAAC,UAAU,cAAc,iBAAiB;AAAA,EAC5C;AAEA,QAAM,YAAY,mBAAmB;AAErC,QAAM,eACJ,CAAC,oBAAoB,CAAC,QAAQ,QAAQ,OAAO,KAAK,WAAW;AAE/D,QAAM,eAAe,CAAC,UAA0B;AAC9C,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC,aAAO;AAAA,IACT;AACA,WAAO,mBAAmB,OAAO,CAAC;AAAA,EACpC;AAEA,QAAM,uBAAuB;AAAA,IAC3B,CACE,cAOG;AACH,UAAI,CAAC;AAAW,eAAO;AACvB,aACE,UAAU,gBAAgB,UAAU,YAAY,UAAU;AAAA,IAE9D;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,QAAuB,MAAM;AACjD,QAAI,CAAC,gBAAgB;AACnB,aAAO;AAAA,QACL,sBAAsB;AAAA,QACtB,sBAAsB;AAAA,QACtB,kBAAkB;AAAA,QAClB,uBAAuB;AAAA,QACvB,gBAAgB;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,oBAAoB,eAAe,kBAAkB;AAC3D,UAAM,oBAAoB,eAAe,kBAAkB;AAE3D,QAAI;AACJ,QAAI;AAEJ,QAAI,sBAAsB,YAAY;AAEpC,0BAAoB;AAAA,QAClB,eAAe,eAAe;AAAA,QAC9B,WAAW,eAAe;AAAA,QAC1B,gBAAgB,eAAe;AAAA,MACjC;AACA,gBAAU,eAAe;AAAA,IAC3B,WAAW,sBAAsB,aAAa;AAC5C,0BAAoB;AACpB,gBAAU,mBAAmB;AAAA,IAC/B,OAAO;AAEL,0BAAoB;AACpB,gBAAU,mBAAmB;AAAA,IAC/B;AAEA,UAAM,gBAAgB,qBAAqB,iBAAiB,KAAK;AAEjE,WAAO;AAAA,MACL,sBAAsB,aAAa,aAAa;AAAA,MAChD,sBAAsB,aAAa,mBAAmB,aAAa;AAAA,MACnE,kBAAkB,aAAa,mBAAmB,SAAS;AAAA,MAC3D,uBAAuB,aAAa,mBAAmB,cAAc;AAAA,MACrE,gBACE,YAAY,QAAQ,YAAY,SAAY,OAAO,QAAQ,OAAO;AAAA,IACtE;AAAA,EACF,GAAG,CAAC,gBAAgB,mBAAmB,oBAAoB,CAAC;AAG5D,QAAM,uBAAuB,QAAuB,MAAM;AACxD,QAAI,CAAC,gBAAgB;AACnB,aAAO;AAAA,QACL,sBAAsB;AAAA,QACtB,sBAAsB;AAAA,QACtB,kBAAkB;AAAA,QAClB,uBAAuB;AAAA,QACvB,gBAAgB;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,gBACJ,qBAAqB;AAAA,MACnB,eAAe,eAAe;AAAA,MAC9B,WAAW,eAAe;AAAA,MAC1B,gBAAgB,eAAe;AAAA,IACjC,CAAC,KAAK;AAER,WAAO;AAAA,MACL,sBAAsB,aAAa,aAAa;AAAA,MAChD,sBAAsB,aAAa,eAAe,aAAa;AAAA,MAC/D,kBAAkB,aAAa,eAAe,SAAS;AAAA,MACvD,uBAAuB,aAAa,eAAe,cAAc;AAAA,MACjE,gBACE,eAAe,eAAe,QAC9B,eAAe,eAAe,SAC1B,OACA,QAAQ,eAAe,UAAU;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,gBAAgB,oBAAoB,CAAC;AAEzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,uBAAuB,cAAc,WAAW;AAAA,IAChD,yBAAyB,cAAc,WAAW;AAAA,EACpD;AACF;;;ACxSA,SAAgB,eAAe,kBAAiC;AAgB5D;AAVJ,IAAM,gBAAgB,cAA8C,MAAS;AAMtE,IAAM,iBAA0C,CAAC,EAAE,SAAS,MAAM;AACvE,QAAM,QAAQ,cAAkB;AAEhC,SACE,oBAAC,cAAc,UAAd,EAAuB,OAAe,UAAS;AAEpD;AAEO,SAAS,YAAgC;AAC9C,QAAM,UAAU,WAAW,aAAa;AACxC,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,SAAO;AACT;;;ACzBA,SAAS,QAAAA,OAAM,MAAAC,KAAI,aAAAC,kBAAiB;;;ACDpC,SAAS,eAAAC,cAAa,aAAAC,YAAW,WAAAC,UAAS,YAAAC,iBAAgB;AAC1D,SAAS,wBAAwB;;;ACDjC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,IAAM,eAAe,CAAC,cAAsB;AACjD,SAAO;AAAA,IACL,MAAM,QAAQ,oBAAI,KAAK,GAAG,YAAY,CAAC;AAAA,IACvC,IAAI,oBAAI,KAAK;AAAA,EACf;AACF;AAOO,IAAM,kBAAkB,CAAC,SAAuB;AACrD,SAAO,OAAO,MAAM,YAAY;AAClC;AAuDO,SAAS,qBAAqB,mBAGf;AACpB,QAAM,YACJ,OAAO,kBAAkB,eAAe,WACpC,IAAI,KAAK,kBAAkB,UAAU,IACrC,kBAAkB;AAExB,QAAM,UACJ,OAAO,kBAAkB,aAAa,WAClC,IAAI,KAAK,kBAAkB,QAAQ,IACnC,kBAAkB;AAExB,QAAM,SAA4B,CAAC;AACnC,MAAI,mBAAmB,IAAI,KAAK,SAAS;AACzC,MAAI,aAAa;AAEjB,SAAO,SAAS,kBAAkB,OAAO,GAAG;AAE1C,UAAM,iBAAiB,QAAQ,kBAAkB,CAAC;AAIlD,UAAM,gBAAgB,QAAQ,gBAAgB,OAAO,IACjD,IAAI,KAAK,QAAQ,QAAQ,IAAI,CAAC,IAC9B;AAEJ,WAAO,KAAK;AAAA,MACV,MAAM,IAAI,KAAK,gBAAgB;AAAA,MAC/B,IAAI;AAAA,MACJ,OAAO,QAAQ,UAAU;AAAA,IAC3B,CAAC;AAGD,QAAI,CAAC,SAAS,eAAe,OAAO,GAAG;AACrC;AAAA,IACF;AAGA,QAAI,eAAe,GAAG;AAEpB,YAAM,eAAe,QAAQ,gBAAgB,CAAC;AAC9C,YAAM,OAAO,aAAa,eAAe;AACzC,YAAM,QAAQ,aAAa,YAAY;AACvC,YAAM,OAAO,aAAa,WAAW;AACrC,yBAAmB,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC;AAAA,IACrE,OAAO;AAEL,YAAM,eAAe,QAAQ,gBAAgB,CAAC;AAC9C,YAAM,OAAO,aAAa,eAAe;AACzC,YAAM,QAAQ,aAAa,YAAY;AACvC,YAAM,OAAO,aAAa,WAAW;AACrC,yBAAmB,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC;AAAA,IACrE;AAEA;AAGA,QAAI,aAAa,KAAK;AAIpB;AAAA,IACF;AAAA,EACF;AASA,SAAO;AACT;AAQO,SAAS,sBACd,cACA,aAAmB,oBAAI,KAAK,GACJ;AAExB,QAAM,mBAAmB,aAAa;AAAA,IACpC,CAAC,UAAU,MAAM,UAAU;AAAA,EAC7B;AAGA,aAAW,SAAS,kBAAkB;AAEpC,UAAM,YAAY,IAAI,KAAK,MAAM,IAAI;AACrC,UAAM,UAAU,IAAI,KAAK,MAAM,EAAE;AAGjC,QAAI,iBAAiB,YAAY,EAAE,OAAO,WAAW,KAAK,QAAQ,CAAC,GAAG;AACpE,aAAO;AAAA,IACT;AAAA,EACF;AAIA,QAAM,aAAa,WAAW,QAAQ;AACtC,MAAI,qBAA6C;AACjD,MAAI,cAAc;AAElB,aAAW,SAAS,kBAAkB;AACpC,UAAM,YAAY,IAAI,KAAK,MAAM,IAAI;AACrC,UAAM,gBAAgB,UAAU,QAAQ;AAGxC,QAAI,gBAAgB,YAAY;AAC9B,YAAM,MAAM,gBAAgB;AAC5B,UAAI,MAAM,aAAa;AACrB,sBAAc;AACd,6BAAqB;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,aAAa,KAAK,KAAK,KAAK;AAClC,MAAI,sBAAsB,eAAe,YAAY;AACnD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAQO,SAAS,yBACd,cACA,aAAmB,oBAAI,KAAK,GACC;AAE7B,QAAM,gBAAgB,sBAAsB,cAAc,UAAU;AACpE,MAAI,eAAe;AACjB,WAAO;AAAA,EACT;AAGA,SACE,aAAa,KAAK,CAAC,UAAU,MAAM,UAAU,UAAU,KACvD,aAAa,aAAa,SAAS,CAAC;AAExC;;;AD9MO,SAAS,4BACd,SACA;AACA,QAAM,EAAE,kBAAkB,IAAI,WAAW,CAAC;AAE1C,QAAM,eAAeD,SAAQ,MAAM;AACjC,QAAI,CAAC;AAAmB,aAAO,CAAC;AAChC,WAAO,qBAAqB,iBAAiB;AAAA,EAC/C,GAAG,CAAC,iBAAiB,CAAC;AAEtB,QAAM,wBAAwBA,SAAQ,MAAM;AAC1C,WAAO,yBAAyB,YAAY;AAAA,EAC9C,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,CAAC,WAAW,YAAY,IAAIC;AAAA;AAAA,EAElC;AACA,QAAM,cAAc,UAAU,EAAE,cAAc,sBAAsB,CAAC;AACrE,QAAM,cAAc,UAAU;AAE9B,QAAM,uBAAuBD,SAAQ,MAAM;AACzC,WAAO,CAAC,CAAC;AAAA,EACX,GAAG,CAAC,iBAAiB,CAAC;AAEtB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,UAAU,EAAE,aAAa,GAAiC;AAEjE,QAAM,CAAC,WAAW,YAAY,IAAIC,UAA6B,EAAE;AAEjE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAoB,aAAa,EAAE,CAAC;AAEtE,QAAM,kBAAkB,CAAC,QAAqB;AAC5C,iBAAa,GAAG;AAChB,iBAAa,aAAa,GAAG,CAAC;AAAA,EAChC;AAEA,EAAAF,WAAU,MAAM;AACd,iBAAa,gBAAgB,aAAa,EAAE,CAAC;AAAA,EAC/C,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,WAAW,CAAC,WAAyC;AACzD,QAAI,OAAO,SAAS,aAAa;AAC/B,YAAM,eAAe,OAAO;AAC5B,mBAAa,YAAY;AAEzB,UAAI,aAAa,QAAQ,aAAa,IAAI;AACxC,cAAM,YACJ,KAAK,IAAI,iBAAiB,aAAa,MAAM,aAAa,EAAE,CAAC,IAAI;AAEnE,cAAMG,aAAY,aAAa,SAAS;AACxC,YACE,gBAAgBA,WAAU,IAAI,MAC5B,gBAAgB,aAAa,IAAI,KACnC,gBAAgBA,WAAU,EAAE,MAAM,gBAAgB,aAAa,EAAE,GACjE;AACA,uBAAa,SAAgB;AAAA,QAC/B,OAAO;AACL,uBAAa,IAAI;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAcF,SAAQ,MAAM;AAChC,UAAM,kBAAkB;AAAA,MACtB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAEA,WAAO,CAAC,eAAe;AAAA,EACzB,GAAG,CAAC,SAAS,CAAC;AAEd,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,YAAY;AACnB,QAAM,CAAC,aAAa,cAAc,IAAIC,UAAS,EAAE;AACjD,QAAM,sBAAsBH,aAAY,CAAC,UAAkB;AACzD,mBAAe,KAAK;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmBA,aAAY,MAAM;AACzC,mBAAe,EAAE;AAAA,EACnB,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AEtIA,SAAS,MAAAF,KAAI,OAAAO,MAAK,aAAAN,kBAAiB;;;ACDnC,SAAa,eAAAC,oBAAmB;AAChC;AAAA,EACE,MAAAF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,aAAAC;AAAA,OACK;;;ACRP,SAAoB,WAAAG,gBAAe;AACnC,SAAS,sBAAsB;AAC/B,SAAS,MAAc,KAAK,IAAI,OAAO,iBAAiB;AACxD,SAAS,WAAAI,gBAAe;;;;;;;;;;;;ACHjB,SAAS,cAAc,UAAkB,UAAkB;AAChE,SAAO,SAAS,YAAY,MAAM,SAAS,YAAY;AACzD;AAEO,SAAS,wBAAwB,SAAiB;AACvD,SAAO,mBAAmB,SAAS,YAAY,CAAC;AAClD;;;AD4ByB,SAYb,UAZa,OAAAC,MAYb,YAZa;AAvBlB,IAAM,oBAAoB,CAC/B,QACA,SACA,YACA,SACG;AACH,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,EAAE,SAAS,IAAI,UAAU;AAE/B,SAAOL,SAAQ,MAAM;AACnB,UAAM,UAAU;AAAA,MACd;AAAA,QACE,OAAO,EAAE,yBAAyB;AAAA,QAClC,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ,CAAC,OAAe,WAAgB;AACtC,gBAAM,QAAQ,OAAO,QAAQ,wBAAwB,OAAQ;AAE7D,cAAI;AACJ,cAAI,WAAsB;AAE1B,cAAI,CAAC,OAAO;AACV,gBAAI,UAAU,GAAG;AACf,yBAAW,gBAAAK,KAAC,iBAAc;AAC1B,yBAAW;AAAA,YACb,WAAW,UAAU,GAAG;AACtB,yBAAW,gBAAAA,KAAC,kBAAe;AAC3B,yBAAW;AAAA,YACb,WAAW,UAAU,GAAG;AACtB,yBAAW,gBAAAA,KAAC,iBAAc;AAC1B,yBAAW;AAAA,YACb;AAAA,UACF;AAEA,iBACE,iCACG;AAAA,wBACC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,KAAK,GAAG,KAAK;AAAA,gBACb,WAAW;AAAA,kBACT;AAAA,kBACA;AAAA,kBACA;AAAA;AAAA,kBAEA;AAAA,gBACF;AAAA;AAAA,YACF;AAAA,YAEF,gBAAAA,KAAC,SAAI,WAAU,gBACZ,sBACC,gBAAAA,KAAC,OAAI,OAAO,IAAI,IAAI,GAAG,WAAU,mBAC9B,iBACH,GAEJ;AAAA,aACF;AAAA,QAEJ;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAO,EAAE,gBAAgB;AAAA,QACzB,WAAW;AAAA,QACX,QAAQ,CAAC,OAAe,WAAgB;AACtC,gBAAM,QAAQ,OAAO,QAAQ,wBAAwB,OAAQ;AAC7D,cAAI,YAAY,OAAO;AACrB,mBAAO,gBAAAA,KAAC,QAAK,iBAAG;AAAA,UAClB;AAEA,iBACE,gBAAAA,KAAA,YACE;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAM,qDAAqD,KAAK,cAAc,OAAO,SAAS;AAAA,cAC9F,QAAO;AAAA,cACP,KAAI;AAAA,cAEJ;AAAA,gCAAAA;AAAA,kBAAC,KAAK;AAAA,kBAAL;AAAA,oBACC,MAAK;AAAA,oBAEL,QAAQ,CAAC,MAAM;AACb,wBAAE,eAAe;AACjB,wBAAE,gBAAgB;AAClB,gCAAU,UAAU,UAAU,KAAK;AACnC,4BAAM,QAAQ,EAAE,oBAAoB,CAAC;AAAA,oBACvC;AAAA,oBACA,WAAU;AAAA,oBAET;AAAA;AAAA,kBATI,OAAO;AAAA,gBAUd;AAAA,gBACC,SAAS,gBAAAA,KAAC,QAAK,oBAAM;AAAA;AAAA;AAAA,UACxB,GACF;AAAA,QAEJ;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,WAAW;AAAA,QACX,OAAO,WAAW,UAAU;AAAA,QAC5B,QAAQ,CAAC,UAA2B;AAClC,cAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;AACzD,mBAAO;AAAA,UACT;AACA,iBAAO,gBAAAA,KAAC,QAAM,UAAAD,SAAQ,OAAO,CAAC,GAAE;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,QAAQ;AAAA,MAAO,CAAC,WACrB,QAAQ,SAAS,OAAO,SAAgC;AAAA,IAC1D;AAAA,EACF,GAAG,CAAC,GAAG,UAAU,SAAS,QAAQ,YAAY,IAAI,CAAC;AACrD;AAEA,IAAM,gBAAgB,MAAM;AAC1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MAEN;AAAA,wBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,QACA,gBAAAA,KAAC,UACC;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,eAAc;AAAA,YAEd;AAAA,8BAAAA,KAAC,UAAK,WAAU,WAAU;AAAA,cAC1B,gBAAAA,KAAC,UAAK,QAAO,YAAW,WAAU,WAAU;AAAA,cAC5C,gBAAAA,KAAC,UAAK,QAAO,YAAW,WAAU,WAAU;AAAA,cAC5C,gBAAAA,KAAC,UAAK,QAAO,YAAW,WAAU,WAAU;AAAA,cAC5C,gBAAAA,KAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA;AAAA;AAAA,QACvC,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAM,iBAAiB,MAAM;AAC3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MAEN;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,QACA,gBAAAA,KAAC,UACC;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,eAAc;AAAA,YAEd;AAAA,8BAAAA,KAAC,UAAK,WAAU,WAAU;AAAA,cAC1B,gBAAAA,KAAC,UAAK,QAAO,YAAW,WAAU,WAAU;AAAA,cAC5C,gBAAAA,KAAC,UAAK,QAAO,YAAW,WAAU,WAAU;AAAA,cAC5C,gBAAAA,KAAC,UAAK,QAAO,YAAW,WAAU,WAAU;AAAA,cAC5C,gBAAAA,KAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA;AAAA;AAAA,QACvC,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAM,gBAAgB,MAAM;AAC1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MAEN;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,QACA,gBAAAA,KAAC,UACC;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,IAAG;AAAA,YACH,eAAc;AAAA,YAEd;AAAA,8BAAAA,KAAC,UAAK,WAAU,WAAU;AAAA,cAC1B,gBAAAA,KAAC,UAAK,QAAO,OAAM,WAAU,WAAU;AAAA,cACvC,gBAAAA,KAAC,UAAK,QAAO,SAAQ,WAAU,WAAU;AAAA,cACzC,gBAAAA,KAAC,UAAK,QAAO,QAAO,WAAU,WAAU;AAAA,cACxC,gBAAAA,KAAC,UAAK,QAAO,QAAO,WAAU,WAAU;AAAA,cACxC,gBAAAA,KAAC,UAAK,QAAO,KAAI,WAAU,WAAU;AAAA;AAAA;AAAA,QACvC,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;ADzIM,qBAAAC,WACE,OAAAD,MADF,QAAAE,aAAA;AA5DC,IAAM,UAA4B,CAAC,UAAU;AAClD,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA,MAAM;AAAA,EACR;AACA,QAAM,EAAE,SAAS,IAAIV,WAAU;AAE/B,QAAM,QAAQC;AAAA,IACZ,CAAC,QAAqB,UAAkB;AACtC,YAAM,QAAQ,OAAO,QAAQ,wBAAwB,MAAM,OAAQ;AACnE,YAAM,UAAU,OAAO,SAAS;AAChC,YAAM,WAAW,OAAO,SAAS;AACjC,YAAM,UAAU,OAAO,SAAS;AAEhC,YAAM,SAAS,WAAW,YAAY;AAEtC,aAAO;AAAA,QACL,WAAWF;AAAA,UACT;AAAA;AAAA,UAEA;AAAA,UACA;AAAA;AAAA,YAEI;AAAA,cACAA;AAAA,YACE,UAAU;AAAA,YACV,WACE;AAAA,YACF,YACE;AAAA,YACF,WACE;AAAA,UACJ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,MAAM,OAAO;AAAA,EAChB;AAEA,QAAM,SAASE;AAAA,IACb,CAACU,SAAqC,WAAwB;AAC5D,YAAM,gBAAgBA,QAAO,iBAAiB;AAC9C,YAAM,eAAeA,QAAO,gBAAgB;AAC5C,YAAM,SAAS,CAAC,GAAG,GAAG,CAAC,EAAE,SAAS,OAAO,IAAc;AACvD,aAAO;AAAA,QACL,WAAWZ;AAAA,UACT,iBACE,UACA;AAAA,UACF,gBAAgB,UAAU;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,MAAM,OAAO;AAAA,EAChB;AAEA,MAAI,UAAU;AACZ,WACE,gBAAAW,MAAAD,WAAA,EACE;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,YAAY;AAAA,YACV,MAAM;AAAA,YACN,MAAM;AAAA,YACN,QAAQ;AAAA,UACV;AAAA,UACA,SAAS,MAAM;AAAA,UACf,SAAS;AAAA,UACT,UAAQ;AAAA,UACR,YAAY,MAAM;AAAA,UAClB,iBAAiB,CAAC,WAChB,OAAO,OAAO,OAAO;AAAA,UAEvB,kBAAgB;AAAA,UAChB,eAAa;AAAA,UACb;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,MAAM;AAAA,UACX,WAAU;AAAA;AAAA,MACZ;AAAA,MACC,MAAM,aAAa,MAAM,SAAS,SAAS,KAC1C,gBAAAA,KAAC,QAAK,WAAU,UAAS,SAAQ,UAAS,OAAM,QAAO,QAAQ,IAC7D,0BAAAA,KAAC,WAAQ,MAAK,MAAK,GACrB;AAAA,OAEJ;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,MAAM;AAAA,MACf,SAAS;AAAA,MACT,UAAQ;AAAA,MACR,YAAY,MAAM;AAAA,MAClB,iBAAiB,CAAC,WAAwB,OAAO,OAAO,OAAO;AAAA,MAC/D,kBAAgB;AAAA,MAChB,eAAa;AAAA,MACb,YAAY,MAAM;AAAA,MAClB,YAAY;AAAA,QACV,MAAMT;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;;;AGjJA,SAAS,eAAAE,cAAa,aAAAC,YAAW,WAAAC,UAAS,UAAAS,eAAc;AACxD,SAAS,aAAAC,YAAW,kBAAkB,YAAAC,iBAAgB;AAEtD,SAAS,eAAe,aAAAd,kBAAiB;;;ACHzC,SAAS,aAAAE,YAAW,cAAgC;AAK7C,SAAS,cACd,aACA,cACA;AACA,QAAM,WAAW,OAA6B;AAC9C,QAAM,KAAK,OAAO,YAAY;AAE9B,KAAG,UAAU;AAEb,EAAAA,WAAU,MAAM;AACd,UAAM,UAAoC;AAAA,MACxC,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAEA,UAAM,iBAAiB,CAAC,YAAyC;AAC/D,cAAQ,QAAQ,CAAC,UAAU;AACzB,YAAI,MAAM,gBAAgB;AACxB,aAAG,UAAU;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH;AAEA,aAAS,UAAU,IAAI,qBAAqB,gBAAgB,OAAO;AAEnE,WAAO,MAAM;AACX,eAAS,SAAS,WAAW;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAAA,WAAU,MAAM;AACd,QAAI,YAAY,SAAS;AACvB,eAAS,SAAS,QAAQ,YAAY,OAAO;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,YAAY,OAAO,CAAC;AAC1B;;;ADTO,SAAS,wBAAwB,SAAuC;AAC7E,QAAM,EAAE,SAAS,YAAY,IAAI,WAAW,CAAC;AAE7C,QAAM,WAAWW,WAAU,UAAU;AACrC,QAAM,EAAE,cAAc,gBAAgB,eAAe,kBAAkB,IACrE,UAAU;AACZ,QAAM,EAAE,SAAS,IAAIb,WAAU;AAE/B,QAAM,EAAE,MAAM,UAAU,SAAS,gBAAgB,IAAI,cAAc;AAAA,IACjE,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,EAAE,MAAM,UAAU,IAAIc;AAAA,IAC1B,gBAAgB,WACZ,cAAc,EAAE,MAAM,UAAU,WAAW,kBAAkB,CAAC,IAC9D;AAAA,IACJ;AAAA,MACE,WAAW,CAAC,QAAQ;AAAA,MACpB,mBAAmB;AAAA,IACrB;AAAA,EACF;AAEA,QAAM;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAAA,IACF,CAAC,WAAmB,qBAAyC;AAE3D,UAAI,oBAAoB,CAAC,iBAAiB,MAAM;AAAQ,eAAO;AAC/D,UAAI,CAAC,YAAY,CAAC;AAAc,eAAO;AACvC,aAAO,cAAc;AAAA,QACnB,MAAM,YAAY;AAAA,QAClB;AAAA,QACA,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,WAAW,CAAC,QAAQ;AAAA,MACpB,mBAAmB;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,eAAeX,SAAQ,MAAM;AACjC,QAAI,CAAC,gBAAgB;AAAS,aAAO,CAAC;AAEtC,QAAI,OAAwB;AAC5B,QAAI;AAEJ,QAAI,sBAAsB,YAAY;AACpC,aAAO,eAAe,cAAc;AACpC,eAAS,eAAe;AAAA,IAC1B,WAAW,sBAAsB,aAAa;AAC5C,aAAO,eAAe,kBAAkB,WAAW,QAAQ;AAC3D,YAAM,YAAY,eAAe,kBAAkB;AACnD,eAAS,YACL,UAAU,gBACV,UAAU,YACV,UAAU,iBACV;AAAA,IACN,WAAW,sBAAsB,aAAa;AAC5C,aAAO,eAAe,kBAAkB,WAAW,QAAQ;AAC3D,YAAM,YAAY,eAAe,kBAAkB;AACnD,eAAS,YACL,UAAU,gBACV,UAAU,YACV,UAAU,iBACV;AAAA,IACN;AAEA,WAAO;AAAA,MACL;AAAA,QACE,KAAK,wBAAwB,eAAe,OAAO;AAAA,QACnD,SAAS,eAAe;AAAA,QACxB;AAAA,QACA;AAAA,QACA,WAAW,YAAY;AAAA,MACzB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,gBAAgB,UAAU,iBAAiB,CAAC;AAEhD,QAAM,iBAAiBF;AAAA,IACrB,CAAC,SAA+B;AAC9B,aAAO,MAAM,IAAI,CAAC,MAAM,WAAW;AAAA,QACjC,GAAG;AAAA,QACH,MAAM,QAAQ,KAAK,OAAO,KAAK;AAAA,MACjC,EAAE;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,QAAQ;AAAA,EACjB;AAEA,QAAM,aAAaE,SAAQ,MAAM;AAC/B,UAAM,UAAU,MAAM,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS;AAAA,MAC9C,SAAS,IAAI;AAAA,MACb,QAAQ,IAAI;AAAA,MACZ,MAAM,IAAI;AAAA,MACV,WAAW,YAAY;AAAA,IACzB,EAAE;AAEF,UAAM,WAAW,cACb,OAAO,OAAO,CAAC,SAAS,cAAc,KAAK,SAAS,eAAe,EAAE,CAAC,IACtE;AAEJ,UAAM,YAAY,eAAe,QAAQ;AACzC,QAAI,SAAS,KAAK,CAAC,eAAe,aAAa,QAAQ;AACrD,aAAO,CAAC,GAAG,cAAc,GAAG,SAAS;AAAA,IACvC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,UAAU,aAAa,gBAAgB,MAAM,YAAY,CAAC;AAEpE,QAAM,WAAWA,SAAQ,MAAM;AAC7B,QAAI,CAAC,cAAc;AAAQ,aAAO,CAAC;AACnC,UAAM,OAAO,aAAa,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK;AAClD,UAAM,SAAS,KAAK,IAAI,CAAC,SAAS;AAAA,MAChC,SAAS,IAAI;AAAA,MACb,QAAQ,IAAI;AAAA,MACZ,WAAW,YAAY;AAAA,IACzB,EAAE;AACF,UAAM,WAAW,cACb,OAAO,OAAO,CAAC,SAAS,cAAc,KAAK,SAAS,WAAW,CAAC,IAChE;AACJ,UAAM,WAAW,eAAe,QAAQ;AACxC,QAAI,CAAC,eAAe,aAAa,QAAQ;AACvC,aAAO,CAAC,GAAG,cAAc,GAAG,QAAQ;AAAA,IACtC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,cAAc,UAAU,aAAa,gBAAgB,YAAY,CAAC;AAEtE,QAAM,cAAcS,QAA8B,IAAI;AAEtD,QAAM,aAAaT;AAAA,IACjB,MACE,gBAAgB;AAAA,MACd,OAAO,MAAM,MAAM,SAAS;AAAA,MAC5B,cAAc,MAAM,MAAM,gBAAgB;AAAA,MAC1C,kBAAkB;AAAA,IACpB,CAAC;AAAA,IACH,CAAC,MAAM,MAAM,OAAO,MAAM,MAAM,cAAc,QAAQ;AAAA,EACxD;AAEA,gBAAc,aAAa,MAAM;AAC/B,QAAI,CAAC,gBAAgB,UAAU;AAC7B,cAAQ,OAAO,CAAC;AAAA,IAClB;AAAA,EACF,CAAC;AAED,EAAAD,WAAU,MAAM;AACd,QAAI;AAAa,cAAQ,CAAC;AAAA,EAC5B,GAAG,CAAC,aAAa,OAAO,CAAC;AAEzB,EAAAA,WAAU,MAAM;AACd,YAAQ,CAAC;AAAA,EACX,GAAG,CAAC,cAAc,UAAU,OAAO,CAAC;AAEpC,EAAAA,WAAU,MAAM;AACd,YAAQ,CAAC;AACT,YAAQ,CAAC;AAAA,EACX,GAAG,CAAC,mBAAmB,SAAS,OAAO,CAAC;AAExC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,aAAa;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,gBAAgB;AAAA,EAC3B;AACF;;;AE1LS,gBAAAM,YAAA;AAHF,IAAM,uBAAsD,CAAC,UAAU;AAC5E,QAAM,EAAE,SAAS,QAAQ,GAAG,KAAK,IAAI;AACrC,QAAM,QAAQ,wBAAwB,EAAE,QAAQ,CAAC;AACjD,SAAO,gBAAAA,KAAC,WAAS,GAAG,OAAQ,GAAG,MAAM,QAAgB,MAAK,WAAU;AACtE;;;ANiBQ,gBAAAA,YAAA;AAnBD,IAAM,qBAAkD,CAAC,UAAU;AACxE,QAAM,EAAE,SAAS,IAAIR,WAAU;AAE/B,QAAM,SAAS,CAAC,QAAQ,WAAW,QAAQ;AAE3C,MAAI,UAAU;AACZ,WACE,gBAAAQ;AAAA,MAACF;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,GAAE;AAAA,QACF,WAAW;AAAA,QACX,OAAM;AAAA,QACN,WAAWP;AAAA,UACT;AAAA,UACA,MAAM;AAAA,QACR;AAAA,QACA,OAAO,MAAM;AAAA,QAEb,0BAAAS,KAAC,wBAAqB,SAAS,MAAM,aAAa,QAAgB;AAAA;AAAA,IACpE;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,GAAE;AAAA,MACF,WAAWP;AAAA,QACT;AAAA,QACA;AAAA,QACA,MAAM;AAAA,MACR;AAAA,MACA,OAAO,MAAM;AAAA,MAEb,0BAAAS,KAAC,wBAAqB,SAAS,MAAM,aAAa,QAAgB;AAAA;AAAA,EACpE;AAEJ;;;AOlCI,gBAAAA,YAAA;AARG,IAAM,2BAA8D,CACzE,UACG;AACH,QAAM,QAAQ,4BAA4B;AAAA,IACxC,mBAAmB,MAAM;AAAA,EAC3B,CAAC;AAED,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM;AAAA;AAAA,EACf;AAEJ;;;AC1BA,SAAa,YAAAJ,WAAU,aAAAF,kBAAiB;AACxC,SAAS,kBAAAa,uBAAsB;AAC/B,SAAS,OAAAT,MAAK,QAAAR,OAAM,QAAAkB,OAAM,aAAAhB,kBAAiB;AAkFnC,gBAAAQ,MAaI,QAAAE,aAbJ;AApED,IAAM,YAAqC,CAAC,EAAE,UAAU,MAAM;AACnE,QAAM,EAAE,SAAS,IAAIV,WAAU;AAC/B,QAAM,EAAE,aAAa,IAAI,UAAU;AACnC,QAAM,EAAE,EAAE,IAAIe,gBAAe;AAC7B,QAAM,CAAC,UAAU,WAAW,IAAIX,UAAmB;AAAA,IACjD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,EAAAF,WAAU,MAAM;AACd,QAAI,cAAc,WAAW,aAAa,CAAC,cAAc,YAAY;AACnE;AAAA,IACF;AAEA,UAAM,oBAAoB,MAAgB;AACxC,YAAMe,cAAa,aAAa,aAAa;AAC7C,YAAMC,QAAM,oBAAI,KAAK,GAAE,QAAQ;AAC/B,YAAM,aAAaD,cAAaC;AAEhC,UAAI,aAAa,GAAG;AAClB,eAAO;AAAA,UACL,MAAM,KAAK,MAAM,cAAc,MAAO,KAAK,KAAK,GAAG;AAAA,UACnD,OAAO,KAAK,MAAO,cAAc,MAAO,KAAK,MAAO,EAAE;AAAA,UACtD,SAAS,KAAK,MAAO,aAAa,MAAO,KAAM,EAAE;AAAA,UACjD,SAAS,KAAK,MAAO,aAAa,MAAQ,EAAE;AAAA,QAC9C;AAAA,MACF;AAEA,aAAO,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,EAAE;AAAA,IACrD;AAGA,gBAAY,kBAAkB,CAAC;AAG/B,UAAM,QAAQ,YAAY,MAAM;AAC9B,kBAAY,kBAAkB,CAAC;AAAA,IACjC,GAAG,GAAI;AAEP,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,eAAe,CAAC,QAAwB;AAC5C,WAAO,IAAI,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,EACvC;AAEA,MAAI,cAAc,WAAW,aAAa,CAAC,cAAc,YAAY;AACnE,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,aAAa,aAAa;AAC7C,QAAM,OAAM,oBAAI,KAAK,GAAE,QAAQ;AAE/B,MAAI,cAAc,KAAK;AACrB,WAAO;AAAA,EACT;AAEA,SACE,gBAAAR;AAAA,IAACZ;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAU;AAAA,MACV,SAAQ;AAAA,MACR,IAAI;AAAA,MACJ;AAAA,MAEC;AAAA,SAAC,YACA,gBAAAU;AAAA,UAACF;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,YAAY;AAAA,YACd;AAAA;AAAA,QACF;AAAA,QAEF,gBAAAE,KAACF,MAAA,EAAI,WAAU,mBAAkB,GAAG,GAClC,0BAAAI,MAACZ,OAAA,EAAK,WAAU,UAAS,KAAK,GAAG,WAAU,UACzC;AAAA,0BAAAU,KAACQ,OAAA,EAAK,WAAU,oCACb,YAAE,wBAAwB,GAC7B;AAAA,UACA,gBAAAN,MAACZ,OAAA,EAAK,KAAK,GAAG,WAAU,UAAS,SAAQ,UACvC;AAAA,4BAAAY,MAACZ,OAAA,EAAK,WAAU,UAAS,KAAK,GAAG,WAAU,UACzC;AAAA,8BAAAU,KAACQ,OAAA,EAAK,WAAU,yEACb,uBAAa,SAAS,IAAI,GAC7B;AAAA,cACA,gBAAAR,KAACQ,OAAA,EAAK,WAAU,kEACb,YAAE,oBAAoB,GACzB;AAAA,eACF;AAAA,YACA,gBAAAR,KAACF,MAAA,EAAI,WAAU,kDAAiD;AAAA,YAChE,gBAAAI,MAACZ,OAAA,EAAK,WAAU,UAAS,KAAK,GAAG,WAAU,UACzC;AAAA,8BAAAU,KAACQ,OAAA,EAAK,WAAU,yEACb,uBAAa,SAAS,KAAK,GAC9B;AAAA,cACA,gBAAAR,KAACQ,OAAA,EAAK,WAAU,kEACb,YAAE,qBAAqB,GAC1B;AAAA,eACF;AAAA,YACA,gBAAAR,KAACF,MAAA,EAAI,WAAU,kDAAiD;AAAA,YAChE,gBAAAI,MAACZ,OAAA,EAAK,WAAU,UAAS,KAAK,GAAG,WAAU,UACzC;AAAA,8BAAAU,KAACQ,OAAA,EAAK,WAAU,yEACb,uBAAa,SAAS,OAAO,GAChC;AAAA,cACA,gBAAAR,KAACQ,OAAA,EAAK,WAAU,kEACb,YAAE,uBAAuB,GAC5B;AAAA,eACF;AAAA,YACA,gBAAAR,KAACF,MAAA,EAAI,WAAU,kDAAiD;AAAA,YAChE,gBAAAI,MAACZ,OAAA,EAAK,WAAU,UAAS,KAAK,GAAG,WAAU,UACzC;AAAA,8BAAAU,KAACQ,OAAA,EAAK,WAAU,yEACb,uBAAa,SAAS,OAAO,GAChC;AAAA,cACA,gBAAAR,KAACQ,OAAA,EAAK,WAAU,kEACb,YAAE,uBAAuB,GAC5B;AAAA,eACF;AAAA,aACF;AAAA,WACF,GACF;AAAA,QACC,CAAC,YACA,gBAAAR;AAAA,UAACF;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,YAAY;AAAA,YACd;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ACjJA,SAAa,YAAAF,iBAAgB;AAC7B,SAAS,aAAAS,kBAAiB;AAC1B,SAAS,kBAAAE,uBAAsB;AAC/B,SAAS,OAAAT,MAAK,QAAAR,OAAM,QAAAkB,OAAM,MAAAjB,KAAI,aAAAC,YAAW,eAAe;AACxD,SAAS,uBAAuB;AAkB1B,SAIE,OAAAQ,MAJF,QAAAE,aAAA;AAXN,IAAM,UAA4B,CAAC,EAAE,UAAU,OAAO,MAAM;AAC1D,QAAM,EAAE,SAAS,IAAIV,WAAU;AAC/B,QAAM,CAAC,QAAQ,SAAS,IAAII,UAAS,KAAK;AAE1C,SACE,gBAAAM;AAAA,IAACZ;AAAA,IAAA;AAAA,MACC,SAAS,MAAM,UAAU,CAAC,MAAM;AAAA,MAChC,WAAU;AAAA,MACV,WAAU;AAAA,MACV,WAAW;AAAA,MAEX;AAAA,wBAAAY;AAAA,UAACZ;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAU;AAAA,YAEV;AAAA,8BAAAU;AAAA,gBAACQ;AAAA,gBAAA;AAAA,kBACC,WAAWjB;AAAA,oBACT;AAAA,oBACA,WACI,mCACA;AAAA,kBACN;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA,cACA,gBAAAS;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAM;AAAA,kBACN,WAAWT;AAAA,oBACT;AAAA,oBACA,UAAU;AAAA,kBACZ;AAAA;AAAA,cACF;AAAA;AAAA;AAAA,QACF;AAAA,QACA,gBAAAS;AAAA,UAACF;AAAA,UAAA;AAAA,YACC,WAAWP;AAAA,cACT;AAAA,cACA,UAAU;AAAA,YACZ;AAAA,YACA,OAAO;AAAA,cACL,WAAW,SAAS,UAAU;AAAA,cAC9B,SAAS,SAAS,IAAI;AAAA,YACxB;AAAA,YAEA,0BAAAS;AAAA,cAACQ;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,EAAE,YAAY,WAAW;AAAA,gBAE/B;AAAA;AAAA,YACH;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAMO,IAAM,aAAkC,CAAC,EAAE,UAAU,MAAM;AAChE,QAAM,aAAaH,WAAU,YAAY;AACzC,QAAM,EAAE,SAAS,IAAIb,WAAU;AAC/B,QAAM,EAAE,EAAE,IAAIe,gBAAe;AAC7B,QAAM,UAAU;AAAA,IACd;AAAA,MACE,UAAU,EAAE,0CAA0C;AAAA,MACtD,QAAQ,EAAE,0CAA0C,EAAE,WAAW,CAAC;AAAA,IACpE;AAAA,IACA;AAAA,MACE,UAAU,EAAE,uCAAuC;AAAA,MACnD,QAAQ,EAAE,qCAAqC;AAAA,IACjD;AAAA,IACA;AAAA,MACE,UAAU,EAAE,yCAAyC;AAAA,MACrD,QAAQ,EAAE,uCAAuC;AAAA,IACnD;AAAA,IACA;AAAA,MACE,UAAU,EAAE,gCAAgC;AAAA,MAC5C,QAAQ,EAAE,8BAA8B;AAAA,IAC1C;AAAA,IACA;AAAA,MACE,UAAU,EAAE,qCAAqC;AAAA,MACjD,QAAQ,EAAE,mCAAmC;AAAA,IAC/C;AAAA,EACF;AAEA,SACE,gBAAAL;AAAA,IAACZ;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,KAAK;AAAA,MACL;AAAA,MACA,WAAW;AAAA,MACX,IAAG;AAAA,MAEH;AAAA,wBAAAU;AAAA,UAACQ;AAAA,UAAA;AAAA,YACC,WAAWjB;AAAA,cACT;AAAA,cACA,WACI,+BACA;AAAA,YACN;AAAA,YAEC,YAAE,yBAAyB;AAAA;AAAA,QAC9B;AAAA,QACA,gBAAAS;AAAA,UAACV;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,KAAK;AAAA,YACL,WAAU;AAAA,YACV,WAAW;AAAA,YAEV,kBAAQ,IAAI,CAAC,KAAK,UACjB,gBAAAY,MAAC,SAAgB,WAAU,cACzB;AAAA,8BAAAF,KAAC,WAAQ,UAAU,IAAI,UAAU,QAAQ,IAAI,QAAQ;AAAA,cACpD,QAAQ,QAAQ,SAAS,KACxB,gBAAAA,KAAC,WAAQ,WAAU,YAAW,WAAW,GAAG;AAAA,iBAHtC,KAKV,CACD;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACnIA,SAAS,YAAAJ,iBAAgB;AACzB,SAAS,kBAAAW,uBAAsB;AAC/B;AAAA,EACE,OAAAT;AAAA,EACA,QAAAR;AAAA,EACA,QAAAkB;AAAA,EACA,MAAAjB;AAAA,EACA,aAAAC;AAAA,EACA,WAAAmB;AAAA,EACA;AAAA,EACA,mBAAAC;AAAA,EACA,SAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA6DC,SAkBM,OAAAb,MAlBN,QAAAE,aAAA;AA1DD,IAAM,QAAQ,MAAM;AACzB,QAAM,EAAE,SAAS,IAAIV,WAAU;AAC/B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,UAAU;AAEd,QAAM,CAAC,qBAAqB,sBAAsB,IAAII,UAAS,KAAK;AAEpE,QAAM,EAAE,EAAE,IAAIW,gBAAe;AAE7B,QAAM,aAAa,YAAY;AAC7B,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,OAAO;AAC3C,MAAAM,OAAM,QAAQ,EAAE,oBAAoB,CAAC;AAAA,IACvC,SAAS,OAAO;AAAA,IAEhB;AAAA,EACF;AAEA,QAAM,aAAa,YAAY;AAC7B,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,OAAO;AAC3C,MAAAA,OAAM,QAAQ,EAAE,oBAAoB,CAAC;AAAA,IACvC,SAAS,OAAO;AAAA,IAEhB;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM;AAC5B,UAAM,aAAa,SAAS,eAAe,YAAY;AACvD,QAAI,YAAY;AACd,iBAAW,eAAe,EAAE,UAAU,UAAU,OAAO,QAAQ,CAAC;AAAA,IAClE;AAAA,EACF;AAEA,QAAM,kBAAkB,CAAC,WAAmB,YAA2B;AACrE,UAAM,aAAa,CAAC,cAAsB;AACxC,YAAM,OAAO,IAAI,KAAK,YAAY,GAAI;AACtC,YAAM,QAAQ,OAAO,KAAK,YAAY,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AAC5D,YAAM,MAAM,OAAO,KAAK,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACrD,YAAM,OAAO,KAAK,eAAe;AACjC,aAAO,GAAG,KAAK,IAAI,GAAG,IAAI,IAAI;AAAA,IAChC;AAEA,UAAM,YAAY,WAAW,SAAS;AACtC,UAAM,UAAU,UAAU,WAAW,OAAO,IAAI;AAChD,WAAO,GAAG,SAAS,MAAM,OAAO;AAAA,EAClC;AAEA,SACE,gBAAAX,MAACZ,OAAA,EAAK,WAAU,UAAS,KAAK,GAAG,WAAU,cACxC;AAAA,mBACC,gBAAAY;AAAA,MAACZ;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,KAAK;AAAA,QACL,WAAU;AAAA,QACV,WAAU;AAAA,QAEV;AAAA,0BAAAU;AAAA,YAACV;AAAA,YAAA;AAAA,cACC,WAAW,WAAW,WAAW;AAAA,cACjC,KAAK;AAAA,cACL,WAAW,WAAW,UAAU;AAAA,cAChC,SAAQ;AAAA,cACR,WAAU;AAAA,cAEV,0BAAAU;AAAA,gBAACV;AAAA,gBAAA;AAAA,kBACC,WAAW,WAAW,WAAW;AAAA,kBACjC,WAAW,WAAW,UAAU;AAAA,kBAChC,WAAW,WAAW,eAAe;AAAA,kBAErC,0BAAAU;AAAA,oBAACQ;AAAA,oBAAA;AAAA,sBACC,WAAWjB;AAAA,wBACT;AAAA,wBACA,WAAW,gBAAgB;AAAA,wBAC3B;AAAA,sBACF;AAAA,sBACD;AAAA;AAAA,kBAED;AAAA;AAAA,cACF;AAAA;AAAA,UACF;AAAA,UAGA,gBAAAS;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,WAAWjB;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,cACD;AAAA;AAAA,UAGD;AAAA;AAAA;AAAA,IACF,IAEA,gBAAAW;AAAA,MAACZ;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,KAAK;AAAA,QACL,WAAU;AAAA,QACV,WAAU;AAAA,QAEV;AAAA,0BAAAY;AAAA,YAACZ;AAAA,YAAA;AAAA,cACC,WAAW,WAAW,WAAW;AAAA,cACjC,KAAK;AAAA,cACL,WAAW,WAAW,UAAU;AAAA,cAChC,SAAQ;AAAA,cACR,WAAU;AAAA,cAEV;AAAA,gCAAAY;AAAA,kBAACZ;AAAA,kBAAA;AAAA,oBACC,WAAW,WAAW,WAAW;AAAA,oBACjC,WAAW,WAAW,UAAU;AAAA,oBAChC,WAAW,WAAW,eAAe;AAAA,oBAErC;AAAA,sCAAAY;AAAA,wBAACM;AAAA,wBAAA;AAAA,0BACC,WAAWjB;AAAA,4BACT;AAAA,4BACA,WAAW,gBAAgB;AAAA,4BAC3B;AAAA,0BACF;AAAA,0BACD;AAAA;AAAA,4BACQ,cAAc;AAAA,4BAAa;AAAA;AAAA;AAAA,sBACpC;AAAA,sBACA,gBAAAW,MAACZ,OAAA,EAAK,KAAK,GAAG,WAAU,UACtB;AAAA,wCAAAU;AAAA,0BAACQ;AAAA,0BAAA;AAAA,4BACC,WAAWjB;AAAA,8BACT,WAAW,gBAAgB;AAAA,8BAC3B;AAAA,8BACA;AAAA,8BACA;AAAA,4BACF;AAAA,4BAEC,wBAAc;AAAA;AAAA,wBACjB;AAAA,wBACA,gBAAAS;AAAA,0BAAC;AAAA;AAAA,4BACC,KAAI;AAAA,4BACJ,KAAI;AAAA,4BACJ,WACE,WAAW,oBAAoB;AAAA;AAAA,wBAEnC;AAAA,yBACF;AAAA;AAAA;AAAA,gBACF;AAAA,gBAEA,gBAAAE;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM;AAAA,oBACN,cAAc;AAAA,oBAEd;AAAA,sCAAAF,KAAC,uBAAoB,SAAO,MAC1B,0BAAAE;AAAA,wBAACZ;AAAA,wBAAA;AAAA,0BACC,KAAK;AAAA,0BACL,WAAU;AAAA,0BACV,IAAI;AAAA,0BACJ,IAAI;AAAA,0BACJ,WAAU;AAAA,0BAEV;AAAA,4CAAAU,KAACQ,OAAA,EAAK,WAAU,+FACb,yBACG,SAAS,aAAa,YAAY,KAAK,gBAAgB,aAAa,YAAY,aAAa,QAAQ,CAAC,KACtG,IACN;AAAA,4BACA,gBAAAR;AAAA,8BAACY;AAAA,8BAAA;AAAA,gCACC,MAAM;AAAA,gCACN,WAAWrB;AAAA,kCACT;AAAA,kCACA;AAAA,kCACA,uBAAuB;AAAA,gCACzB;AAAA;AAAA,4BACF;AAAA;AAAA;AAAA,sBACF,GACF;AAAA,sBACA,gBAAAS,KAAC,sBACC,0BAAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,kBAAkB,CAAC,MAAM,EAAE,eAAe;AAAA,0BAC1C,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,0BAClC,YAAY;AAAA,0BACZ,kBAAkB,EAAE,OAAO,GAAG;AAAA,0BAC9B,WAAWT;AAAA,4BACT;AAAA,4BACA;AAAA,4BACA;AAAA,4BACA;AAAA,0BACF;AAAA,0BAEA,0BAAAS;AAAA,4BAACV;AAAA,4BAAA;AAAA,8BACC,WAAU;AAAA,8BACV,WAAU;AAAA,8BACV,KAAK;AAAA,8BACL,WAAU;AAAA,8BAET,kBAAQ,MAAM,IAAI,CAAC,UAAU;AAC5B,sCAAM,aACJ,cAAc,aAAa,MAAM;AACnC,sCAAM,aAAa,MAAM,WAAW;AACpC,sCAAM,WAAW,MAAM,WAAW;AAClC,uCACE,gBAAAY;AAAA,kCAACZ;AAAA,kCAAA;AAAA,oCAEC,KAAK;AAAA,oCACL,WAAU;AAAA,oCACV,IAAI;AAAA,oCACJ,IAAI;AAAA,oCACJ,GAAE;AAAA,oCACF,SAAS,MAAM;AACb,sDAAgB,KAAK;AACrB,6DAAuB,KAAK;AAAA,oCAC9B;AAAA,oCACA,WAAWC;AAAA,sCACT;AAAA,sCACA;AAAA,sCACA,aACI,kBACA;AAAA,oCACN;AAAA,oCAEA;AAAA,sDAAAS;AAAA,wCAACQ;AAAA,wCAAA;AAAA,0CACC,WAAWjB;AAAA,4CACT;AAAA,4CACA,aACI,gDACA;AAAA,0CACN;AAAA,0CAEC,mBAAS,MAAM,YAAY,KAAK,gBAAgB,MAAM,YAAY,MAAM,QAAQ,CAAC;AAAA;AAAA,sCACpF;AAAA,sCACC,YACC,gBAAAS,KAACF,MAAA,EAAI,WAAU,qEAAoE;AAAA;AAAA;AAAA,kCA7BhF,MAAM;AAAA,gCA+Bb;AAAA,8BAEJ,CAAC;AAAA;AAAA,0BACH;AAAA;AAAA,sBACF,GACF;AAAA;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF;AAAA,UAGA,gBAAAI;AAAA,YAACM;AAAA,YAAA;AAAA,cACC,WAAWjB;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,cAEC;AAAA,8BAAc;AAAA,gBACf,gBAAAW;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,SAAS;AAAA,oBAER;AAAA;AAAA,sBACA,EAAE,yBAAyB;AAAA;AAAA;AAAA,gBAC9B;AAAA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,IAGF,gBAAAA;AAAA,MAACZ;AAAA,MAAA;AAAA,QACC,WAAW,WAAW,WAAW;AAAA,QACjC,KAAK;AAAA,QACL,WAAU;AAAA,QAGV;AAAA,0BAAAY;AAAA,YAACZ;AAAA,YAAA;AAAA,cACC,WAAW,WAAW,WAAW;AAAA,cACjC,KAAK;AAAA,cACL,WAAW,WAAW,YAAY;AAAA,cAClC,GAAG;AAAA,cACH,GAAE;AAAA,cACF,OAAO,EAAE,QAAQ,WAAW,KAAK,IAAI;AAAA,cACrC,WAAWC;AAAA,gBACT;AAAA,gBACA,CAAC,YAAY;AAAA,gBACb,WAAW,eAAe;AAAA,cAC5B;AAAA,cAEA;AAAA,gCAAAW;AAAA,kBAACZ;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,KAAK;AAAA,oBACL,WAAU;AAAA,oBACV,WAAU;AAAA,oBAEV;AAAA,sCAAAU,KAACQ,OAAA,EAAK,WAAU,+DACb,YAAE,2BAA2B,GAChC;AAAA,sBACA,gBAAAR,KAACQ,OAAA,EAAK,WAAU,8EACb,+BAAqB,sBACxB;AAAA;AAAA;AAAA,gBACF;AAAA,gBACC,CAAC,YACA,gBAAAR;AAAA,kBAACF;AAAA,kBAAA;AAAA,oBACC,WAAWP,IAAG,eAAe,cAAc,qBAAqB;AAAA;AAAA,gBAClE;AAAA,gBAED,YAAY,gBAAAS,KAACW,UAAA,EAAQ,WAAW,GAAG;AAAA,gBACpC,gBAAAT;AAAA,kBAACZ;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,KAAK;AAAA,oBACL,WAAU;AAAA,oBACV,WAAU;AAAA,oBAEV;AAAA,sCAAAU,KAACQ,OAAA,EAAK,WAAU,+DACb,YAAE,4BAA4B,GACjC;AAAA,sBACA,gBAAAR,KAACQ,OAAA,EAAK,WAAU,8EACb,+BAAqB,gBACxB;AAAA;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF;AAAA,UAGA,gBAAAR;AAAA,YAACV;AAAA,YAAA;AAAA,cACC,GAAG;AAAA,cACH,GAAE;AAAA,cACF,OAAO,EAAE,QAAQ,IAAI;AAAA,cACrB,WAAWC;AAAA,gBACT;AAAA,gBACA,WAAW,eAAe;AAAA,gBAC1B;AAAA,cACF;AAAA,cAEA,0BAAAW,MAACZ,OAAA,EAAK,WAAU,UAAS,KAAK,GAAG,WAAU,cACzC;AAAA,gCAAAY,MAACZ,OAAA,EAAK,KAAK,GAAG,WAAU,UAAS,WAAU,cACzC;AAAA,kCAAAU,KAACQ,OAAA,EAAK,WAAU,+DACb,YAAE,4BAA4B,GACjC;AAAA,kBACA,gBAAAN;AAAA,oBAACZ;AAAA,oBAAA;AAAA,sBACC,KAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAQ;AAAA,sBACR,WAAU;AAAA,sBAEV;AAAA,wCAAAU,KAACQ,OAAA,EAAK,WAAU,4DACb,mBACH;AAAA,wBACA,gBAAAR;AAAA,0BAAC;AAAA;AAAA,4BACC,MAAM;AAAA,4BACN,WAAU;AAAA,4BACV,SAAS;AAAA;AAAA,wBACX;AAAA;AAAA;AAAA,kBACF;AAAA,mBACF;AAAA,gBACA,gBAAAE,MAACZ,OAAA,EAAK,KAAK,GAAG,WAAU,SAAQ,WAAU,cACxC;AAAA,kCAAAU,KAACQ,OAAA,EAAK,WAAU,iFACb,YAAE,4BAA4B,GACjC;AAAA,kBACA,gBAAAN;AAAA,oBAACZ;AAAA,oBAAA;AAAA,sBACC,KAAK;AAAA,sBACL,WAAU;AAAA,sBACV,WAAU;AAAA,sBAEV;AAAA,wCAAAU,KAACQ,OAAA,EAAK,WAAU,mGACb,mBACH;AAAA,wBACA,gBAAAR;AAAA,0BAAC;AAAA;AAAA,4BACC,MAAM;AAAA,4BACN,WAAU;AAAA,4BACV,SAAS;AAAA;AAAA,wBACX;AAAA;AAAA;AAAA,kBACF;AAAA,mBACF;AAAA,iBACF;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;ACxYA,SAAa,eAAAP,oBAAmB;AAChC,SAAS,kBAAAc,uBAAsB;AAC/B;AAAA,EACE,OAAAT;AAAA,EACA,QAAAR;AAAA,EACA,QAAAkB;AAAA,EACA,MAAAjB;AAAA,EACA,aAAAC;AAAA,EACA,WAAAmB;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAAE;AAAA,OACK;AAyEH,qBAAAZ,WAaQ,OAAAD,OADF,QAAAE,aAZN;AAhEG,IAAM,OAAsB,CAAC,EAAE,cAAc,MAAM;AACxD,QAAM,EAAE,EAAE,IAAIK,gBAAe;AAC7B,QAAM,EAAE,SAAS,IAAIf,WAAU;AAC/B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,UAAU;AAEd,QAAM,mBAAmB;AAAA,IACvB,EAAE,OAAO,aAAsB,OAAO,EAAE,wBAAwB,EAAE;AAAA,IAClE,EAAE,OAAO,aAAsB,OAAO,EAAE,wBAAwB,EAAE;AAAA,IAClE,EAAE,OAAO,YAAqB,OAAO,EAAE,mBAAmB,EAAE;AAAA,EAC9D;AAEA,MAAI,yBAAyB;AAC3B,QAAI,sBAAsB,YAAY;AACpC,2BAAqB,UAAU;AAAA,IACjC;AACA,qBAAiB,OAAO,GAAG,CAAC;AAAA,EAC9B;AAEA,QAAM,uBAAuBD;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,uBAAuB,cAAc;AAC3C,QAAM,iBAAiB,cAAc;AACrC,QAAM,uBAAuB,cAAc;AAC3C,QAAM,mBAAmB,cAAc;AACvC,QAAM,wBAAwB,cAAc;AAE5C,QAAM,sBAAsB,CAAC,UAAqC;AAChE,WAAO,UAAU,QAAQ,UAAU,SAAY,QAAQ;AAAA,EACzD;AAEA,QAAM,WAAWE,aAAY,MAAM;AACjC,kBAAc;AAAA,MACZ,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AAAA,EACH,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,SAAS,YAAY;AACzB,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,OAAO;AAC3C,MAAAoB,OAAM,QAAQ,EAAE,oBAAoB,CAAC;AAAA,IACvC,SAAS,OAAO;AAAA,IAEhB;AAAA,EACF;AAEA,QAAM,YACJ,gBAAAb,MAAAC,WAAA,EACE,0BAAAC;AAAA,IAACZ;AAAA,IAAA;AAAA,MACC,WAAW,WAAW,WAAW;AAAA,MACjC,KAAK;AAAA,MACL,WAAU;AAAA,MACV,WAAU;AAAA,MAEV;AAAA,wBAAAY;AAAA,UAACZ;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,KAAK;AAAA,YACL,WAAW,WAAW,eAAe;AAAA,YAErC;AAAA,8BAAAY,MAACZ,OAAA,EAAK,WAAU,UAAS,KAAK,GAAG,GAAG,GAAG,GAAE,OACvC;AAAA,gCAAAU,MAACQ,OAAA,EAAK,WAAU,gHACb,YAAE,6BAA6B,GAClC;AAAA,gBACA,gBAAAR,MAACQ,OAAA,EAAK,WAAU,kJACb,gCACH;AAAA,iBACF;AAAA,cACA,gBAAAR,MAACW,UAAA,EAAQ,WAAU,cAAa,WAAW,GAAG;AAAA,cAC9C,gBAAAT,MAACZ,OAAA,EAAK,WAAU,UAAS,KAAK,GAAG,GAAG,GAAG,GAAE,OACvC;AAAA,gCAAAU,MAACQ,OAAA,EAAK,WAAU,0FACb,YAAE,uBAAuB,GAC5B;AAAA,gBACA,gBAAAR,MAACQ,OAAA,EAAK,WAAU,kJACb,0BACH;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA,QAEC,CAAC,YACA,gBAAAR;AAAA,UAACW;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,WAAW;AAAA,YACX,WAAU;AAAA;AAAA,QACZ;AAAA,QAED,YAAY,gBAAAX,MAACW,UAAA,EAAQ,WAAW,GAAG;AAAA,QAEpC,gBAAAX;AAAA,UAACV;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,WAAW,WAAW,eAAe;AAAA,YAErC,0BAAAY;AAAA,cAACZ;AAAA,cAAA;AAAA,gBACC,WAAW,WAAW,WAAW;AAAA,gBACjC,KAAK;AAAA,gBACL,WAAU;AAAA,gBAEV;AAAA,kCAAAY;AAAA,oBAACZ;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,KAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAQ;AAAA,sBACR,GAAG;AAAA,sBACH,GAAE;AAAA,sBACF,WAAW;AAAA,sBACX,WAAWC;AAAA,wBACT;AAAA,wBACA,WAAW,eAAe;AAAA,sBAC5B;AAAA,sBAEA;AAAA,wCAAAS;AAAA,0BAAC;AAAA;AAAA,4BACC,SAAS,EAAE,kCAAkC;AAAA,4BAC7C,WAAU;AAAA,4BAEV,0BAAAA;AAAA,8BAACQ;AAAA,8BAAA;AAAA,gCACC,WAAU;AAAA,gCAEV,OAAO;AAAA,kCACL,oBAAoB;AAAA,kCACpB,qBAAqB;AAAA,kCACrB,qBAAqB;AAAA,gCACvB;AAAA,gCAEC,YAAE,2BAA2B;AAAA;AAAA,4BAChC;AAAA;AAAA,wBACF;AAAA,wBAEA,gBAAAR,MAACQ,OAAA,EAAK,WAAU,yGACb,gCACH;AAAA,wBACA,gBAAAR,MAAC,UAAO,MAAK,MAAK,SAAS,UACzB,0BAAAA,MAACQ,OAAA,EAAM,YAAE,wBAAwB,GAAE,GACrC;AAAA;AAAA;AAAA,kBACF;AAAA,kBAEA,gBAAAN;AAAA,oBAACZ;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,KAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAQ;AAAA,sBACR,GAAG;AAAA,sBACH,GAAE;AAAA,sBACF,WAAW;AAAA,sBACX,WAAWC;AAAA,wBACT;AAAA,wBACA,WAAW,eAAe;AAAA,sBAC5B;AAAA,sBAEA;AAAA,wCAAAS;AAAA,0BAAC;AAAA;AAAA,4BACC,SAAS,EAAE,gCAAgC;AAAA,4BAC3C,WAAU;AAAA,4BAEV,0BAAAA;AAAA,8BAACQ;AAAA,8BAAA;AAAA,gCACC,WAAU;AAAA,gCACV,OAAO;AAAA,kCACL,oBAAoB;AAAA,kCACpB,qBAAqB;AAAA,kCACrB,qBAAqB;AAAA,gCACvB;AAAA,gCAEC,YAAE,yBAAyB;AAAA;AAAA,4BAC9B;AAAA;AAAA,wBACF;AAAA,wBACA,gBAAAR,MAACQ,OAAA,EAAK,WAAU,yGACb,4BACH;AAAA,wBACA,gBAAAR,MAAC,UAAO,MAAK,MAAK,SAAS,UACzB,0BAAAA,MAACQ,OAAA,EAAM,YAAE,wBAAwB,GAAE,GACrC;AAAA;AAAA;AAAA,kBACF;AAAA,kBAEA,gBAAAN;AAAA,oBAACZ;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,KAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAQ;AAAA,sBACR,GAAG;AAAA,sBACH,GAAE;AAAA,sBACF,WAAW;AAAA,sBACX,WAAWC;AAAA,wBACT;AAAA,wBACA,WAAW,eAAe;AAAA,sBAC5B;AAAA,sBAEA;AAAA,wCAAAS;AAAA,0BAAC;AAAA;AAAA,4BACC,SAAS,EAAE,uCAAuC;AAAA,8BAChD,IAAI,oBAAoB,gBAAgB,iBAAiB;AAAA,8BACzD,IAAI,oBAAoB,gBAAgB,iBAAiB;AAAA,4BAC3D,CAAC;AAAA,4BACD,WAAU;AAAA,4BAEV,0BAAAA;AAAA,8BAACQ;AAAA,8BAAA;AAAA,gCACC,WAAU;AAAA,gCACV,OAAO;AAAA,kCACL,oBAAoB;AAAA,kCACpB,qBAAqB;AAAA,kCACrB,qBAAqB;AAAA,gCACvB;AAAA,gCAEC,YAAE,8BAA8B;AAAA;AAAA,4BACnC;AAAA;AAAA,wBACF;AAAA,wBACA,gBAAAR,MAACQ,OAAA,EAAK,WAAU,yGACb,iCACH;AAAA,wBACA,gBAAAR,MAAC,UAAO,SAAQ,YAAW,MAAK,MAAK,SAAS,QAC5C,0BAAAA,MAACQ,OAAA,EAAK,WAAU,6BACb,YAAE,wBAAwB,GAC7B,GACF;AAAA;AAAA;AAAA,kBACF;AAAA;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF,GACF;AAGF,SACE,gBAAAN,MAACZ,OAAA,EAAK,WAAU,UAAS,KAAK,GAAG,WAAU,cACzC;AAAA,oBAAAY;AAAA,MAACZ;AAAA,MAAA;AAAA,QACC,WAAW,WAAW,WAAW;AAAA,QACjC,KAAK,WAAW,IAAI;AAAA,QACpB,WAAW,WAAW,UAAU;AAAA,QAChC,SAAQ;AAAA,QACR,WAAU;AAAA,QAEV;AAAA,0BAAAU;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,WAAWjB;AAAA,gBACT;AAAA,gBACA,WAAW,iBAAiB;AAAA,gBAC5B;AAAA,cACF;AAAA,cAEC,YAAE,wBAAwB;AAAA;AAAA,UAC7B;AAAA,UACA,gBAAAS,MAACV,OAAA,EAAK,KAAK,GAAG,WAAU,UACrB,2BAAiB,IAAI,CAAC,WACrB,gBAAAU;AAAA,YAAC;AAAA;AAAA,cAEC,SAAS,MAAM,qBAAqB,OAAO,KAAK;AAAA,cAChD,cACE,sBAAsB,OAAO,QAAQ,WAAW;AAAA,cAElD,WAAW;AAAA,cAEV,iBAAO;AAAA;AAAA,YAPH,OAAO;AAAA,UAQd,CACD,GACH;AAAA;AAAA;AAAA,IACF;AAAA,IACA,gBAAAA,MAACF,MAAA,EAAI,GAAG,GAAG,GAAE,OAAM,WAAU,yCAI1B,qBACH;AAAA,KACF;AAEJ;;;Ad3QM,SAGE,YAAAG,WAHF,OAAAD,OAGE,QAAAE,aAHF;AAdN,IAAM,OAAsB,CAAC,EAAE,cAAc,MAAM;AACjD,QAAM,EAAE,SAAS,IAAIV,WAAU;AAC/B,QAAM,EAAE,cAAc,sBAAsB,IAAI,UAAU;AAC1D,SACE,gBAAAU;AAAA,IAACZ;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,KAAK,WAAW,IAAI;AAAA,MACpB,WAAWC;AAAA,QACT;AAAA,QACA,WACI,sBACA;AAAA,MACN;AAAA,MAEA;AAAA,wBAAAS,MAAC,aAAU;AAAA,QACX,gBAAAA,MAAC,SAAM;AAAA,QACN,CAAC,gBACA,gBAAAE,MAAAD,WAAA,EACE;AAAA,0BAAAD,MAAC,QAAK,eAA8B;AAAA,UACnC,CAAC,yBAAyB,gBAAAA,MAAC,4BAAyB;AAAA,WACvD;AAAA,QAEF,gBAAAA,MAAC,cAAW,WAAU,cAAa;AAAA;AAAA;AAAA,EACrC;AAEJ;AAEA,IAAO,eAAQ;;;AevBT,gBAAAA,aAAA;AAHC,IAAM,kBAA4C,CAAC,UAAU;AAClE,SACE,gBAAAA,MAAC,kBACC,0BAAAA,MAAC,gBAAK,eAAe,MAAM,eAAe,GAC5C;AAEJ","sourcesContent":["import {\n useState,\n useEffect,\n useMemo,\n useCallback,\n Dispatch,\n SetStateAction,\n} from \"react\";\nimport {\n useQuery,\n usePrivateQuery,\n useConfig,\n RefferalAPI,\n noCacheConfig,\n} from \"@orderly.network/hooks\";\nimport { commify, numberToHumanStyle } from \"@orderly.network/utils\";\nimport {\n StagesResponse,\n UserStatistics,\n StageInfo,\n PointsTimeRange,\n} from \"./types\";\n\nexport interface PointsDisplay {\n currentPointsDisplay: string;\n tradingPointsDisplay: string;\n pnlPointsDisplay: string;\n referralPointsDisplay: string;\n rankingDisplay: string;\n}\n\nexport interface UsePointsDataReturn {\n stages: StagesResponse | undefined;\n userStatistics: UserStatistics | undefined;\n isCurrentStagePending?: boolean;\n isCurrentStageCompleted?: boolean;\n currentStage: StageInfo | undefined;\n setCurrentStage: (stage: StageInfo) => void;\n isLoading: boolean;\n isStagesLoading: boolean;\n isUserStatisticsLoading: boolean;\n isNoCampaign: boolean;\n refLink: string;\n refCode: string;\n selectedTimeRange: PointsTimeRange;\n setSelectedTimeRange: Dispatch<SetStateAction<PointsTimeRange>>;\n getRankingUrl: (args: {\n page: number;\n pageSize: number;\n timeRange?: string;\n }) => string | null;\n brokerId?: string | number;\n pointsDisplay: PointsDisplay;\n allTimePointsDisplay: PointsDisplay;\n}\n\nexport function usePointsData(): UsePointsDataReturn {\n const brokerId = useConfig(\"brokerId\");\n const [currentStage, setCurrentStage] = useState<StageInfo | undefined>(\n undefined,\n );\n const [selectedTimeRange, setSelectedTimeRange] =\n useState<PointsTimeRange>(\"this_week\");\n\n const { data: stages, isLoading: isStagesLoading } = useQuery<StagesResponse>(\n brokerId ? `/v1/public/points/stages?broker_id=${brokerId}` : null,\n {\n formatter: (res) => {\n if (res?.rows) {\n // Sort by epoch_period in descending order (smaller numbers at end)\n res.rows.sort(\n (a: StageInfo, b: StageInfo) => b.epoch_period - a.epoch_period,\n );\n }\n return res;\n },\n revalidateOnFocus: false,\n },\n );\n\n useEffect(() => {\n if (\n !stages?.rows ||\n stages.rows.length === 0 ||\n currentStage !== undefined\n ) {\n return;\n }\n\n // Priority: active > pending > completed > first\n let selectedStage = stages.rows[0]; // Default to first\n\n const activeStage = stages.rows.find((stage) => stage.status === \"active\");\n if (activeStage) {\n selectedStage = activeStage;\n } else {\n const pendingStage = [...stages.rows]\n .reverse()\n .find((stage) => stage.status === \"pending\");\n if (pendingStage) {\n selectedStage = pendingStage;\n } else {\n const completedStage = stages.rows.find(\n (stage) => stage.status === \"completed\",\n );\n if (completedStage) {\n selectedStage = completedStage;\n }\n }\n }\n\n setCurrentStage(selectedStage);\n }, [stages, currentStage]);\n\n const { data: userStatistics, isLoading: isUserStatisticsLoading } =\n usePrivateQuery<UserStatistics>(\n currentStage !== undefined\n ? `/v1/client/points/user_statistics?stage=${currentStage.stage_id}`\n : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const { data: referralInfo } = usePrivateQuery<RefferalAPI.ReferralInfo>(\n \"/v1/referral/info\",\n {\n revalidateOnFocus: true,\n errorRetryCount: 3,\n ...noCacheConfig,\n },\n );\n\n const firstCode = useMemo(() => {\n const codes = referralInfo?.referrer_info?.referral_codes;\n if (!codes || codes.length === 0) {\n return undefined;\n }\n return codes[0];\n }, [referralInfo?.referrer_info?.referral_codes]);\n\n const refCode = useMemo(() => {\n return firstCode?.code || \"--\";\n }, [firstCode]);\n\n const refLink = useMemo(() => {\n if (!firstCode || !firstCode.code) {\n return \"--\";\n }\n const referralLinkUrl = window.location.origin;\n return `${referralLinkUrl}?ref=${firstCode.code}`;\n }, [firstCode]);\n\n const getRankingUrl = useCallback(\n (args: { page: number; pageSize: number; timeRange?: string }) => {\n if (!currentStage || !brokerId) return null;\n const searchParams = new URLSearchParams();\n searchParams.set(\"page\", args.page.toString());\n searchParams.set(\"size\", args.pageSize.toString());\n searchParams.set(\"stage\", String(currentStage.stage_id));\n searchParams.set(\"period\", args.timeRange || selectedTimeRange);\n searchParams.set(\"broker_id\", String(brokerId));\n return `/v1/public/points/rankings?${searchParams.toString()}`;\n },\n [brokerId, currentStage, selectedTimeRange],\n );\n\n const isLoading = isStagesLoading || isUserStatisticsLoading;\n\n const isNoCampaign =\n !isStagesLoading && (!stages?.rows || stages.rows.length === 0);\n\n const formatPoints = (value?: number | null) => {\n if (value === undefined || value === null) {\n return \"--\";\n }\n return numberToHumanStyle(value, 2);\n };\n\n const calculateTotalPoints = useCallback(\n (\n breakdown:\n | {\n trading_point: number;\n pnl_point: number;\n referral_point: number;\n }\n | undefined,\n ) => {\n if (!breakdown) return undefined;\n return (\n breakdown.trading_point + breakdown.pnl_point + breakdown.referral_point\n );\n },\n [],\n );\n\n const pointsDisplay = useMemo<PointsDisplay>(() => {\n if (!userStatistics) {\n return {\n currentPointsDisplay: \"--\",\n tradingPointsDisplay: \"--\",\n pnlPointsDisplay: \"--\",\n referralPointsDisplay: \"--\",\n rankingDisplay: \"--\",\n };\n }\n\n const breakdownThisWeek = userStatistics.weekly_breakdown?.this_week;\n const breakdownLastWeek = userStatistics.weekly_breakdown?.last_week;\n\n let selectedBreakdown;\n let ranking;\n\n if (selectedTimeRange === \"all_time\") {\n // For all_time, use the top-level stats\n selectedBreakdown = {\n trading_point: userStatistics.trading_point,\n pnl_point: userStatistics.pnl_point,\n referral_point: userStatistics.referral_point,\n };\n ranking = userStatistics.stage_rank;\n } else if (selectedTimeRange === \"this_week\") {\n selectedBreakdown = breakdownThisWeek;\n ranking = breakdownThisWeek?.rank;\n } else {\n // last_week\n selectedBreakdown = breakdownLastWeek;\n ranking = breakdownLastWeek?.rank;\n }\n\n const currentPoints = calculateTotalPoints(selectedBreakdown) ?? 0;\n\n return {\n currentPointsDisplay: formatPoints(currentPoints),\n tradingPointsDisplay: formatPoints(selectedBreakdown?.trading_point),\n pnlPointsDisplay: formatPoints(selectedBreakdown?.pnl_point),\n referralPointsDisplay: formatPoints(selectedBreakdown?.referral_point),\n rankingDisplay:\n ranking === null || ranking === undefined ? \"--\" : commify(ranking),\n };\n }, [userStatistics, selectedTimeRange, calculateTotalPoints]);\n\n // Compute display values for all_time (for intro page)\n const allTimePointsDisplay = useMemo<PointsDisplay>(() => {\n if (!userStatistics) {\n return {\n currentPointsDisplay: \"--\",\n tradingPointsDisplay: \"--\",\n pnlPointsDisplay: \"--\",\n referralPointsDisplay: \"--\",\n rankingDisplay: \"--\",\n };\n }\n\n const currentPoints =\n calculateTotalPoints({\n trading_point: userStatistics.trading_point,\n pnl_point: userStatistics.pnl_point,\n referral_point: userStatistics.referral_point,\n }) ?? 0;\n\n return {\n currentPointsDisplay: formatPoints(currentPoints),\n tradingPointsDisplay: formatPoints(userStatistics.trading_point),\n pnlPointsDisplay: formatPoints(userStatistics.pnl_point),\n referralPointsDisplay: formatPoints(userStatistics.referral_point),\n rankingDisplay:\n userStatistics.stage_rank === null ||\n userStatistics.stage_rank === undefined\n ? \"--\"\n : commify(userStatistics.stage_rank),\n };\n }, [userStatistics, calculateTotalPoints]);\n\n return {\n stages,\n userStatistics,\n currentStage,\n setCurrentStage,\n isLoading,\n isStagesLoading,\n isUserStatisticsLoading,\n isNoCampaign,\n refLink,\n refCode,\n selectedTimeRange,\n setSelectedTimeRange,\n getRankingUrl,\n brokerId,\n pointsDisplay,\n allTimePointsDisplay,\n isCurrentStagePending: currentStage?.status === \"pending\",\n isCurrentStageCompleted: currentStage?.status === \"completed\",\n };\n}\n","import React, { createContext, useContext, FC, ReactNode } from \"react\";\nimport { usePointsData as usePointsDataHook } from \"./usePointsData\";\nimport type { UsePointsDataReturn } from \"./usePointsData\";\n\nexport type PointsContextValue = UsePointsDataReturn;\n\nconst PointsContext = createContext<PointsContextValue | undefined>(undefined);\n\nexport interface PointsProviderProps {\n children: ReactNode;\n}\n\nexport const PointsProvider: FC<PointsProviderProps> = ({ children }) => {\n const value = usePointsDataHook();\n\n return (\n <PointsContext.Provider value={value}>{children}</PointsContext.Provider>\n );\n};\n\nexport function usePoints(): PointsContextValue {\n const context = useContext(PointsContext);\n if (context === undefined) {\n throw new Error(\"usePoints must be used within a PointsProvider\");\n }\n return context;\n}\n","import { FC } from \"react\";\nimport { Flex, cn, useScreen } from \"@orderly.network/ui\";\nimport { GeneralLeaderboardWidget } from \"../../components/leaderboard/generalLeaderboard\";\nimport { usePoints } from \"../../hooks/usePointsData\";\nimport { Countdown } from \"./countdown\";\nimport { FAQSection } from \"./faq\";\nimport { Intro } from \"./intro\";\nimport { RouteOption } from \"./page\";\nimport { User } from \"./user\";\n\ntype MainProps = {\n onRouteChange: (option: RouteOption) => void;\n};\n\nconst Main: FC<MainProps> = ({ onRouteChange }) => {\n const { isMobile } = useScreen();\n const { isNoCampaign, isCurrentStagePending } = usePoints();\n return (\n <Flex\n direction=\"column\"\n gap={isMobile ? 6 : 10}\n className={cn(\n \"oui-w-full\",\n isMobile\n ? \"oui-px-5 oui-py-6\"\n : \"oui-max-w-[1200px] oui-mx-auto oui-py-[64px] oui-py-12\",\n )}\n >\n <Countdown />\n <Intro />\n {!isNoCampaign && (\n <>\n <User onRouteChange={onRouteChange} />\n {!isCurrentStagePending && <GeneralLeaderboardWidget />}\n </>\n )}\n <FAQSection className=\"oui-w-full\" />\n </Flex>\n );\n};\n\nexport default Main;\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { differenceInDays } from \"date-fns\";\nimport { DateRange, LeaderboardTab } from \"../../../type\";\nimport {\n formatDateRange,\n getDateRange,\n splitCampaignByWeeks,\n WeeklyDateRange,\n getCurrentWeeklyRange,\n getCurrentOrAllTimeRange,\n} from \"../../../utils\";\n\nexport type GeneralLeaderboardScriptReturn = ReturnType<\n typeof useGeneralLeaderboardScript\n>;\n\nexport const FilterDays = [7, 14, 30, 90] as const;\nexport type TFilterDays = (typeof FilterDays)[number];\n\nexport type GeneralLeaderboardScriptOptions = {\n campaignDateRange?: {\n start_time: Date | string;\n end_time: Date | string;\n };\n};\n\nexport function useGeneralLeaderboardScript(\n options?: GeneralLeaderboardScriptOptions,\n) {\n const { campaignDateRange } = options || {};\n\n const weeklyRanges = useMemo(() => {\n if (!campaignDateRange) return [];\n return splitCampaignByWeeks(campaignDateRange);\n }, [campaignDateRange]);\n\n const currentOrAllTimeRange = useMemo(() => {\n return getCurrentOrAllTimeRange(weeklyRanges);\n }, [weeklyRanges]);\n\n const [activeTab, setActiveTab] = useState<LeaderboardTab>(\n LeaderboardTab.Volume,\n );\n const filterState = useFilter({ defaultRange: currentOrAllTimeRange });\n const searchState = useSearch();\n\n const useCampaignDateRange = useMemo(() => {\n return !!campaignDateRange;\n }, [campaignDateRange]);\n\n return {\n ...filterState,\n ...searchState,\n activeTab,\n onTabChange: setActiveTab,\n useCampaignDateRange,\n weeklyRanges,\n currentOrAllTimeRange,\n };\n}\n\nfunction useFilter({ defaultRange }: { defaultRange?: DateRange }) {\n // default is 90d\n const [filterDay, setFilterDay] = useState<TFilterDays | null>(90);\n\n const [dateRange, setDateRange] = useState<DateRange>(getDateRange(90));\n\n const updateFilterDay = (day: TFilterDays) => {\n setFilterDay(day);\n setDateRange(getDateRange(day));\n };\n\n useEffect(() => {\n setDateRange(defaultRange ?? getDateRange(90));\n }, [defaultRange]);\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\") {\n const newDateRange = filter.value;\n setDateRange(newDateRange);\n\n if (newDateRange.from && newDateRange.to) {\n const offsetDay =\n Math.abs(differenceInDays(newDateRange.from, newDateRange.to)) + 1;\n\n const dateRange = getDateRange(offsetDay);\n if (\n formatDateRange(dateRange.from) ===\n formatDateRange(newDateRange.from) &&\n formatDateRange(dateRange.to) === formatDateRange(newDateRange.to)\n ) {\n setFilterDay(offsetDay as any);\n } else {\n setFilterDay(null);\n }\n }\n }\n };\n\n const filterItems = useMemo(() => {\n const dateRangeFilter = {\n type: \"range\",\n name: \"dateRange\",\n value: dateRange,\n max: 90,\n };\n\n return [dateRangeFilter] as any;\n }, [dateRange]);\n\n return {\n filterItems,\n onFilter,\n dateRange,\n filterDay,\n updateFilterDay,\n setDateRange,\n };\n}\n\nfunction useSearch() {\n const [searchValue, setSearchValue] = useState(\"\");\n const onSearchValueChange = useCallback((value: string) => {\n setSearchValue(value);\n }, []);\n\n const clearSearchValue = useCallback(() => {\n setSearchValue(\"\");\n }, []);\n\n return {\n searchValue,\n onSearchValueChange,\n clearSearchValue,\n };\n}\n\n/**\n * Example function demonstrating how to use splitCampaignByWeeks\n * @param campaignDateRange Campaign date range with start_time and end_time\n * @returns Array of weekly date ranges plus \"All time\" option\n */\nexport function useCampaignWeeklyRanges(campaignDateRange: {\n start_time: Date | string;\n end_time: Date | string;\n}): WeeklyDateRange[] {\n return useMemo(() => {\n return splitCampaignByWeeks(campaignDateRange);\n }, [campaignDateRange]);\n}\n\n/**\n * Hook to get current weekly range information\n * @param campaignDateRange Campaign date range with start_time and end_time\n * @returns Object containing current weekly range and related functions\n */\nexport function useCurrentWeeklyRange(campaignDateRange: {\n start_time: Date | string;\n end_time: Date | string;\n}) {\n const weeklyRanges = useCampaignWeeklyRanges(campaignDateRange);\n\n const currentRange = useMemo(() => {\n return getCurrentWeeklyRange(weeklyRanges);\n }, [weeklyRanges]);\n\n const currentOrAllTime = useMemo(() => {\n return getCurrentOrAllTimeRange(weeklyRanges);\n }, [weeklyRanges]);\n\n const isInCurrentWeek = useMemo(() => {\n return currentRange !== null;\n }, [currentRange]);\n\n const getCurrentRangeForDate = useCallback(\n (date: Date) => {\n return getCurrentWeeklyRange(weeklyRanges, date);\n },\n [weeklyRanges],\n );\n\n return {\n weeklyRanges,\n currentRange,\n currentOrAllTime,\n isInCurrentWeek,\n getCurrentRangeForDate,\n };\n}\n","import {\n format,\n subDays,\n addDays,\n isBefore,\n isAfter,\n isWithinInterval,\n} from \"date-fns\";\n\nexport const getDateRange = (offsetDay: number) => {\n return {\n from: subDays(new Date(), offsetDay - 1)!,\n to: new Date()!,\n };\n};\n\n/**\n * Format a date to \"yyyy-MM-dd\" format (e.g., \"2025-03-10\")\n * @param date The date to format\n * @returns Formatted date string\n */\nexport const formatDateRange = (date: Date): string => {\n return format(date, \"yyyy-MM-dd\");\n};\n\nfunction getUTCDateInfo(date: Date) {\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth();\n const day = date.getUTCDate();\n const hours = String(date.getUTCHours()).padStart(2, \"0\");\n const minutes = String(date.getUTCMinutes()).padStart(2, \"0\");\n\n return { year, month, day, hours, minutes };\n}\n\nexport function formatCampaignDate(date: Date | string): string {\n const monthNames = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ];\n if (typeof date === \"string\") {\n date = new Date(date);\n }\n const { year, month, day, hours, minutes } = getUTCDateInfo(date);\n return `${monthNames[month]} ${day}, ${year} ${hours}:${minutes}`;\n}\n\nexport function formatUpdateDate(timestamp: number) {\n const time = new Date(timestamp);\n try {\n return format(time, \"yyyy-MM-dd HH:mm\");\n } catch (error) {\n console.error(\"Error formatting time:\", error);\n return \"\";\n }\n}\n\nexport type WeeklyDateRange = {\n from: Date;\n to: Date;\n label: string;\n};\n\n/**\n * Split campaign date range into weekly periods and add an \"All time\" option\n * @param campaignDateRange Object containing start_time and end_time\n * @returns Array of date ranges with weekly splits plus \"All time\" option\n */\nexport function splitCampaignByWeeks(campaignDateRange: {\n start_time: Date | string;\n end_time: Date | string;\n}): WeeklyDateRange[] {\n const startDate =\n typeof campaignDateRange.start_time === \"string\"\n ? new Date(campaignDateRange.start_time)\n : campaignDateRange.start_time;\n\n const endDate =\n typeof campaignDateRange.end_time === \"string\"\n ? new Date(campaignDateRange.end_time)\n : campaignDateRange.end_time;\n\n const result: WeeklyDateRange[] = [];\n let currentWeekStart = new Date(startDate);\n let weekNumber = 1;\n\n while (isBefore(currentWeekStart, endDate)) {\n // Calculate the end of current week (6 days after start)\n const currentWeekEnd = addDays(currentWeekStart, 6);\n\n // If this week extends beyond the campaign end date, use the campaign end date\n // But subtract 1 millisecond to ensure we don't include the end date itself\n const actualWeekEnd = isAfter(currentWeekEnd, endDate)\n ? new Date(endDate.getTime() - 1)\n : currentWeekEnd;\n\n result.push({\n from: new Date(currentWeekStart),\n to: actualWeekEnd,\n label: `Week ${weekNumber}`,\n });\n\n // If the current week already reached the end date, break\n if (!isBefore(actualWeekEnd, endDate)) {\n break;\n }\n\n // Move to next week\n if (weekNumber === 1) {\n // For week 2 and onwards, start from 00:00:00 UTC of the next day\n const nextDayStart = addDays(currentWeekEnd, 1);\n const year = nextDayStart.getUTCFullYear();\n const month = nextDayStart.getUTCMonth();\n const date = nextDayStart.getUTCDate();\n currentWeekStart = new Date(Date.UTC(year, month, date, 0, 0, 0, 0));\n } else {\n // For subsequent weeks, continue the same pattern\n const nextDayStart = addDays(currentWeekEnd, 1);\n const year = nextDayStart.getUTCFullYear();\n const month = nextDayStart.getUTCMonth();\n const date = nextDayStart.getUTCDate();\n currentWeekStart = new Date(Date.UTC(year, month, date, 0, 0, 0, 0));\n }\n\n weekNumber++;\n\n // Safety check to prevent infinite loop\n if (weekNumber > 100) {\n console.warn(\n \"Too many weeks detected, breaking loop to prevent infinite iteration\",\n );\n break;\n }\n }\n\n // Add \"All time\" option covering the entire campaign period\n // result.push({\n // from: new Date(startDate),\n // to: new Date(endDate),\n // label: \"All time\",\n // });\n\n return result;\n}\n\n/**\n * Find the current weekly range that contains the given date (or current time)\n * @param weeklyRanges Array of weekly date ranges\n * @param targetDate The date to check (defaults to current time)\n * @returns The weekly range that contains the target date, or null if not found\n */\nexport function getCurrentWeeklyRange(\n weeklyRanges: WeeklyDateRange[],\n targetDate: Date = new Date(),\n): WeeklyDateRange | null {\n // Exclude \"All time\" range from the search since it's not a specific weekly period\n const weeklyOnlyRanges = weeklyRanges.filter(\n (range) => range.label !== \"All time\",\n );\n\n // First try exact match\n for (const range of weeklyOnlyRanges) {\n // Ensure range dates are properly converted to Date objects\n const rangeFrom = new Date(range.from);\n const rangeTo = new Date(range.to);\n\n // Check if target date is within the range (inclusive of both start and end)\n if (isWithinInterval(targetDate, { start: rangeFrom, end: rangeTo })) {\n return range;\n }\n }\n\n // If no exact match found, find the closest upcoming range\n // This handles cases where there are gaps between weekly periods\n const targetTime = targetDate.getTime();\n let closestFutureRange: WeeklyDateRange | null = null;\n let smallestGap = Infinity;\n\n for (const range of weeklyOnlyRanges) {\n const rangeFrom = new Date(range.from);\n const rangeFromTime = rangeFrom.getTime();\n\n // If the range starts after the target date, consider it as a candidate\n if (rangeFromTime > targetTime) {\n const gap = rangeFromTime - targetTime;\n if (gap < smallestGap) {\n smallestGap = gap;\n closestFutureRange = range;\n }\n }\n }\n\n // If there's a close upcoming range (within 24 hours), return it\n const ONE_DAY_MS = 24 * 60 * 60 * 1000;\n if (closestFutureRange && smallestGap <= ONE_DAY_MS) {\n return closestFutureRange;\n }\n\n return null;\n}\n\n/**\n * Get the current active weekly range or fallback to \"All time\"\n * @param weeklyRanges Array of weekly date ranges\n * @param targetDate The date to check (defaults to current time)\n * @returns The current weekly range or \"All time\" range as fallback\n */\nexport function getCurrentOrAllTimeRange(\n weeklyRanges: WeeklyDateRange[],\n targetDate: Date = new Date(),\n): WeeklyDateRange | undefined {\n // First try to find current weekly range\n const currentWeekly = getCurrentWeeklyRange(weeklyRanges, targetDate);\n if (currentWeekly) {\n return currentWeekly;\n }\n\n // If not in any weekly range, return \"All time\" range\n return (\n weeklyRanges.find((range) => range.label === \"All time\") ||\n weeklyRanges[weeklyRanges.length - 1]\n );\n}\n","import { FC } from \"react\";\nimport { cn, Box, useScreen } from \"@orderly.network/ui\";\nimport { GeneralRankingWidget } from \"../../ranking/generalRanking\";\nimport { RankingColumnFields } from \"../../ranking/shared/column\";\nimport { GeneralLeaderboardScriptReturn } from \"./generalLeaderboard.script\";\n\nexport type GeneralLeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n campaignDateRange?: {\n start_time: Date | string;\n end_time: Date | string;\n };\n} & GeneralLeaderboardScriptReturn;\n\nexport const GeneralLeaderboard: FC<GeneralLeaderboardProps> = (props) => {\n const { isMobile } = useScreen();\n\n const fields = [\"rank\", \"address\", \"points\"] as RankingColumnFields[];\n\n if (isMobile) {\n return (\n <Box\n pt={2}\n px={3}\n r=\"2xl\"\n intensity={900}\n width=\"100%\"\n className={cn(\n \"oui-trading-leaderboard-general-leaderboard oui-relative\",\n props.className,\n )}\n style={props.style}\n >\n <GeneralRankingWidget address={props.searchValue} fields={fields} />\n </Box>\n );\n }\n\n return (\n <Box\n pt={2}\n px={6}\n r=\"2xl\"\n className={cn(\n \"oui-trading-leaderboard-general-leaderboard oui-relative\",\n \"oui-mx-auto oui-max-w-[992px]\",\n props.className,\n )}\n style={props.style}\n >\n <GeneralRankingWidget address={props.searchValue} fields={fields} />\n </Box>\n );\n};\n","import { FC, useCallback } from \"react\";\nimport {\n cn,\n DataTable,\n Flex,\n Spinner,\n TanstackColumn,\n useScreen,\n} from \"@orderly.network/ui\";\nimport {\n type GeneralRankingData,\n GeneralRankingScriptReturn,\n} from \"../generalRanking/generalRanking.script\";\nimport { type RankingColumnFields, useRankingColumns } from \"./column\";\nimport { getCurrentAddressRowKey } from \"./util\";\n\ntype RankingData = GeneralRankingData;\n\nexport type RankingProps = {\n style?: React.CSSProperties;\n className?: string;\n fields: RankingColumnFields[];\n} & Omit<GeneralRankingScriptReturn, \"dataList\" | \"dataSource\"> & {\n dataList: RankingData[];\n dataSource: RankingData[];\n type?: \"general\" | \"campaign\";\n };\n\nexport const Ranking: FC<RankingProps> = (props) => {\n const column = useRankingColumns(\n props.fields,\n props.address,\n false,\n props.type,\n );\n const { isMobile } = useScreen();\n\n const onRow = useCallback(\n (record: RankingData, index: number) => {\n const isYou = record.key === getCurrentAddressRowKey(props.address!);\n const isFirst = record.rank === 1;\n const isSecond = record.rank === 2;\n const isThird = record.rank === 3;\n\n const showBg = isFirst || isSecond || isThird;\n\n return {\n className: cn(\n \"oui-h-[40px] md:oui-h-[48px]\",\n // use oui-relative to let the background image position based on row\n \"oui-relative\",\n isYou\n ? // add 4px extra height to make row has 2px space\n \"oui-h-[44px] md:oui-h-[52px]\"\n : cn(\n showBg && \"oui-border-b-2 oui-border-b-transparent\",\n isFirst &&\n \"oui-bg-[linear-gradient(270deg,rgba(241,215,121,0.0225)_-2.05%,rgba(255,203,70,0.45)_100%)]\",\n isSecond &&\n \"oui-bg-[linear-gradient(270deg,rgba(255,255,255,0.0225)_-2.05%,rgba(199,199,199,0.45)_100%)]\",\n isThird &&\n \"oui-bg-[linear-gradient(270deg,rgba(255,233,157,0.0225)_-1.3%,rgba(160,101,46,0.45)_100%)]\",\n ),\n ),\n };\n },\n [props.address],\n );\n\n const onCell = useCallback(\n (column: TanstackColumn<RankingData>, record: RankingData) => {\n const isFirstColumn = column.getIsFirstColumn();\n const isLastColumn = column.getIsLastColumn();\n const isRank = [1, 2, 3].includes(record.rank as number);\n return {\n className: cn(\n isFirstColumn &&\n isRank &&\n \"oui-rounded-l-lg oui-mix-blend-luminosity\",\n isLastColumn && isRank && \"oui-rounded-r-lg oui-mix-blend-luminosity\",\n ),\n };\n },\n [props.address],\n );\n\n if (isMobile) {\n return (\n <>\n <DataTable\n classNames={{\n root: \"oui-trading-leaderboard-ranking-table oui-bg-transparent\",\n body: \"oui-text-2xs\",\n scroll: \"oui-overflow-y-hidden oui-h-full\",\n }}\n loading={props.isLoading}\n columns={column}\n bordered\n dataSource={props.dataList}\n generatedRowKey={(record: RankingData) =>\n record.key || record.address\n }\n manualPagination\n manualSorting\n onRow={onRow}\n onCell={onCell}\n />\n <div\n ref={props.sentinelRef}\n className=\"oui-invisible oui-relative oui-top-[-300px] oui-h-px\"\n />\n {props.isLoading && props.dataList.length > 0 && (\n <Flex itemAlign=\"center\" justify=\"center\" width=\"100%\" height={40}>\n <Spinner size=\"sm\" />\n </Flex>\n )}\n </>\n );\n }\n\n return (\n <DataTable\n loading={props.isLoading}\n columns={column}\n bordered\n dataSource={props.dataSource}\n generatedRowKey={(record: RankingData) => record.key || record.address}\n manualPagination\n manualSorting\n pagination={props.pagination}\n classNames={{\n root: cn(\n \"oui-trading-leaderboard-ranking-table\",\n \"oui-bg-transparent\",\n \"oui-rounded-md\",\n \"oui-overflow-hidden\",\n \"!oui-h-[calc(100%_-_53px_-_8px)]\",\n ),\n scroll: \"oui-min-h-[600px] oui-max-h-[1250px]\",\n header: \"oui-bg-base-9\",\n }}\n onRow={onRow}\n onCell={onCell}\n />\n );\n};\n","import { ReactNode, useMemo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Text, Column, Box, cn, toast, useScreen } from \"@orderly.network/ui\";\nimport { commify } from \"@orderly.network/utils\";\nimport firstBadge from \"../../../img/first_badge.png\";\nimport secondBadge from \"../../../img/second_badge.png\";\nimport thirdBadge from \"../../../img/third_badge.png\";\nimport { getCurrentAddressRowKey } from \"./util\";\n\nexport type RankingColumnFields = \"rank\" | \"address\" | \"points\";\n\nexport const useRankingColumns = (\n fields?: RankingColumnFields[],\n address?: string,\n enableSort?: boolean,\n type?: \"general\" | \"campaign\",\n) => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n return useMemo(() => {\n const columns = [\n {\n title: t(\"tradingLeaderboard.rank\"),\n dataIndex: \"rank\",\n width: 50,\n render: (value: number, record: any) => {\n const isYou = record.key === getCurrentAddressRowKey(address!);\n\n let rankIcon: ReactNode;\n let badgeImg: ReactNode = null;\n\n if (!isYou) {\n if (value === 1) {\n rankIcon = <FirstRankIcon />;\n badgeImg = firstBadge;\n } else if (value === 2) {\n rankIcon = <SecondRankIcon />;\n badgeImg = secondBadge;\n } else if (value === 3) {\n rankIcon = <ThirdRankIcon />;\n badgeImg = thirdBadge;\n }\n }\n\n return (\n <>\n {badgeImg && (\n <img\n src={badgeImg as string}\n alt={`${value}th badge`}\n className={cn(\n \"oui-z-0 oui-h-[38px] oui-opacity-30 md:oui-h-[46px]\",\n \"oui-absolute oui-left-0 oui-top-0\",\n \"oui-mix-blend-luminosity\",\n // force create a separate layer in order to fix mix-blend-luminosity not working on ios\n \"oui-transform-gpu\",\n )}\n />\n )}\n <div className=\"oui-relative\">\n {rankIcon || (\n <Box width={20} pl={2} className=\"oui-text-center\">\n {value}\n </Box>\n )}\n </div>\n </>\n );\n },\n },\n {\n title: t(\"common.address\"),\n dataIndex: \"address\",\n render: (value: string, record: any) => {\n const isYou = record.key === getCurrentAddressRowKey(address!);\n if (isMobile && isYou) {\n return <Text>You</Text>;\n }\n\n return (\n <>\n <a\n className=\"oui-flex oui-items-start oui-gap-1\"\n href={`https://orderly-dashboard.orderly.network/address/${value}?broker_id=${record.broker_id}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <Text.formatted\n rule=\"address\"\n key={record.rank}\n onCopy={(e) => {\n e.preventDefault();\n e.stopPropagation();\n navigator.clipboard.writeText(value);\n toast.success(t(\"common.copy.copied\"));\n }}\n className=\"oui-cursor-pointer\"\n >\n {value}\n </Text.formatted>\n {isYou && <Text> (You)</Text>}\n </a>\n </>\n );\n },\n width: 90,\n },\n {\n title: \"Points\",\n dataIndex: \"points\",\n align: isMobile ? \"right\" : \"left\",\n render: (value: number | string) => {\n if (value === undefined || value === null || value === \"\") {\n return \"-\";\n }\n return <Text>{commify(value, 2)}</Text>;\n },\n },\n ] as Column[];\n\n return columns.filter((column) =>\n fields?.includes(column.dataIndex as RankingColumnFields),\n );\n }, [t, isMobile, address, fields, enableSort, type]);\n};\n\nconst FirstRankIcon = () => {\n return (\n <svg\n width=\"25\"\n height=\"25\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.88281 2.5L7.78711 10.3105C6.38111 11.5855 5.5 13.427 5.5 15.5C5.5 19.4 8.6 22.5 12.5 22.5C16.4 22.5 19.5 19.4 19.5 15.5C19.5 13.427 18.6189 11.5855 17.2129 10.3105L21.1172 2.5H15.5L12.5 8.5L9.5 2.5H3.88281ZM12.5 10.5C15.3 10.5 17.5 12.7 17.5 15.5C17.5 18.3 15.3 20.5 12.5 20.5C9.7 20.5 7.5 18.3 7.5 15.5C7.5 12.7 9.7 10.5 12.5 10.5ZM12.5 12.5C12.4 12.8 11.9 13.6992 11 13.6992V14.6992H12.0996V18.5H13.4004H13.5V12.5H12.5Z\"\n fill=\"url(#paint0_linear_21940_39199)\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_21940_39199\"\n x1=\"6.18073\"\n y1=\"6\"\n x2=\"20.1338\"\n y2=\"18.1659\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#8C421D\" />\n <stop offset=\"0.325272\" stopColor=\"#FBE67B\" />\n <stop offset=\"0.535488\" stopColor=\"#FCFBE7\" />\n <stop offset=\"0.769917\" stopColor=\"#F7D14E\" />\n <stop offset=\"1\" stopColor=\"#D4A041\" />\n </linearGradient>\n </defs>\n </svg>\n );\n};\n\nconst SecondRankIcon = () => {\n return (\n <svg\n width=\"25\"\n height=\"25\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.88281 2.5L7.78711 10.3105C6.38111 11.5855 5.5 13.427 5.5 15.5C5.5 19.4 8.6 22.5 12.5 22.5C16.4 22.5 19.5 19.4 19.5 15.5C19.5 13.427 18.6189 11.5855 17.2129 10.3105L21.1172 2.5H15.5L12.5 8.5L9.5 2.5H3.88281ZM12.5 10.5C15.3 10.5 17.5 12.7 17.5 15.5C17.5 18.3 15.3 20.5 12.5 20.5C9.7 20.5 7.5 18.3 7.5 15.5C7.5 12.7 9.7 10.5 12.5 10.5ZM12.5469 12.5C10.7729 12.5 10.481 13.901 10.5 14.5H11.6738C11.6738 14.357 11.809 13.5 12.5 13.5C13.163 13.5 13.291 14.0232 13.291 14.2852C13.291 15.0512 12.245 15.7623 10.5 17.6973V18.5L14.4883 18.4766L14.4863 17.5332H12.2285C13.8425 15.8792 14.5 15.1309 14.5 14.1719C14.5 13.4869 14.1149 12.5 12.5469 12.5Z\"\n fill=\"url(#paint0_linear_21940_39214)\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_21940_39214\"\n x1=\"6.18073\"\n y1=\"6\"\n x2=\"20.1338\"\n y2=\"18.1659\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#7F7F7F\" />\n <stop offset=\"0.325272\" stopColor=\"#D9D9D9\" />\n <stop offset=\"0.535488\" stopColor=\"#F7F6F4\" />\n <stop offset=\"0.769917\" stopColor=\"#D9D9D9\" />\n <stop offset=\"1\" stopColor=\"#7F7F7F\" />\n </linearGradient>\n </defs>\n </svg>\n );\n};\n\nconst ThirdRankIcon = () => {\n return (\n <svg\n width=\"29\"\n height=\"25\"\n viewBox=\"0 0 29 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.88281 2.5L9.78711 10.3105C8.38111 11.5855 7.5 13.427 7.5 15.5C7.5 19.4 10.6 22.5 14.5 22.5C18.4 22.5 21.5 19.4 21.5 15.5C21.5 13.427 20.6189 11.5855 19.2129 10.3105L23.1172 2.5H17.5L14.5 8.5L11.5 2.5H5.88281ZM14.5 10.5C17.3 10.5 19.5 12.7 19.5 15.5C19.5 18.3 17.3 20.5 14.5 20.5C11.7 20.5 9.5 18.3 9.5 15.5C9.5 12.7 11.7 10.5 14.5 10.5ZM14.4688 12.5C13.6927 12.5 12.5898 12.9348 12.5898 14.0918H13.7266C13.7266 13.9118 13.8461 13.4336 14.4941 13.4336C14.6251 13.4336 15.2715 13.4767 15.2715 14.1797C15.2715 14.8967 14.7109 14.9844 14.4219 14.9844H13.8145V15.8906H14.4219C14.5659 15.8906 15.3613 15.8537 15.3613 16.7637C15.3613 16.8837 15.3111 17.5625 14.4961 17.5625C13.8081 17.5625 13.6233 17.0284 13.6562 16.8164H12.5195C12.4615 17.4334 12.9757 18.4961 14.4688 18.4961C15.3018 18.4961 16.5 18.0942 16.5 16.7812C16.5 15.8643 15.8621 15.536 15.5391 15.418C15.6781 15.354 16.4082 14.9771 16.4082 14.1641C16.4082 13.7131 16.2127 12.5 14.4688 12.5Z\"\n fill=\"url(#paint0_linear_21940_39224)\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_21940_39224\"\n x1=\"8.61159\"\n y1=\"5.33333\"\n x2=\"22.7368\"\n y2=\"20.4383\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#B6947E\" />\n <stop offset=\"0.2\" stopColor=\"#8F6959\" />\n <stop offset=\"0.475\" stopColor=\"#F8DAC8\" />\n <stop offset=\"0.67\" stopColor=\"#AC836E\" />\n <stop offset=\"0.83\" stopColor=\"#B6947E\" />\n <stop offset=\"1\" stopColor=\"#F8DCCB\" />\n </linearGradient>\n </defs>\n </svg>\n );\n};\n","export function isSameAddress(address1: string, address2: string) {\n return address1.toLowerCase() === address2.toLowerCase();\n}\n\nexport function getCurrentAddressRowKey(address: string) {\n return `current-address-${address?.toLowerCase()}`;\n}\n","import { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useConfig, useInfiniteQuery, useQuery } from \"@orderly.network/hooks\";\nimport { API } from \"@orderly.network/types\";\nimport { usePagination, useScreen } from \"@orderly.network/ui\";\nimport { useEndReached } from \"../../../hooks/useEndReached\";\nimport { usePoints } from \"../../../hooks/usePointsData\";\nimport { getCurrentAddressRowKey, isSameAddress } from \"../shared/util\";\n\nexport type GeneralRankingData = {\n address: string;\n points?: number;\n rank?: number | string;\n broker_id?: string | number | null;\n key?: string;\n};\n\nexport type GeneralRankingResponse = {\n meta: API.RecordsMeta;\n rows: Array<{\n rank: number;\n address: string;\n total_points: number;\n }>;\n};\nexport type GeneralRankingScriptReturn = ReturnType<\n typeof useGeneralRankingScript\n>;\n\nexport type GeneralRankingScriptOptions = {\n address?: string;\n};\n\nexport function useGeneralRankingScript(options?: GeneralRankingScriptOptions) {\n const { address: searchValue } = options || {};\n\n const brokerId = useConfig(\"brokerId\");\n const { currentStage, userStatistics, getRankingUrl, selectedTimeRange } =\n usePoints();\n const { isMobile } = useScreen();\n\n const { page, pageSize, setPage, parsePagination } = usePagination({\n pageSize: 10,\n });\n\n const { data, isLoading } = useQuery<GeneralRankingResponse>(\n currentStage && brokerId\n ? getRankingUrl({ page, pageSize, timeRange: selectedTimeRange })\n : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const {\n data: infiniteData,\n size,\n setSize,\n isValidating,\n } = useInfiniteQuery<GeneralRankingResponse>(\n (pageIndex: number, previousPageData: any): string | null => {\n // reached the end\n if (previousPageData && !previousPageData.rows?.length) return null;\n if (!isMobile || !currentStage) return null;\n return getRankingUrl({\n page: pageIndex + 1,\n pageSize,\n timeRange: selectedTimeRange,\n });\n },\n {\n initialSize: 1,\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const userDataList = useMemo(() => {\n if (!userStatistics?.address) return [];\n\n let rank: number | string = \"-\";\n let points: number | undefined;\n\n if (selectedTimeRange === \"all_time\") {\n rank = userStatistics.stage_rank ?? \"-\";\n points = userStatistics.stage_points;\n } else if (selectedTimeRange === \"this_week\") {\n rank = userStatistics.weekly_breakdown?.this_week?.rank ?? \"-\";\n const breakdown = userStatistics.weekly_breakdown?.this_week;\n points = breakdown\n ? breakdown.trading_point +\n breakdown.pnl_point +\n breakdown.referral_point\n : undefined;\n } else if (selectedTimeRange === \"last_week\") {\n rank = userStatistics.weekly_breakdown?.last_week?.rank ?? \"-\";\n const breakdown = userStatistics.weekly_breakdown?.last_week;\n points = breakdown\n ? breakdown.trading_point +\n breakdown.pnl_point +\n breakdown.referral_point\n : undefined;\n }\n\n return [\n {\n key: getCurrentAddressRowKey(userStatistics.address),\n address: userStatistics.address,\n rank,\n points,\n broker_id: brokerId ?? null,\n },\n ];\n }, [userStatistics, brokerId, selectedTimeRange]);\n\n const addRankForList = useCallback(\n (list: GeneralRankingData[]) => {\n return list?.map((item, index) => ({\n ...item,\n rank: index + 1 + (page - 1) * pageSize,\n }));\n },\n [page, pageSize],\n );\n\n const dataSource = useMemo(() => {\n const mapped = (data?.rows || []).map((row) => ({\n address: row.address,\n points: row.total_points,\n rank: row.rank,\n broker_id: brokerId ?? null,\n }));\n\n const filtered = searchValue\n ? mapped.filter((item) => isSameAddress(item.address, searchValue || \"\"))\n : mapped;\n\n const finalList = addRankForList(filtered);\n if (page === 1 && !searchValue && userDataList.length) {\n return [...userDataList, ...finalList];\n }\n return finalList;\n }, [data, brokerId, searchValue, addRankForList, page, userDataList]);\n\n const dataList = useMemo(() => {\n if (!infiniteData?.length) return [];\n const flat = infiniteData.map((p) => p.rows).flat();\n const mapped = flat.map((row) => ({\n address: row.address,\n points: row.total_points,\n broker_id: brokerId ?? null,\n }));\n const filtered = searchValue\n ? mapped.filter((item) => isSameAddress(item.address, searchValue))\n : mapped;\n const rankList = addRankForList(filtered);\n if (!searchValue && userDataList.length) {\n return [...userDataList, ...rankList];\n }\n return rankList;\n }, [infiniteData, brokerId, searchValue, addRankForList, userDataList]);\n\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n const pagination = useMemo(\n () =>\n parsePagination({\n total: data?.meta?.total || 0,\n current_page: data?.meta?.current_page || 1,\n records_per_page: pageSize,\n }),\n [data?.meta?.total, data?.meta?.current_page, pageSize],\n );\n\n useEndReached(sentinelRef, () => {\n if (!isValidating && isMobile) {\n setSize(size + 1);\n }\n });\n\n useEffect(() => {\n if (searchValue) setPage(1);\n }, [searchValue, setPage]);\n\n useEffect(() => {\n setPage(1);\n }, [currentStage?.stage_id, setPage]);\n\n useEffect(() => {\n setPage(1);\n setSize(1); // Reset infinite query\n }, [selectedTimeRange, setPage, setSize]);\n\n return {\n pagination,\n dataSource,\n isLoading: isLoading || isValidating,\n isMobile,\n sentinelRef,\n dataList,\n address: userStatistics?.address,\n };\n}\n","import { useEffect, useRef, MutableRefObject } from \"react\";\n\n/**\n * Listen for the specified element to scroll to the bottom\n */\nexport function useEndReached(\n sentinelRef: MutableRefObject<HTMLDivElement | null>,\n onEndReached?: () => void,\n) {\n const observer = useRef<IntersectionObserver>();\n const cb = useRef(onEndReached);\n\n cb.current = onEndReached;\n\n useEffect(() => {\n const options: IntersectionObserverInit = {\n root: null,\n rootMargin: \"0px\",\n threshold: 0,\n };\n\n const handleObserver = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n cb.current?.();\n }\n });\n };\n\n observer.current = new IntersectionObserver(handleObserver, options);\n\n return () => {\n observer.current?.disconnect();\n };\n }, []);\n\n useEffect(() => {\n if (sentinelRef.current) {\n observer.current?.observe(sentinelRef.current);\n }\n }, [sentinelRef.current]);\n}\n","import { FC } from \"react\";\nimport { Ranking, RankingProps } from \"../shared/ranking.ui\";\nimport {\n GeneralRankingScriptOptions,\n useGeneralRankingScript,\n} from \"./generalRanking.script\";\n\nexport type GeneralRankingWidgetProps = Pick<\n RankingProps,\n \"style\" | \"className\" | \"fields\"\n> &\n GeneralRankingScriptOptions;\n\nexport const GeneralRankingWidget: FC<GeneralRankingWidgetProps> = (props) => {\n const { address, fields, ...rest } = props;\n const state = useGeneralRankingScript({ address });\n return <Ranking {...state} {...rest} fields={fields} type=\"general\" />;\n};\n","import { FC } from \"react\";\nimport { useGeneralLeaderboardScript } from \"./generalLeaderboard.script\";\nimport {\n GeneralLeaderboard,\n GeneralLeaderboardProps,\n} from \"./generalLeaderboard.ui\";\n\nexport type GeneralLeaderboardWidgetProps = Pick<\n GeneralLeaderboardProps,\n \"style\" | \"className\" | \"campaignDateRange\"\n>;\n\nexport const GeneralLeaderboardWidget: FC<GeneralLeaderboardWidgetProps> = (\n props,\n) => {\n const state = useGeneralLeaderboardScript({\n campaignDateRange: props.campaignDateRange,\n });\n\n return (\n <GeneralLeaderboard\n {...state}\n className={props.className}\n style={props.style}\n />\n );\n};\n","import { FC, useState, useEffect } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Box, Flex, Text, useScreen } from \"@orderly.network/ui\";\nimport { usePoints } from \"../../hooks/usePointsData\";\n\ninterface CountdownTimerProps {\n className?: string;\n}\n\ninterface TimeLeft {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nexport const Countdown: FC<CountdownTimerProps> = ({ className }) => {\n const { isMobile } = useScreen();\n const { currentStage } = usePoints();\n const { t } = useTranslation();\n const [timeLeft, setTimeLeft] = useState<TimeLeft>({\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0,\n });\n\n useEffect(() => {\n if (currentStage?.status !== \"pending\" || !currentStage?.start_time) {\n return;\n }\n\n const calculateTimeLeft = (): TimeLeft => {\n const targetDate = currentStage.start_time * 1000; // Convert to milliseconds\n const now = new Date().getTime();\n const difference = targetDate - now;\n\n if (difference > 0) {\n return {\n days: Math.floor(difference / (1000 * 60 * 60 * 24)),\n hours: Math.floor((difference / (1000 * 60 * 60)) % 24),\n minutes: Math.floor((difference / 1000 / 60) % 60),\n seconds: Math.floor((difference / 1000) % 60),\n };\n }\n\n return { days: 0, hours: 0, minutes: 0, seconds: 0 };\n };\n\n // Initial calculation\n setTimeLeft(calculateTimeLeft());\n\n // Update every second\n const timer = setInterval(() => {\n setTimeLeft(calculateTimeLeft());\n }, 1000);\n\n return () => clearInterval(timer);\n }, [currentStage]);\n\n const formatNumber = (num: number): string => {\n return num.toString().padStart(2, \"0\");\n };\n\n if (currentStage?.status !== \"pending\" || !currentStage?.start_time) {\n return null;\n }\n\n const targetDate = currentStage.start_time * 1000;\n const now = new Date().getTime();\n\n if (targetDate <= now) {\n return null;\n }\n\n return (\n <Flex\n gap={4}\n itemAlign=\"center\"\n justify=\"center\"\n px={9}\n className={className}\n >\n {!isMobile && (\n <Box\n className=\"oui-w-[200px] oui-h-[1px]\"\n style={{\n background: `linear-gradient(123deg, rgba(176, 132, 233, 0.00) 0%, #DEC4FF 123.91%)`,\n }}\n />\n )}\n <Box className=\"oui-rounded-2xl\" p={5}>\n <Flex direction=\"column\" gap={2} itemAlign=\"center\">\n <Text className=\"oui-text-white/[.36] oui-text-lg\">\n {t(\"tradingPoints.startsIn\")}\n </Text>\n <Flex gap={2} itemAlign=\"center\" justify=\"center\">\n <Flex direction=\"column\" gap={1} itemAlign=\"center\">\n <Text className=\"oui-text-white/98 oui-text-4xl oui-font-bold oui-w-16 oui-text-center\">\n {formatNumber(timeLeft.days)}\n </Text>\n <Text className=\"oui-text-base-contrast-80 oui-text-xs oui-w-16 oui-text-center\">\n {t(\"tradingPoints.days\")}\n </Text>\n </Flex>\n <Box className=\"oui-w-1 oui-h-1 oui-rounded-full oui-bg-base-4\" />\n <Flex direction=\"column\" gap={1} itemAlign=\"center\">\n <Text className=\"oui-text-white/98 oui-text-4xl oui-font-bold oui-w-16 oui-text-center\">\n {formatNumber(timeLeft.hours)}\n </Text>\n <Text className=\"oui-text-base-contrast-80 oui-text-xs oui-w-16 oui-text-center\">\n {t(\"tradingPoints.hours\")}\n </Text>\n </Flex>\n <Box className=\"oui-w-1 oui-h-1 oui-rounded-full oui-bg-base-4\" />\n <Flex direction=\"column\" gap={1} itemAlign=\"center\">\n <Text className=\"oui-text-white/98 oui-text-4xl oui-font-bold oui-w-16 oui-text-center\">\n {formatNumber(timeLeft.minutes)}\n </Text>\n <Text className=\"oui-text-base-contrast-80 oui-text-xs oui-w-16 oui-text-center\">\n {t(\"tradingPoints.minutes\")}\n </Text>\n </Flex>\n <Box className=\"oui-w-1 oui-h-1 oui-rounded-full oui-bg-base-4\" />\n <Flex direction=\"column\" gap={1} itemAlign=\"center\">\n <Text className=\"oui-text-white/98 oui-text-4xl oui-font-bold oui-w-16 oui-text-center\">\n {formatNumber(timeLeft.seconds)}\n </Text>\n <Text className=\"oui-text-base-contrast-80 oui-text-xs oui-w-16 oui-text-center\">\n {t(\"tradingPoints.seconds\")}\n </Text>\n </Flex>\n </Flex>\n </Flex>\n </Box>\n {!isMobile && (\n <Box\n className=\"oui-w-[200px] oui-h-[1px]\"\n style={{\n background: `linear-gradient(270deg, rgba(176, 132, 233, 0.00) 0%, #DEC4FF 123.91%)`,\n }}\n />\n )}\n </Flex>\n );\n};\n","import { FC, useState } from \"react\";\nimport { useConfig } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Box, Flex, Text, cn, useScreen, Divider } from \"@orderly.network/ui\";\nimport { ChevronDownIcon } from \"@orderly.network/ui\";\n\ninterface FAQItemProps {\n question: string;\n answer: string;\n}\n\nconst FAQItem: FC<FAQItemProps> = ({ question, answer }) => {\n const { isMobile } = useScreen();\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <Flex\n onClick={() => setIsOpen(!isOpen)}\n direction=\"column\"\n className=\"oui-w-full\"\n itemAlign={\"start\"}\n >\n <Flex\n gap={4}\n className=\"oui-w-full oui-cursor-pointer hover:oui-opacity-80 oui-transition-opacity\"\n >\n <Text\n className={cn(\n \"oui-flex-1 oui-text-white oui-font-semibold oui-tracking-[0.03em]\",\n isMobile\n ? \"oui-text-lg oui-leading-[26px]\"\n : \"oui-text-xl oui-leading-8\",\n )}\n >\n {question}\n </Text>\n <ChevronDownIcon\n size={24}\n className={cn(\n \"oui-text-white oui-transition-transform oui-duration-300 oui-flex-shrink-0\",\n isOpen && \"oui-rotate-180\",\n )}\n />\n </Flex>\n <Box\n className={cn(\n \"oui-overflow-hidden oui-transition-all oui-duration-300\",\n isOpen && \"oui-mt-4\",\n )}\n style={{\n maxHeight: isOpen ? \"500px\" : \"0px\",\n opacity: isOpen ? 1 : 0,\n }}\n >\n <Text\n className=\"oui-text-base-contrast-54 oui-text-sm oui-leading-relaxed\"\n style={{ whiteSpace: \"pre-line\" }}\n >\n {answer}\n </Text>\n </Box>\n </Flex>\n );\n};\n\ninterface FAQSectionProps {\n className?: string;\n}\n\nexport const FAQSection: FC<FAQSectionProps> = ({ className }) => {\n const brokerName = useConfig(\"brokerName\");\n const { isMobile } = useScreen();\n const { t } = useTranslation();\n const faqData = [\n {\n question: t(\"tradingPoints.faq.whatArePoints.question\"),\n answer: t(\"tradingPoints.faq.whatArePoints.answer\", { brokerName }),\n },\n {\n question: t(\"tradingPoints.faq.allocation.question\"),\n answer: t(\"tradingPoints.faq.allocation.answer\"),\n },\n {\n question: t(\"tradingPoints.faq.distribution.question\"),\n answer: t(\"tradingPoints.faq.distribution.answer\"),\n },\n {\n question: t(\"tradingPoints.faq.pnl.question\"),\n answer: t(\"tradingPoints.faq.pnl.answer\"),\n },\n {\n question: t(\"tradingPoints.faq.referral.question\"),\n answer: t(\"tradingPoints.faq.referral.answer\"),\n },\n ];\n\n return (\n <Flex\n direction=\"column\"\n gap={6}\n className={className}\n itemAlign={\"start\"}\n id=\"points-faq\"\n >\n <Text\n className={cn(\n \"oui-text-base-contrast oui-font-normal oui-tracking-[0.03em]\",\n isMobile\n ? \"oui-text-2xl oui-leading-8\"\n : \"oui-text-3xl oui-leading-10\",\n )}\n >\n {t(\"tradingPoints.faq.title\")}\n </Text>\n <Flex\n direction=\"column\"\n gap={8}\n className=\"oui-w-full\"\n itemAlign={\"start\"}\n >\n {faqData.map((faq, index) => (\n <div key={index} className=\"oui-w-full\">\n <FAQItem question={faq.question} answer={faq.answer} />\n {index < faqData.length - 1 && (\n <Divider className=\"oui-mt-8\" intensity={8} />\n )}\n </div>\n ))}\n </Flex>\n </Flex>\n );\n};\n","import { useState } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n Box,\n Flex,\n Text,\n cn,\n useScreen,\n Divider,\n CopyIcon,\n ChevronDownIcon,\n toast,\n DropdownMenuContent,\n DropdownMenuPortal,\n DropdownMenuRoot,\n DropdownMenuTrigger,\n} from \"@orderly.network/ui\";\nimport { usePoints } from \"../../hooks/usePointsData\";\n\nexport const Intro = () => {\n const { isMobile } = useScreen();\n const {\n currentStage,\n stages,\n setCurrentStage,\n refLink,\n refCode,\n allTimePointsDisplay,\n isNoCampaign,\n } = usePoints();\n\n const [isStageDropdownOpen, setIsStageDropdownOpen] = useState(false);\n\n const { t } = useTranslation();\n\n const onCopyCode = async () => {\n try {\n await navigator.clipboard.writeText(refCode);\n toast.success(t(\"common.copy.copied\"));\n } catch (error) {\n console.error(\"Failed to copy code:\", error);\n }\n };\n\n const onCopyLink = async () => {\n try {\n await navigator.clipboard.writeText(refLink);\n toast.success(t(\"common.copy.copied\"));\n } catch (error) {\n console.error(\"Failed to copy link:\", error);\n }\n };\n\n const handleLearnMore = () => {\n const faqElement = document.getElementById(\"points-faq\");\n if (faqElement) {\n faqElement.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n };\n\n const formatStageDate = (startTime: number, endTime: number | null) => {\n const formatDate = (timestamp: number) => {\n const date = new Date(timestamp * 1000);\n const month = String(date.getUTCMonth() + 1).padStart(2, \"0\");\n const day = String(date.getUTCDate()).padStart(2, \"0\");\n const year = date.getUTCFullYear();\n return `${month}/${day}/${year}`;\n };\n\n const startDate = formatDate(startTime);\n const endDate = endTime ? formatDate(endTime) : \"Recurring\";\n return `${startDate} - ${endDate}`;\n };\n\n return (\n <Flex direction=\"column\" gap={8} className=\"oui-w-full\">\n {isNoCampaign ? (\n <Flex\n direction=\"column\"\n gap={6}\n itemAlign=\"start\"\n className=\"oui-w-full\"\n >\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n gap={4}\n itemAlign={isMobile ? \"start\" : \"center\"}\n justify=\"between\"\n className=\"oui-w-full\"\n >\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n itemAlign={isMobile ? \"start\" : \"center\"}\n className={isMobile ? \"oui-w-full\" : \"\"}\n >\n <Text\n className={cn(\n \"oui-text-base-contrast\",\n isMobile ? \"oui-text-xl\" : \"oui-text-4xl\",\n \"oui-font-600 oui-tracking-[0.03em] oui-leading-tight\",\n )}\n >\n No Active Campaigns\n </Text>\n </Flex>\n </Flex>\n\n {/* Description */}\n <Text\n className={cn(\n \"oui-text-[14px]\",\n \"oui-leading-[20px]\",\n \"oui-font-semibold\",\n \"oui-text-base-contrast-54\",\n )}\n >\n There are currently no active point events. Please wait for the next\n update.\n </Text>\n </Flex>\n ) : (\n <Flex\n direction=\"column\"\n gap={6}\n itemAlign=\"start\"\n className=\"oui-w-full\"\n >\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n gap={4}\n itemAlign={isMobile ? \"start\" : \"center\"}\n justify=\"between\"\n className=\"oui-w-full\"\n >\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n itemAlign={isMobile ? \"start\" : \"center\"}\n className={isMobile ? \"oui-w-full\" : \"\"}\n >\n <Text\n className={cn(\n \"oui-text-base-contrast\",\n isMobile ? \"oui-text-xl\" : \"oui-text-4xl\",\n \"oui-font-600 oui-tracking-[0.03em] oui-leading-tight\",\n )}\n >\n Stage {currentStage?.epoch_period} ·\n </Text>\n <Flex gap={3} itemAlign=\"center\">\n <Text\n className={cn(\n isMobile ? \"oui-text-xl\" : \"oui-text-4xl\",\n \"oui-text-primary\",\n \"oui-text-center\",\n \"oui-pl-2\",\n )}\n >\n {currentStage?.stage_name}\n </Text>\n <img\n src=\"https://oss.woo.org/static/images/sdk/pt-hot.png\"\n alt=\"Hot\"\n className={\n isMobile ? \"oui-w-8 oui-h-8\" : \"oui-w-[48px] oui-h-[48px]\"\n }\n />\n </Flex>\n </Flex>\n\n <DropdownMenuRoot\n open={isStageDropdownOpen}\n onOpenChange={setIsStageDropdownOpen}\n >\n <DropdownMenuTrigger asChild>\n <Flex\n gap={2}\n itemAlign=\"center\"\n px={3}\n py={2}\n className=\"oui-w-[230px] oui-bg-white/[.06] oui-border oui-border-white/[0.12] oui-rounded-md hover:oui-cursor-pointer hover:oui-opacity-80 oui-transition-opacity\"\n >\n <Text className=\"oui-flex-1 oui-text-[11px] oui-tracking-[0.03em] oui-whitespace-nowrap oui-text-white/[.36]\">\n {currentStage\n ? `Stage ${currentStage.epoch_period}: ${formatStageDate(currentStage.start_time, currentStage.end_time)}`\n : \"\"}\n </Text>\n <ChevronDownIcon\n size={12}\n className={cn(\n \"oui-text-white/[.36]\",\n \"oui-transition-transform\",\n isStageDropdownOpen && \"oui-rotate-180\",\n )}\n />\n </Flex>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n onCloseAutoFocus={(e) => e.preventDefault()}\n onClick={(e) => e.stopPropagation()}\n sideOffset={4}\n collisionPadding={{ right: 16 }}\n className={cn(\n \"oui-bg-base-8 oui-w-[230px] oui-p-1 oui-rounded-lg\",\n \"oui-border oui-border-line-6\",\n \"oui-font-semibold\",\n \"oui-shadow-[0px_3px_6px_0px_rgba(0,0,0,0.2)]\",\n )}\n >\n <Flex\n direction=\"column\"\n itemAlign=\"start\"\n gap={0}\n className=\"oui-w-full\"\n >\n {stages?.rows?.map((stage) => {\n const isSelected =\n currentStage?.stage_id === stage.stage_id;\n const isDisabled = stage.status !== \"active\";\n const isActive = stage.status === \"active\";\n return (\n <Flex\n key={stage.stage_id}\n gap={2}\n itemAlign=\"center\"\n px={2}\n py={2}\n r=\"sm\"\n onClick={() => {\n setCurrentStage(stage);\n setIsStageDropdownOpen(false);\n }}\n className={cn(\n \"oui-rounded oui-relative oui-w-full\",\n \"hover:oui-cursor-pointer hover:oui-opacity-80\",\n isSelected\n ? \"oui-bg-base-5\"\n : \"hover:oui-bg-base-5/50\",\n )}\n >\n <Text\n className={cn(\n \"oui-text-[11px] oui-tracking-[0.03em] oui-whitespace-nowrap\",\n isSelected\n ? \"oui-text-base-contrast-54 oui-font-semibold\"\n : \"oui-text-white/[.36]\",\n )}\n >\n {`Stage ${stage.epoch_period}: ${formatStageDate(stage.start_time, stage.end_time)}`}\n </Text>\n {isActive && (\n <Box className=\"oui-w-1 oui-h-1 oui-rounded-full oui-bg-primary oui-flex-shrink-0\" />\n )}\n </Flex>\n );\n })}\n </Flex>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n </Flex>\n\n {/* Description */}\n <Text\n className={cn(\n \"oui-text-[14px]\",\n \"oui-leading-[20px]\",\n \"oui-font-semibold\",\n \"oui-text-base-contrast-54\",\n )}\n >\n {currentStage?.stage_description}\n <span\n className=\"oui-text-primary hover:oui-underline oui-cursor-pointer\"\n onClick={handleLearnMore}\n >\n {\" \"}\n {t(\"tradingPoints.learnMore\")}\n </span>\n </Text>\n </Flex>\n )}\n {/* Stage Points Cards */}\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n gap={6}\n className=\"oui-w-full\"\n >\n {/* Stage Points & Ranking Card */}\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n gap={6}\n itemAlign={isMobile ? \"stretch\" : \"center\"}\n p={5}\n r=\"2xl\"\n style={{ height: isMobile ? \"\" : 104 }}\n className={cn(\n \"oui-border oui-border-line\",\n !isMobile && \"oui-gap-12\",\n isMobile ? \"oui-w-full\" : \"oui-flex-1\",\n )}\n >\n <Flex\n direction=\"column\"\n gap={2}\n className=\"oui-flex-1\"\n itemAlign=\"start\"\n >\n <Text className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em]\">\n {t(\"tradingPoints.stagePoints\")}\n </Text>\n <Text className=\"oui-text-base-contrast oui-text-[28px] oui-tracking-[0.03em] oui-leading-9\">\n {allTimePointsDisplay.currentPointsDisplay}\n </Text>\n </Flex>\n {!isMobile && (\n <Box\n className={cn(\"oui-w-[1px]\", \"oui-h-full\", \"oui-bg-white/[0.08]\")}\n />\n )}\n {isMobile && <Divider intensity={8} />}\n <Flex\n direction=\"column\"\n gap={2}\n className=\"oui-flex-1\"\n itemAlign=\"start\"\n >\n <Text className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em]\">\n {t(\"tradingPoints.stageRanking\")}\n </Text>\n <Text className=\"oui-text-base-contrast oui-text-[28px] oui-tracking-[0.03em] oui-leading-9\">\n {allTimePointsDisplay.rankingDisplay}\n </Text>\n </Flex>\n </Flex>\n\n {/* Referral Card */}\n <Flex\n p={5}\n r=\"2xl\"\n style={{ height: 104 }}\n className={cn(\n \"oui-border oui-border-line\",\n isMobile ? \"oui-w-full\" : \"oui-flex-1\",\n \"oui-h-[128px]\",\n )}\n >\n <Flex direction=\"column\" gap={4} className=\"oui-w-full\">\n <Flex gap={2} itemAlign=\"center\" className=\"oui-w-full\">\n <Text className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em]\">\n {t(\"tradingPoints.referralCode\")}\n </Text>\n <Flex\n gap={2}\n itemAlign=\"center\"\n justify=\"end\"\n className=\"oui-flex-1\"\n >\n <Text className=\"oui-text-base-contrast oui-text-sm oui-tracking-[0.03em]\">\n {refCode}\n </Text>\n <CopyIcon\n size={16}\n className=\"oui-text-white hover:oui-cursor-pointer hover:oui-opacity-80 oui-transition-opacity\"\n onClick={onCopyCode}\n />\n </Flex>\n </Flex>\n <Flex gap={2} itemAlign=\"start\" className=\"oui-w-full\">\n <Text className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em] oui-flex-shrink-0\">\n {t(\"tradingPoints.referralLink\")}\n </Text>\n <Flex\n gap={2}\n itemAlign=\"start\"\n className=\"oui-flex-1 oui-min-w-0\"\n >\n <Text className=\"oui-text-base-contrast oui-text-sm oui-tracking-[0.03em] oui-flex-1 oui-truncate oui-text-right\">\n {refLink}\n </Text>\n <CopyIcon\n size={16}\n className=\"oui-text-white hover:oui-cursor-pointer hover:oui-opacity-80 oui-transition-opacity\"\n onClick={onCopyLink}\n />\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n );\n};\n","import { FC, useCallback } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n Box,\n Flex,\n Text,\n cn,\n useScreen,\n Divider,\n Button,\n Tooltip,\n toast,\n} from \"@orderly.network/ui\";\n// import { AuthGuard } from \"@orderly.network/ui-connector\";\nimport { usePoints } from \"../../hooks/usePointsData\";\nimport { RouteOption } from \"./page\";\n\ntype UserProps = {\n onRouteChange: (option: RouteOption) => void;\n};\n\nexport const User: FC<UserProps> = ({ onRouteChange }) => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const {\n refLink,\n selectedTimeRange,\n setSelectedTimeRange,\n pointsDisplay,\n userStatistics,\n isCurrentStageCompleted,\n } = usePoints();\n\n const timeRangeOptions = [\n { value: \"this_week\" as const, label: t(\"tradingPoints.thisWeek\") },\n { value: \"last_week\" as const, label: t(\"tradingPoints.lastWeek\") },\n { value: \"all_time\" as const, label: t(\"tradingPoints.all\") },\n ];\n\n if (isCurrentStageCompleted) {\n if (selectedTimeRange !== \"all_time\") {\n setSelectedTimeRange(\"all_time\");\n }\n timeRangeOptions.splice(0, 2);\n }\n\n const timeRangeButtonClass = cn(\n \"oui-inline-flex oui-items-center oui-justify-center oui-whitespace-nowrap\",\n \"oui-box-content oui-rounded oui-px-3 oui-h-7\",\n \"oui-font-medium oui-text-2xs oui-text-base-contrast-36\",\n \"hover:oui-text-base-contrast-54 hover:oui-bg-base-5\",\n \"oui-bg-base-7\",\n \"data-[state=active]:oui-bg-base-5 data-[state=active]:oui-text-base-contrast\",\n \"oui-transition-all focus-visible:oui-outline-none\",\n \"focus-visible:oui-ring-2 focus-visible:oui-ring-ring focus-visible:oui-ring-offset-2\",\n \"disabled:oui-pointer-events-none disabled:oui-opacity-50\",\n );\n\n const currentPointsDisplay = pointsDisplay.currentPointsDisplay;\n const rankingDisplay = pointsDisplay.rankingDisplay;\n const tradingPointsDisplay = pointsDisplay.tradingPointsDisplay;\n const pnlPointsDisplay = pointsDisplay.pnlPointsDisplay;\n const referralPointsDisplay = pointsDisplay.referralPointsDisplay;\n\n const formatReferralBoost = (value: number | null | undefined) => {\n return value !== null && value !== undefined ? value : \"--\";\n };\n\n const goToPerp = useCallback(() => {\n onRouteChange({\n href: \"/perp\",\n name: \"Perp\",\n });\n }, [onRouteChange]);\n\n const onCopy = async () => {\n try {\n await navigator.clipboard.writeText(refLink);\n toast.success(t(\"common.copy.copied\"));\n } catch (error) {\n console.error(\"Failed to copy link:\", error);\n }\n };\n\n const userStats = (\n <>\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n gap={4}\n itemAlign=\"stretch\"\n className=\"oui-w-full\"\n >\n <Flex\n direction=\"column\"\n gap={2}\n className={isMobile ? \"oui-w-full\" : \"oui-w-[200px]\"}\n >\n <Flex direction=\"column\" gap={3} p={4} r=\"2xl\">\n <Text className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em] oui-decoration-dotted oui-text-center oui-w-full\">\n {t(\"tradingPoints.currentPoints\")}\n </Text>\n <Text className=\"oui-text-transparent oui-bg-clip-text oui-gradient-brand oui-text-3xl oui-tracking-[0.03em] oui-text-center oui-w-full oui-h-10 oui-leading-10\">\n {currentPointsDisplay}\n </Text>\n </Flex>\n <Divider className=\"oui-w-full\" intensity={8} />\n <Flex direction=\"column\" gap={3} p={4} r=\"2xl\">\n <Text className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em] oui-text-center oui-w-full\">\n {t(\"tradingPoints.ranking\")}\n </Text>\n <Text className=\"oui-text-transparent oui-bg-clip-text oui-gradient-brand oui-text-3xl oui-tracking-[0.03em] oui-text-center oui-w-full oui-h-10 oui-leading-10\">\n {rankingDisplay}\n </Text>\n </Flex>\n </Flex>\n\n {!isMobile && (\n <Divider\n className=\"oui-self-stretch\"\n intensity={8}\n direction=\"vertical\"\n />\n )}\n {isMobile && <Divider intensity={8} />}\n\n <Flex\n direction=\"column\"\n className={isMobile ? \"oui-w-full\" : \"oui-flex-1\"}\n >\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n gap={6}\n className=\"oui-w-full oui-h-full\"\n >\n <Flex\n direction=\"column\"\n gap={3}\n itemAlign=\"center\"\n justify=\"center\"\n p={4}\n r=\"xl\"\n intensity={800}\n className={cn(\n \"oui-backdrop-blur-sm\",\n isMobile ? \"oui-w-full\" : \"oui-flex-1 oui-h-full\",\n )}\n >\n <Tooltip\n content={t(\"tradingPoints.tradePointsTooltip\")}\n className=\"oui-max-w-[300px] oui-bg-primary-darken\"\n >\n <Text\n className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em] oui-text-center oui-w-full\n \"\n style={{\n textDecorationLine: \"underline\",\n textDecorationStyle: \"dotted\",\n textUnderlineOffset: \"30%\",\n }}\n >\n {t(\"tradingPoints.tradePoints\")}\n </Text>\n </Tooltip>\n\n <Text className=\"oui-text-base-contrast oui-text-[28px] oui-tracking-[0.03em] oui-text-center oui-w-full oui-leading-9\">\n {tradingPointsDisplay}\n </Text>\n <Button size=\"md\" onClick={goToPerp}>\n <Text>{t(\"tradingPoints.tradeNow\")}</Text>\n </Button>\n </Flex>\n\n <Flex\n direction=\"column\"\n gap={3}\n itemAlign=\"center\"\n justify=\"center\"\n p={4}\n r=\"xl\"\n intensity={800}\n className={cn(\n \"oui-backdrop-blur-sm\",\n isMobile ? \"oui-w-full\" : \"oui-flex-1 oui-h-full\",\n )}\n >\n <Tooltip\n content={t(\"tradingPoints.pnlPointsTooltip\")}\n className=\"oui-max-w-[300px] oui-bg-primary-darken\"\n >\n <Text\n className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em] oui-text-center oui-w-full\"\n style={{\n textDecorationLine: \"underline\",\n textDecorationStyle: \"dotted\",\n textUnderlineOffset: \"30%\",\n }}\n >\n {t(\"tradingPoints.pnlPoints\")}\n </Text>\n </Tooltip>\n <Text className=\"oui-text-base-contrast oui-text-[28px] oui-tracking-[0.03em] oui-text-center oui-w-full oui-leading-9\">\n {pnlPointsDisplay}\n </Text>\n <Button size=\"md\" onClick={goToPerp}>\n <Text>{t(\"tradingPoints.tradeNow\")}</Text>\n </Button>\n </Flex>\n\n <Flex\n direction=\"column\"\n gap={3}\n itemAlign=\"center\"\n justify=\"center\"\n p={4}\n r=\"xl\"\n intensity={800}\n className={cn(\n \"oui-backdrop-blur-sm\",\n isMobile ? \"oui-w-full\" : \"oui-flex-1 oui-h-full\",\n )}\n >\n <Tooltip\n content={t(\"tradingPoints.referralPointsTooltip\", {\n l1: formatReferralBoost(userStatistics?.l1_referral_boost),\n l2: formatReferralBoost(userStatistics?.l2_referral_boost),\n })}\n className=\"oui-max-w-[300px] oui-bg-primary-darken\"\n >\n <Text\n className=\"oui-text-base-contrast-54 oui-text-sm oui-tracking-[0.03em] oui-text-center oui-w-full\"\n style={{\n textDecorationLine: \"underline\",\n textDecorationStyle: \"dotted\",\n textUnderlineOffset: \"30%\",\n }}\n >\n {t(\"tradingPoints.referralPoints\")}\n </Text>\n </Tooltip>\n <Text className=\"oui-text-base-contrast oui-text-[28px] oui-tracking-[0.03em] oui-text-center oui-w-full oui-leading-9\">\n {referralPointsDisplay}\n </Text>\n <Button variant=\"outlined\" size=\"md\" onClick={onCopy}>\n <Text className=\"oui-text-base-contrast-54\">\n {t(\"tradingPoints.copyLink\")}\n </Text>\n </Button>\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n </>\n );\n\n return (\n <Flex direction=\"column\" gap={6} className=\"oui-w-full\">\n <Flex\n direction={isMobile ? \"column\" : \"row\"}\n gap={isMobile ? 4 : 0}\n itemAlign={isMobile ? \"start\" : \"center\"}\n justify=\"between\"\n className=\"oui-w-full\"\n >\n <Text\n className={cn(\n \"oui-text-base-contrast\",\n isMobile ? \"oui-text-2xl\" : \"oui-text-3xl\",\n \"oui-tracking-[0.03em]\",\n )}\n >\n {t(\"tradingPoints.myPoints\")}\n </Text>\n <Flex gap={2} itemAlign=\"center\">\n {timeRangeOptions.map((option) => (\n <button\n key={option.value}\n onClick={() => setSelectedTimeRange(option.value)}\n data-state={\n selectedTimeRange === option.value ? \"active\" : \"inactive\"\n }\n className={timeRangeButtonClass}\n >\n {option.label}\n </button>\n ))}\n </Flex>\n </Flex>\n <Box p={6} r=\"2xl\" className=\"oui-border oui-border-line oui-w-full\">\n {/* <AuthGuard buttonProps={{ size: \"lg\", fullWidth: true }}>\n {userStats}\n </AuthGuard> */}\n {userStats}\n </Box>\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport { PointsProvider } from \"../../hooks/usePointsData\";\nimport Main from \"./main\";\n\nexport type RouteOption = {\n href: string;\n name: string;\n scope?: string;\n target?: string;\n};\n\nexport type PointSystemPageProps = {\n onRouteChange: (option: RouteOption) => void;\n};\n\nexport const PointSystemPage: FC<PointSystemPageProps> = (props) => {\n return (\n <PointsProvider>\n <Main onRouteChange={props.onRouteChange} />\n </PointsProvider>\n );\n};\n"]}
|