@kodiak-finance/orderly-trading-leaderboard 2.8.21-rc.2 → 2.8.21

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/hooks/useEndReached.ts","../src/components/ranking/shared/util.ts","../src/components/ranking/shared/column.tsx","../src/components/ranking/shared/ranking.ui.tsx","../src/components/ranking/generalRanking/generalRanking.script.ts","../src/components/ranking/generalRanking/generalRanking.widget.tsx","../src/components/ranking/generalRanking/index.ts","../src/deprecated/components/provider/index.tsx","../src/deprecated/pages/leaderboard/leaderboard.mobile.ui.tsx","../src/components/brokerStats/brokerStats.ui.tsx","../src/deprecated/components/campaigns/campaigns.widget.tsx","../src/deprecated/components/campaigns/campaigns.mobile.ui.tsx","../src/deprecated/components/campaigns/campaigns.script.ts","../src/deprecated/components/campaigns/campaigns.ui.tsx","../src/deprecated/components/tradingList/tradingList.mobile.ui.tsx","../src/deprecated/components/tradingList/column.tsx","../src/deprecated/components/tradingList/tradingList.script.ts","../src/deprecated/components/tradingList/tradingList.ui.tsx","../src/deprecated/components/tradingList/tradingList.widget.tsx","../src/deprecated/pages/leaderboard/leaderboard.script.ts","../src/deprecated/pages/leaderboard/leaderboard.ui.tsx","../src/deprecated/pages/leaderboard/leaderboard.widget.tsx","../src/components/provider/index.tsx","../src/components/campaigns/pricePool/utils.ts","../src/index.ts","../src/components/ranking/campaignRanking/campaignRanking.widget.tsx","../src/components/ranking/campaignRanking/campaignRanking.script.ts","../src/components/rewards/utils.ts","../src/components/leaderboard/generalLeaderboard/generalLeaderboard.script.ts","../src/type.ts","../src/components/leaderboard/generalLeaderboard/generalLeaderboard.ui.tsx","../src/components/leaderboard/shared/LeaderboardFilter.tsx","../src/components/leaderboard/shared/LeaderboardTabs.tsx","../src/components/leaderboard/generalLeaderboard/generalLeaderboard.widget.tsx","../src/components/leaderboard/campaignLeaderboard/campaignLeaderboard.script.ts","../src/components/leaderboard/campaignLeaderboard/campaignLeaderboard.ui.tsx","../src/components/leaderboard/campaignLeaderboard/campaignLeaderboard.widget.tsx","../src/pages/leaderboard/page.tsx","../src/components/background/index.tsx","../src/components/campaigns/campaigns.widget.tsx","../src/hooks/useCanTrade.ts","../src/components/campaigns/campaigns.content.desktop.ui.tsx","../src/components/campaigns/pricePool/normalPricePool.ui.tsx","../src/components/campaigns/utils.ts","../src/components/campaigns/type.ts","../src/components/campaigns/pricePool/pricePool.widget.tsx","../src/components/campaigns/pricePool/pricePool.desktop.ui.tsx","../src/components/campaigns/pricePool/pricePool.script.ts","../src/components/campaigns/campaigns.script.ts","../src/components/campaigns/components/time.desktop.ui.tsx","../src/components/campaigns/components/axis.tsx","../src/components/campaigns/components/countdown.tsx","../src/components/campaigns/header/campaigns.header.desktop.ui.tsx","../src/components/campaigns/DefaultCampaign.tsx","../src/components/campaigns/campaign.item.ui.tsx","../src/components/campaigns/header/campaigns.header.mobile.ui.tsx","../src/components/campaigns/header/campaigns.header.widget.tsx","../src/components/leaderboard128/generalLeaderboard/generalLeaderboard.script.ts","../src/components/leaderboard128/generalLeaderboard/generalLeaderboard.ui.tsx","../src/components/ranking128/shared/ranking.ui.tsx","../src/components/ranking128/shared/column.tsx","../src/components/ranking128/shared/util.ts","../src/components/ranking128/generalRanking/generalRanking.script.ts","../src/components/ranking128/generalRanking/generalRanking.widget.tsx","../src/components/leaderboard128/shared/LeaderboardFilter.tsx","../src/components/leaderboard128/shared/LeaderboardTabs.tsx","../src/components/leaderboard128/generalLeaderboard/generalLeaderboard.widget.tsx","../src/components/rewards/rewards.widget.tsx","../src/components/rewards/rewards.desktop.ui.tsx","../src/components/rule/rule.widget.tsx","../src/components/rule/rule.tsx","../src/components/rule/description.tsx","../src/components/rule/terms.tsx"],"names":["useEffect","isSameAddress","useMemo","useTranslation","Text","Box","cn","Flex","useScreen","Fragment","jsx","jsxs","useCallback","DataTable","Spinner","column","useRef","useState","useAccount","useConfig","useInfiniteQuery","useQuery","usePagination","sort","startDate","endDate","Button","Select","Header","CampaignItem","dateRange","DataFilter","createContext","useContext","parseISO","usePrivateQuery","TradingLeaderboardContext","TradingLeaderboardProvider","useTradingLeaderboardContext","progress","differenceInDays","LeaderboardTab","FilterDays","useFilter","CloseCircleFillIcon","Input","ScrollIndicator","SearchIcon","showVolume","showPnl","showPoints","GeneralRankingWidget","isVideoSrc","Tooltip","InfoCircleIcon","format","CampaignTagEnum","AuthGuard","ChevronRightIcon","AccountStatusEnum","toast","useCampaignsScript","currentTime","endTime","difference","useEmblaCarousel","ChevronLeftIcon","CampaignsWidget","useSearch","Divider","getCurrentAddressRowKey","useRankingColumns","FirstRankIcon","SecondRankIcon","ThirdRankIcon","Ranking","useGeneralRankingScript","useCampaignRankingList","formatData","item","LeaderboardFilter","TabPanel","Tabs","LeaderboardTabs","match"],"mappings":"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","sourcesContent":["import {\n format,\n subDays,\n addDays,\n isBefore,\n isAfter,\n isWithinInterval,\n parseISO,\n} from \"date-fns\";\nimport { DateRange } from \"./type\";\n\nexport const getDateRange = (offsetDay: number) => {\n return {\n from: subDays(new Date(), offsetDay - 1)!,\n to: new Date()!,\n };\n};\n\n/**\n * Parse timeRange prop which can accept string dates or 'now'\n * Supports:\n * - { from: '2025-01-01' } - from date, to defaults to today\n * - { from: '2025-01-01', to: '2025-11-15' } - both dates\n * - { from: '2025-01-01', to: 'now' } - to is current date\n *\n * @param timeRange Raw timeRange input with optional string dates and 'now' support\n * @returns Parsed DateRange with Date objects, or null if no dates are specified\n */\nexport const parseTimeRange = (\n timeRange:\n | {\n from?: string | Date;\n to?: string | Date | \"now\";\n }\n | null\n | undefined,\n): DateRange | null => {\n if (!timeRange) {\n return null;\n }\n\n const { from, to } = timeRange;\n\n // If neither from nor to is specified, return null to use defaults\n if (!from && !to) {\n return null;\n }\n\n // Must specify 'from' if you want to use custom timeRange\n if (!from) {\n console.warn(\n \"timeRange.from must be specified when using custom timeRange. Ignoring timeRange.\",\n );\n return null;\n }\n\n const fromDate = typeof from === \"string\" ? parseISO(from) : from;\n\n // Default to today if 'to' is not specified\n const toDate = to\n ? to === \"now\"\n ? new Date()\n : typeof to === \"string\"\n ? parseISO(to)\n : to\n : new Date(); // Default to today\n\n // Validate that from is not after to\n if (fromDate > toDate) {\n console.warn(\n `timeRange.from (${formatDateRange(fromDate)}) is after timeRange.to (${formatDateRange(toDate)}). Ignoring timeRange.`,\n );\n return null;\n }\n\n return {\n from: fromDate,\n to: toDate,\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 { 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","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 { ReactNode, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Text,\n Column,\n Box,\n cn,\n toast,\n Tooltip,\n InfoCircleIcon,\n Flex,\n useScreen,\n modal,\n useLongPress,\n} from \"@kodiak-finance/orderly-ui\";\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 =\n | \"rank\"\n | \"address\"\n | \"volume\"\n | \"pnl\"\n | \"rewards\"\n | \"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 let linearGradientText;\n\n if (!isYou) {\n if (record.rank === 1) {\n linearGradientText =\n \"linear-gradient(169deg, #FBE67B 2.09%, #FCFBE7 15.8%, #F7D14E 40.73%, #D4A041 58.8%)\";\n } else if (record.rank === 2) {\n linearGradientText =\n \"linear-gradient(201.05deg, #D9D9D9 38.79%, #F7F6F4 53.85%, #D9D9D9 71.71%, #7F7F7F 91.87%), rgba(255, 255, 255, 0.8)\";\n } else if (record.rank === 3) {\n linearGradientText =\n \"linear-gradient(149.05deg, #B6947E 15.63%, #F8DAC8 31.37%, #B6947E 44.29%, #F8DCCB 56.6%), rgba(255, 255, 255, 0.8)\";\n }\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 copyable\n onCopy={(e) => {\n e.preventDefault();\n e.stopPropagation();\n navigator.clipboard.writeText(value);\n toast.success(t(\"common.copy.copied\"));\n }}\n // style={\n // linearGradientText\n // ? {\n // background: linearGradientText,\n // WebkitBackgroundClip: \"text\",\n // WebkitTextFillColor: \"transparent\",\n // backgroundClip: \"text\",\n // }\n // : {}\n // }\n className=\"oui-cursor-pointer oui-underline oui-decoration-line-16 oui-decoration-dashed oui-underline-offset-4\"\n >\n {value}\n </Text.formatted>\n {isYou && <Text> (You)</Text>}\n </a>\n </>\n );\n },\n width: 90,\n },\n {\n title: <VolumeColumnTitle />,\n dataIndex: \"volume\",\n onSort: enableSort,\n align: isMobile ? \"right\" : \"left\",\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2}>\n {value}\n </Text.numeral>\n );\n },\n width: 105,\n },\n {\n title: <PnLColumnTitle type={type} />,\n dataIndex: \"pnl\",\n onSort: enableSort,\n align: isMobile ? \"right\" : \"left\",\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.pnl prefix=\"$\" rule=\"price\" dp={2} coloring>\n {value}\n </Text.pnl>\n );\n },\n width: 90,\n },\n {\n title: t(\"tradingLeaderboard.estimatedRewards\"),\n dataIndex: \"rewards\",\n align: isMobile ? \"right\" : \"left\",\n render: (value: { amount: number; currency: string }) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral\n suffix={` ${value?.currency || \"\"}`}\n rule=\"price\"\n dp={0}\n >\n {value?.amount}\n </Text.numeral>\n );\n },\n width: 90,\n },\n {\n title: <PointsColumnTitle />,\n dataIndex: \"points\",\n onSort: enableSort,\n align: isMobile ? \"right\" : \"left\",\n render: (value: number) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral rule=\"price\" dp={0}>\n {value}\n </Text.numeral>\n );\n },\n width: 90,\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\nconst PnLColumnTitle = ({ type }: { type?: \"general\" | \"campaign\" }) => {\n const { isMobile } = useScreen();\n const { t } = useTranslation();\n\n const tooltipContent =\n type === \"general\"\n ? t(\"tradingLeaderboard.realizedPnl.tooltip\")\n : t(\"tradingLeaderboard.pnl.tooltip\");\n\n const longPress = useLongPress(() => {\n modal.alert({\n title: t(\"common.tips\"),\n message: tooltipContent,\n });\n });\n\n const view = (\n <Flex gap={1}>\n <div>\n {type === \"general\" ? t(\"common.realizedPnl\") : t(\"common.pnl\")}\n </div>\n <InfoCircleIcon opacity={1} className=\"w-4 h-4 cursor-pointer\" />\n </Flex>\n );\n\n if (isMobile) {\n return <div {...longPress}>{view}</div>;\n }\n\n return <Tooltip content={tooltipContent}>{view}</Tooltip>;\n};\n\nconst VolumeColumnTitle = () => {\n const { isMobile } = useScreen();\n const { t } = useTranslation();\n\n const tooltipContent =\n \"Total trading volume generated during the campaign period. Updated every 30 seconds.\";\n\n const longPress = useLongPress(() => {\n modal.alert({\n title: t(\"common.tips\"),\n message: tooltipContent,\n });\n });\n\n const view = (\n <Flex gap={1}>\n <div>{t(\"tradingLeaderboard.tradingVolume\")}</div>\n <InfoCircleIcon opacity={1} className=\"w-4 h-4 cursor-pointer\" />\n </Flex>\n );\n\n if (isMobile) {\n return <div {...longPress}>{view}</div>;\n }\n\n return <Tooltip content={tooltipContent}>{view}</Tooltip>;\n};\n\nconst PointsColumnTitle = () => {\n const { isMobile } = useScreen();\n const { t } = useTranslation();\n\n const tooltipContent =\n \"Total points accumulated based on trading activity. Updated periodically.\";\n\n const longPress = useLongPress(() => {\n modal.alert({\n title: t(\"common.tips\"),\n message: tooltipContent,\n });\n });\n\n const view = (\n <Flex gap={1}>\n <div>{t(\"tradingLeaderboard.points\")}</div>\n <InfoCircleIcon opacity={1} className=\"w-4 h-4 cursor-pointer\" />\n </Flex>\n );\n\n if (isMobile) {\n return <div {...longPress}>{view}</div>;\n }\n\n return <Tooltip content={tooltipContent}>{view}</Tooltip>;\n};\n","import { FC, useCallback } from \"react\";\nimport {\n cn,\n DataTable,\n Flex,\n Spinner,\n TanstackColumn,\n useScreen,\n} from \"@kodiak-finance/orderly-ui\";\nimport { type CampaignRankingData } from \"../campaignRanking/campaignRanking.script\";\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 | CampaignRankingData;\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 typeof props.onSort === \"function\",\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 (\n column: TanstackColumn<RankingData>,\n record: RankingData,\n index: number,\n ) => {\n const isFirstColumn = column.getIsFirstColumn();\n const isLastColumn = column.getIsLastColumn();\n const isRank = [1, 2, 3].includes(record.rank as number);\n if (record.key === getCurrentAddressRowKey(props.address!)) {\n return {\n className: cn(\n \"after:oui-absolute after:oui-h-[40px] after:oui-w-full md:after:oui-h-[48px]\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \"after:oui-left-0 after:oui-top-[2px] after:oui-z-[-1]\",\n \"after:oui-border-y\",\n isFirstColumn && \"after:oui-rounded-l-lg after:oui-border-l\",\n isLastColumn && \"after:oui-rounded-r-lg after:oui-border-r\",\n ),\n };\n }\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 // style: isRank\n // ? {\n // position: \"unset\",\n // }\n // : undefined,\n };\n },\n [props.address],\n );\n\n if (isMobile) {\n return (\n <>\n <DataTable\n classNames={{\n root: \"oui-trading-leaderboard-ranking-table\",\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 initialSort={props.initialSort}\n onSort={props.onSort}\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 initialSort={props.initialSort}\n onSort={props.onSort}\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-h-[calc(100%_-_53px_-_8px)]\",\n ),\n scroll: \"oui-min-h-[600px] oui-max-h-[1250px]\",\n }}\n onRow={onRow}\n onCell={onCell}\n />\n );\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useAccount,\n useConfig,\n useInfiniteQuery,\n useQuery,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport {\n TableSort,\n usePagination,\n useScreen,\n} from \"@kodiak-finance/orderly-ui\";\nimport { useEndReached } from \"../../../hooks/useEndReached\";\nimport { DateRange } from \"../../../type\";\nimport { formatDateRange, getDateRange } from \"../../../utils\";\nimport { getCurrentAddressRowKey, isSameAddress } from \"../shared/util\";\n\n/**\n * Normalize API field names to UI field names\n * Maps perp_volume → volume, realized_pnl → pnl, and ensures points is passed through\n */\nconst normalizeRankingData = (items: GeneralRankingData[]) =>\n items.map((item) => ({\n ...item,\n volume: item.perp_volume,\n pnl: item.realized_pnl,\n points: item.points ?? 0,\n }));\n\nexport type GeneralRankingData = {\n account_id: string;\n address: string;\n broker_fee: number;\n date: string;\n perp_maker_volume: number;\n perp_taker_volume: number;\n perp_volume: number;\n realized_pnl: number;\n total_fee: number;\n\n key?: string;\n rank?: number | string;\n volume?: number;\n pnl?: number;\n points?: number;\n};\n\nexport type GeneralRankingResponse = {\n meta: API.RecordsMeta;\n rows: GeneralRankingData[];\n};\nexport type GeneralRankingScriptReturn = ReturnType<\n typeof useGeneralRankingScript\n>;\n\nexport type GeneralRankingScriptOptions = {\n dateRange?: DateRange | null;\n address?: string;\n sortKey?: \"perp_volume\" | \"realized_pnl\";\n leaderboardEndpoint?: string;\n};\n\nexport function useGeneralRankingScript(options?: GeneralRankingScriptOptions) {\n const {\n dateRange = getDateRange(90),\n address: searchValue,\n sortKey = \"perp_volume\",\n leaderboardEndpoint,\n } = options || {};\n\n const [initialSort] = useState<TableSort>({\n sortKey,\n sort: \"desc\",\n });\n\n const [sort, setSort] = useState<TableSort | undefined>(initialSort);\n\n const { state } = useAccount();\n const brokerId = useConfig(\"brokerId\");\n\n const { isMobile } = useScreen();\n\n const { page, pageSize, setPage, parsePagination } = usePagination({\n pageSize: 100,\n });\n\n const { campaignRankingList, filteredCampaignData } = useCampaignRankingList({\n dateRange,\n sort,\n searchValue,\n });\n\n const getUrl = (args: {\n page: number;\n pageSize: number;\n address?: string;\n sort?: string | null;\n }) => {\n const searchParams = new URLSearchParams();\n\n searchParams.set(\"page\", args.page.toString());\n searchParams.set(\n \"size\",\n // if page is 1, we need to set page size to 100 to get the top 100 data to judge user rank\n args.page === 1 ? \"100\" : args.pageSize.toString(),\n );\n\n // Only add aggregateBy and broker_id for default Orderly endpoint\n const isDefaultEndpoint = !leaderboardEndpoint;\n if (isDefaultEndpoint) {\n searchParams.set(\"aggregateBy\", \"address_per_builder\");\n if (brokerId) {\n searchParams.set(\"broker_id\", brokerId);\n }\n }\n\n if (args.sort) {\n searchParams.set(\"sort\", args.sort);\n } else if (args.sort !== null && sort) {\n const prefix = sort.sort === \"asc\" ? \"ascending\" : \"descending\";\n searchParams.set(\"sort\", `${prefix}_${sort.sortKey}`);\n }\n\n if (dateRange?.from) {\n searchParams.set(\"start_date\", formatDateRange(dateRange.from!));\n }\n\n if (dateRange?.to) {\n searchParams.set(\"end_date\", formatDateRange(dateRange.to!));\n }\n\n if (args.address) {\n searchParams.set(\"address\", args.address);\n }\n\n // Use custom leaderboard endpoint if provided, otherwise use default Orderly endpoint\n const baseUrl = leaderboardEndpoint || `/v1/broker/leaderboard/daily`;\n return `${baseUrl}?${searchParams.toString()}`;\n };\n\n const { data, isLoading } = useQuery<GeneralRankingResponse>(\n getUrl({ page, pageSize, address: searchValue }),\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\n if (!isMobile) {\n return null;\n }\n\n return getUrl({\n page: pageIndex + 1,\n pageSize,\n address: searchValue,\n });\n },\n {\n initialSize: 1,\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const { data: top100Data } = useQuery<GeneralRankingResponse>(\n getUrl({\n page: 1,\n pageSize: 100,\n sort: `descending_${sort?.sortKey || \"perp_volume\"}`,\n }),\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const { data: userDataRes = [] } = useQuery<GeneralRankingData[]>(\n state.address\n ? getUrl({ page: 1, pageSize: 1, address: state.address, sort: null })\n : null,\n {\n revalidateOnFocus: false,\n },\n );\n\n const getAddressRank = useCallback(\n (address: string) => {\n const index = top100Data?.rows.findIndex((item) =>\n isSameAddress(item.address, address!),\n );\n return index !== -1 ? index! + 1 : \"100+\";\n },\n [top100Data],\n );\n\n const userDataList = useMemo(() => {\n if (!state.address || isLoading) {\n return [];\n }\n\n if (!userDataRes.length) {\n return [\n {\n key: getCurrentAddressRowKey(state.address!),\n address: state.address,\n rank: \"-\",\n } as unknown as GeneralRankingData,\n ];\n }\n\n const withRank = userDataRes?.map((item) => ({\n ...item,\n rank: getAddressRank(item.address!),\n key: getCurrentAddressRowKey(item.address!),\n }));\n\n return normalizeRankingData(withRank);\n }, [state.address, userDataRes, isLoading, getAddressRank]);\n\n const addRankForList = useCallback(\n (list: GeneralRankingData[], total: number) => {\n return list?.map((item, index) => {\n let rank: string | number = index + 1;\n\n if (searchValue) {\n rank = getAddressRank(item.address);\n } else {\n if (sort?.sort === \"asc\") {\n rank = total - (page - 1) * pageSize - index;\n } else if (sort?.sort === \"desc\") {\n rank = (page - 1) * pageSize + index + 1;\n }\n }\n\n return {\n ...item,\n rank,\n };\n });\n },\n [page, pageSize, sort, searchValue, getAddressRank],\n );\n\n const dataSource = useMemo(() => {\n let list = data?.rows || [];\n // hardcode for 128 campaign\n if (campaignRankingList && campaignRankingList.length >= 0) {\n if (filteredCampaignData) {\n list = filteredCampaignData as GeneralRankingData[];\n } else {\n list = list.filter((item) =>\n campaignRankingList.includes(item.address),\n );\n }\n }\n\n if (page === 1) {\n list = list.slice(0, pageSize);\n }\n let total = data?.meta.total || 0;\n if (campaignRankingList) {\n total = list.length;\n }\n const rankList = addRankForList(list, total);\n const normalized = normalizeRankingData(rankList);\n\n if (page === 1 && !searchValue) {\n return [...userDataList, ...normalized];\n }\n return normalized;\n }, [\n data,\n page,\n pageSize,\n userDataList,\n searchValue,\n addRankForList,\n campaignRankingList,\n filteredCampaignData,\n ]);\n\n const dataList = useMemo(() => {\n if (!infiniteData?.length) {\n return [];\n }\n\n let total = infiniteData[0]?.meta.total || 0;\n let flatList = infiniteData?.map((item) => item.rows)?.flat();\n if (campaignRankingList && campaignRankingList.length > 0) {\n if (filteredCampaignData) {\n flatList = filteredCampaignData as GeneralRankingData[];\n total = filteredCampaignData.length;\n } else {\n flatList = flatList.filter((item) =>\n campaignRankingList.includes(item.address),\n );\n total = flatList.length;\n }\n }\n const rankList = addRankForList(flatList, total);\n const normalized = normalizeRankingData(rankList);\n\n if (!searchValue) {\n return [...userDataList, ...normalized];\n }\n return normalized;\n }, [\n infiniteData,\n userDataList,\n searchValue,\n addRankForList,\n campaignRankingList,\n filteredCampaignData,\n ]);\n\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n const pagination = useMemo(\n () =>\n parsePagination({\n total: campaignRankingList\n ? dataSource?.length\n : data?.meta?.total || 0,\n current_page: data?.meta?.current_page || 1,\n records_per_page: pageSize,\n }),\n [\n data?.meta?.total,\n data?.meta?.current_page,\n pageSize,\n campaignRankingList,\n dataSource,\n ],\n );\n\n useEndReached(sentinelRef, () => {\n if (!isValidating && isMobile) {\n setSize(size + 1);\n }\n });\n\n const onSort = useCallback(\n (sort?: TableSort) => {\n if (sort) {\n // Fallback points sort to volume if using default Orderly endpoint (doesn't support points)\n if (sort.sortKey === \"points\" && !leaderboardEndpoint) {\n sort.sortKey = \"perp_volume\";\n } else if (sort.sortKey === \"volume\") {\n // Map column field names to query field names\n sort.sortKey = \"perp_volume\";\n } else if (sort.sortKey === \"pnl\") {\n sort.sortKey = \"realized_pnl\";\n }\n }\n\n // fix for mobile sort\n setSort((_sort) => {\n if (sort) return sort;\n return isMobile\n ? { sortKey: _sort?.sortKey || \"\", sort: \"desc\" }\n : initialSort;\n });\n },\n [initialSort, isMobile, leaderboardEndpoint],\n );\n\n useEffect(() => {\n if (searchValue) {\n setPage(1);\n }\n }, [searchValue]);\n\n useEffect(() => {\n setPage(1);\n }, [state.address]);\n\n useEffect(() => {\n if (dateRange?.to && dateRange?.from) {\n setPage(1);\n }\n }, [dateRange]);\n\n useEffect(() => {\n setSort({ sortKey, sort: \"desc\" });\n }, [sortKey]);\n\n return {\n pagination,\n initialSort,\n onSort,\n dataSource,\n isLoading: isLoading || isValidating,\n isMobile,\n sentinelRef,\n dataList,\n address: state.address,\n };\n}\n\n// for 128 campaign hardcode\nconst useCampaignRankingList = ({\n dateRange,\n sort,\n searchValue,\n}: {\n dateRange: DateRange | null;\n sort?: TableSort;\n searchValue?: string;\n}) => {\n const getUrl = (label?: string) => {\n if (!label) {\n return null;\n }\n const campaignId = label === \"Week 1\" ? \"129\" : \"128\";\n\n const searchParams = new URLSearchParams();\n searchParams.set(\"campaign_id\", campaignId);\n searchParams.set(\"page\", \"1\");\n searchParams.set(\"size\", \"2000\");\n searchParams.set(\"aggregate_by\", \"address\");\n\n return `https://api.orderly.org/v1/public/campaign/ranking?${searchParams.toString()}`;\n };\n\n const { data: campaignData } = useQuery<GeneralRankingResponse[\"rows\"]>(\n getUrl(\"Week 2\"),\n {\n revalidateOnFocus: false,\n },\n );\n\n const { data } = useQuery<GeneralRankingResponse[\"rows\"]>(\n getUrl(dateRange?.label),\n {\n revalidateOnFocus: false,\n },\n );\n\n const campaignRankingList = useMemo(() => {\n if (!dateRange?.label) {\n return undefined;\n }\n return campaignData?.map((item) => item.address) || [];\n }, [campaignData, dateRange]);\n\n const filteredCampaignData = useMemo(() => {\n if (campaignRankingList && dateRange?.label === \"Week 1\") {\n const list =\n data?.filter(\n (item) =>\n campaignRankingList.includes(item.address) &&\n (searchValue ? isSameAddress(item.address, searchValue) : true),\n ) || [];\n const newList = list.map((item) => ({\n address: item.address,\n perp_volume: item.volume,\n realized_pnl: item.pnl,\n }));\n\n if (sort) {\n newList.sort((a: any, b: any) => {\n if (sort?.sort === \"asc\") {\n return a?.[sort?.sortKey] - b?.[sort?.sortKey];\n } else if (sort?.sort === \"desc\") {\n return b?.[sort?.sortKey] - a?.[sort?.sortKey];\n }\n return 0;\n });\n }\n return newList;\n }\n return undefined;\n }, [data, campaignRankingList, sort, dateRange, searchValue]);\n\n return { campaignRankingList, filteredCampaignData };\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 { dateRange, address, fields, sortKey, leaderboardEndpoint, ...rest } =\n props;\n const state = useGeneralRankingScript({\n dateRange,\n address,\n sortKey,\n leaderboardEndpoint,\n });\n\n return <Ranking {...state} {...rest} fields={fields} type=\"general\" />;\n};\n","export {\n GeneralRankingWidget,\n type GeneralRankingWidgetProps,\n} from \"./generalRanking.widget\";\nexport { useGeneralRankingScript } from \"./generalRanking.script\";\n","import React, { createContext, useContext, useMemo } from \"react\";\n\nexport type Campaign = {\n title: string;\n description: string;\n image: string;\n startTime: Date | string;\n endTime: Date | string;\n href:\n | string\n | {\n /** learn more url */\n learnMore: string;\n /** trading url, if provided, will override default trading now button url */\n trading: string;\n };\n};\n\n/**\n * Trading leaderboard provider state\n */\nexport type TradingLeaderboardState = {\n /** campaigns config, if not provided, will not show campaigns section */\n campaigns?: Campaign[];\n /** background src, it can be a image resource or video resource */\n backgroundSrc?: string;\n href?: {\n /** default trading now button url */\n trading: string;\n };\n};\n\n/**\n * Trading leaderboard context\n */\nexport const TradingLeaderboardContext = createContext<TradingLeaderboardState>(\n {},\n);\n\nexport type TradingLeaderboardProviderProps =\n React.PropsWithChildren<TradingLeaderboardState>;\n\nexport const TradingLeaderboardProvider: React.FC<\n Readonly<TradingLeaderboardProviderProps>\n> = (props) => {\n const { href, campaigns, backgroundSrc, children } = props;\n const memoizedValue = useMemo<TradingLeaderboardState>(() => {\n return {\n href: href,\n campaigns: campaigns,\n backgroundSrc: backgroundSrc,\n };\n }, [href, campaigns, backgroundSrc]);\n return (\n <TradingLeaderboardContext.Provider value={memoizedValue}>\n {children}\n </TradingLeaderboardContext.Provider>\n );\n};\n\nexport const useTradingLeaderboardContext = () => {\n return useContext(TradingLeaderboardContext);\n};\n","import { FC } from \"react\";\nimport { cn, Flex } from \"@kodiak-finance/orderly-ui\";\nimport { BrokerStatsWidget } from \"../../../components/brokerStats/brokerStats.ui\";\nimport { CampaignsWidget } from \"../../components/campaigns\";\nimport { TradingListWidget } from \"../../components/tradingList\";\nimport { LeaderboardScriptReturn } from \"./leaderboard.script\";\n\nexport type LeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n} & LeaderboardScriptReturn;\n\nexport const MobileLeaderboardWidget: FC<LeaderboardProps> = (props) => {\n // const renderBackground = () => {\n // const linearGradient =\n // \"linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)\";\n\n // if (props.isVideo) {\n // return (\n // <div\n // className={cn(\"oui-absolute oui-left-0 oui-top-0\", \"oui-size-full\")}\n // >\n // <div\n // style={{\n // backgroundImage: linearGradient,\n // backgroundSize: \"cover\",\n // backgroundRepeat: \"no-repeat\",\n // }}\n // className={cn(\"oui-absolute oui-left-0 oui-top-0\", \"oui-size-full\")}\n // />\n // <video\n // playsInline\n // // eslint-disable-next-line react/no-unknown-property\n // webkit-playsinline // need to use this prop to ban full screen in iphone\n // autoPlay\n // loop\n // muted\n // className={cn(\n // // rest style\n // \"oui-pointer-events-none oui-border-none oui-bg-transparent oui-outline-none\",\n // \"oui-size-full\",\n // // \"oui-absolute oui-top-0 oui-left-0\",\n // \"oui-object-cover\",\n // \"oui-opacity-50\",\n // )}\n // // ref={(video) => {\n // // if (video) {\n // // video.setAttribute(\"playsinline\", \"true\");\n // // video.setAttribute(\"webkit-playsinline\", \"true\");\n // // }\n // // }}\n // >\n // <source src={props.backgroundSrc} type=\"video/mp4\" />\n // <source src={props.backgroundSrc} type=\"video/webm\" />\n // <source src={props.backgroundSrc} type=\"video/ogg\" />\n // <source src={props.backgroundSrc} type=\"video/avi\" />\n // Your browser does not support the video tag.\n // </video>\n // </div>\n // );\n // }\n\n // if (props.backgroundSrc) {\n // return (\n // <div\n // style={{\n // backgroundImage: `${linearGradient}, url(${props.backgroundSrc}) `,\n // backgroundSize: \"cover\",\n // backgroundRepeat: \"no-repeat\",\n // }}\n // className={cn(\n // \"oui-absolute oui-left-0 oui-top-0\",\n // \"oui-size-full\",\n // \"oui-opacity-50\",\n // )}\n // />\n // );\n // }\n // };\n return (\n <div\n style={{\n paddingBottom: \"calc(64px + env(safe-area-inset-bottom))\",\n }}\n className={cn(\n \"oui-relative oui-grid oui-h-[calc(100vh-44px)] oui-gap-1 oui-bg-base-10\",\n \"oui-mix-blend-screen\",\n props.className,\n )}\n >\n {/* {renderBackground()} */}\n <Flex\n direction=\"column\"\n gapY={3}\n height=\"100%\"\n px={3}\n pt={3}\n pb={3}\n className={cn(\n \"oui-trading-leaderboard-mobile oui-custom-scrollbar oui-overflow-y-auto\",\n \"oui-relative oui-h-[calc(100vh_-_64px)]\",\n )}\n >\n {props.showCampaigns && <CampaignsWidget />}\n <BrokerStatsWidget />\n <TradingListWidget />\n </Flex>\n </div>\n );\n};\n","import { useMemo } from \"react\";\nimport {\n TrendingUp,\n TrendingDown,\n DollarSign,\n Wallet,\n BarChart3,\n} from \"lucide-react\";\nimport { useSWR } from \"@kodiak-finance/orderly-hooks\";\nimport { useScreen, Spinner } from \"@kodiak-finance/orderly-ui\";\nimport { DateRange } from \"../../type\";\n\ninterface BrokerStatsRaw {\n volume: number;\n fees: number;\n revenue: number;\n pnl: number;\n}\n\ninterface KodiakStatsProps {\n dateRange?: DateRange;\n}\n\ninterface StatCard {\n key: string;\n label: string;\n value: number;\n icon: \"volume\" | \"fees\" | \"revenue\" | \"pnl\";\n}\n\nconst API_BASE = \"https://backend.kodiak.finance/orderly/stats\";\n\n/**\n * Format date to YYYY-MM-DD in local timezone (not UTC)\n * Prevents timezone offset issues when converting to ISO string\n */\nconst formatDateLocal = (date: Date): string => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n};\n\nconst getApiUrl = (dateRange?: DateRange): string => {\n if (!dateRange?.from || !dateRange?.to) {\n // Fallback: if no date range provided, use today\n const today = new Date();\n const startDate = formatDateLocal(today);\n const endDate = formatDateLocal(today);\n return `${API_BASE}?start_date=${startDate}&end_date=${endDate}`;\n }\n\n // Use the actual date range from the leaderboard picker\n const startDate = formatDateLocal(dateRange.from);\n const endDate = formatDateLocal(dateRange.to);\n\n return `${API_BASE}?start_date=${startDate}&end_date=${endDate}`;\n};\n\nconst customFetcher = async (url: string) => {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch: ${response.statusText}`);\n }\n return response.json();\n};\n\nconst formatCurrency = (num: number, showSign: boolean = false): string => {\n if (isNaN(num)) return \"$0\";\n\n const isNegative = num < 0;\n const absNum = Math.abs(num);\n let formatted = \"\";\n\n if (absNum >= 1_000_000) {\n formatted = `$${(absNum / 1_000_000).toFixed(2)}M`;\n } else if (absNum >= 1_000) {\n formatted = `$${(absNum / 1_000).toFixed(2)}K`;\n } else {\n formatted = `$${absNum.toFixed(2)}`;\n }\n\n if (showSign) {\n return isNegative ? `-${formatted}` : `+${formatted}`;\n }\n\n return formatted;\n};\n\nexport const BrokerStatsWidget = ({ dateRange }: KodiakStatsProps) => {\n const { isMobile } = useScreen();\n\n const url = useMemo(\n () => getApiUrl(dateRange),\n [dateRange?.from, dateRange?.to],\n );\n\n const {\n data: apiData,\n isLoading: loading,\n error,\n } = useSWR<any>(url, customFetcher, {\n revalidateOnFocus: false,\n });\n\n const stats = useMemo((): BrokerStatsRaw | null => {\n if (!apiData) return null;\n\n // Handle array response from new endpoint\n const dataArray = Array.isArray(apiData.data) ? apiData.data : [];\n if (dataArray.length === 0) return null;\n\n const firstEntry = dataArray[0];\n return {\n volume: firstEntry.perp_volume || 0,\n fees: firstEntry.total_fee || 0,\n revenue: firstEntry.broker_fee || 0,\n pnl: firstEntry.realized_pnl || 0,\n };\n }, [apiData]);\n\n const allStats = useMemo((): StatCard[] => {\n return [\n {\n key: \"volume\",\n label: \"Volume\",\n value: stats?.volume || 0,\n icon: \"volume\",\n },\n { key: \"fees\", label: \"Fees\", value: stats?.fees || 0, icon: \"fees\" },\n {\n key: \"revenue\",\n label: \"Revenue\",\n value: stats?.revenue || 0,\n icon: \"revenue\",\n },\n { key: \"pnl\", label: \"PnL\", value: stats?.pnl || 0, icon: \"pnl\" },\n ];\n }, [stats]);\n\n const statsToDisplay = isMobile\n ? allStats.filter((s) => s.key === \"volume\" || s.key === \"pnl\")\n : allStats;\n\n if (error) {\n return (\n <div className=\"w-full oui-mx-auto oui-mb-6 oui-max-w-[992px]\">\n <div className=\"oui-text-center oui-text-sm oui-text-red-500\">\n Failed to load statistics\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"w-full oui-mx-auto oui-mb-6 oui-max-w-[992px] oui-gap-6\">\n <h3 className=\"oui-mb-2 oui-text-base oui-font-semibold oui-text-base-contrast\">\n Kodiak Perps Stats\n </h3>\n <div\n className={`mb-6 oui-grid oui-gap-3 md:oui-gap-4 ${\n isMobile ? \"oui-grid-cols-2\" : \"oui-grid-cols-2 md:oui-grid-cols-4\"\n }`}\n >\n {statsToDisplay.map((stat) => (\n <StatCardComponent\n key={stat.key}\n stat={stat}\n dateRange={dateRange}\n loading={loading}\n />\n ))}\n </div>\n </div>\n );\n};\n\nconst STAT_ICON_MAP: Record<string, React.ReactNode> = {\n volume: <BarChart3 className=\"oui-size-5\" />,\n fees: <DollarSign className=\"oui-size-5\" />,\n revenue: <Wallet className=\"oui-size-5\" />,\n};\n\nconst getPnLIcon = (isPositive: boolean) =>\n isPositive ? (\n <TrendingUp className=\"oui-size-5\" />\n ) : (\n <TrendingDown className=\"oui-size-5\" />\n );\n\nconst getDateRangeLabel = (dateRange?: DateRange): string => {\n if (!dateRange?.from || !dateRange?.to) {\n return \"Today\";\n }\n\n const fromDate = new Date(dateRange.from);\n const toDate = new Date(dateRange.to);\n\n // Reset time to compare dates only\n fromDate.setHours(0, 0, 0, 0);\n toDate.setHours(0, 0, 0, 0);\n\n // Check if it's the same day\n if (fromDate.getTime() === toDate.getTime()) {\n return \"Today\";\n }\n\n // Calculate days difference (inclusive - add 1 to include both start and end dates)\n const diffTime = toDate.getTime() - fromDate.getTime();\n const diffDays = Math.round(diffTime / (1000 * 60 * 60 * 24)) + 1;\n\n // Return the actual number of days or common periods\n if (diffDays === 1) return \"1D\";\n if (diffDays === 2) return \"1D\";\n if (diffDays === 7) return \"7D\";\n if (diffDays === 30) return \"30D\";\n if (diffDays === 90) return \"90D\";\n return `${diffDays}D`;\n};\n\nconst StatCardComponent = ({\n stat,\n dateRange,\n loading,\n}: {\n stat: StatCard;\n dateRange?: DateRange;\n loading?: boolean;\n}) => {\n const isPnL = stat.key === \"pnl\";\n const isPositive = stat.value >= 0;\n\n const getIconStyles = () => {\n const baseStyles = {\n backgroundColor: \"#1a1a1a\",\n color: \"#ffffff\",\n };\n\n if (isPnL) {\n return {\n ...baseStyles,\n backgroundColor: isPositive\n ? \"rgba(34, 197, 94, 0.2)\"\n : \"rgba(239, 68, 68, 0.2)\",\n color: isPositive ? \"#22c55e\" : \"#ef4444\",\n };\n }\n\n switch (stat.icon) {\n case \"volume\":\n return {\n ...baseStyles,\n backgroundColor: \"rgba(59, 130, 246, 0.2)\",\n color: \"#3b82f6\",\n };\n case \"fees\":\n return {\n ...baseStyles,\n backgroundColor: \"rgba(168, 85, 247, 0.2)\",\n color: \"#a855f7\",\n };\n case \"revenue\":\n return {\n ...baseStyles,\n backgroundColor: \"rgba(34, 197, 94, 0.2)\",\n color: \"#22c55e\",\n };\n default:\n return baseStyles;\n }\n };\n\n const iconStyles = getIconStyles();\n\n const valueColor = isPnL ? (isPositive ? \"#22c55e\" : \"#ef4444\") : \"inherit\";\n\n return (\n <div className=\"oui-rounded-lg oui-border oui-border-base-4 oui-bg-base-8 oui-p-4 oui-transition-all\">\n <div className=\"oui-mb-3 oui-flex oui-items-start oui-gap-3\">\n <div\n className=\"oui-flex oui-shrink-0 oui-items-center oui-justify-center oui-rounded-md oui-p-2\"\n style={iconStyles}\n >\n {isPnL ? getPnLIcon(isPositive) : STAT_ICON_MAP[stat.icon]}\n </div>\n <div className=\"oui-flex oui-flex-col\">\n <span className=\"oui-text-sm oui-font-medium oui-text-base-contrast\">\n {stat.label}\n </span>\n <span className=\"oui-text-base-contrast-60 oui-text-xs\">\n ({getDateRangeLabel(dateRange)})\n </span>\n </div>\n </div>\n\n <div\n className=\"oui-text-xl oui-font-bold\"\n style={{ color: valueColor, minHeight: \"32px\" }}\n >\n {loading ? (\n <Spinner size=\"sm\" color=\"primary\" />\n ) : (\n formatCurrency(stat.value, isPnL)\n )}\n </div>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { MobileCampaigns } from \"./campaigns.mobile.ui\";\nimport { useCampaignsScript } from \"./campaigns.script\";\nimport { Campaigns } from \"./campaigns.ui\";\n\nexport type CampaignsWidgetProps = {\n className?: string;\n style?: React.CSSProperties;\n};\n\nexport const CampaignsWidget: FC<CampaignsWidgetProps> = (props) => {\n const state = useCampaignsScript();\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return (\n <MobileCampaigns\n {...state}\n className={props.className}\n style={props.style}\n />\n );\n }\n return (\n <Campaigns {...state} className={props.className} style={props.style} />\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Box, Text, Flex, Button, Select } from \"@kodiak-finance/orderly-ui\";\nimport { CampaignsScriptReturn, CurrentCampaigns } from \"./campaigns.script\";\n\nexport type CampaignsProps = {\n className?: string;\n style?: React.CSSProperties;\n} & CampaignsScriptReturn;\n\nconst scrollIndicatorWidth = 25;\nconst scrollIndicatorHeight = 6;\n\nexport const MobileCampaigns: FC<CampaignsProps> = (props) => {\n if (props.currentCampaigns.length === 0) {\n return null;\n }\n\n return (\n <Box\n width=\"100%\"\n intensity={900}\n p={3}\n className={cn(\n \"oui-mobile-trading-leaderboard-campaigns oui-rounded-[20px]\",\n props.className,\n )}\n style={props.style}\n >\n <Header {...props} />\n <Box\n r=\"xl\"\n mt={3}\n ref={props.enableScroll ? props.emblaRef : undefined}\n className={cn(\n \"oui-w-full oui-min-w-0 oui-overflow-hidden\",\n \"oui-select-none oui-cursor-pointer\",\n )}\n >\n <Flex>\n {props.currentCampaigns.map((campaign) => {\n return <CampaignItem key={campaign.title} campaign={campaign} />;\n })}\n </Flex>\n </Box>\n {props.enableScroll && (\n <ScrollIndicator\n style={{\n width: scrollIndicatorWidth * props.currentCampaigns.length,\n }}\n list={props.currentCampaigns}\n scrollIndex={props.scrollIndex}\n scrollTo={props.emblaApi?.scrollTo}\n />\n )}\n </Box>\n );\n};\n\nconst Header: FC<CampaignsScriptReturn> = (props) => {\n const { t } = useTranslation();\n\n return (\n <Flex justify=\"between\" itemAlign=\"center\">\n <Text size=\"base\" intensity={80}>\n {t(\"tradingLeaderboard.campaigns\")}\n </Text>\n <Select.options\n size={\"xs\"}\n value={props.category}\n onValueChange={props.onCategoryChange}\n options={props.options}\n classNames={{\n // set the width of the trigger to the width of the content\n trigger: \"oui-w-[--radix-select-content-available-width]\",\n }}\n />\n </Flex>\n );\n};\n\nconst CampaignItem: FC<{ campaign: CurrentCampaigns }> = ({ campaign }) => {\n const { title, description, image, displayTime, learnMoreUrl, tradingUrl } =\n campaign;\n const { t } = useTranslation();\n\n return (\n <Box intensity={800} r=\"xl\" className=\"oui-flex-[0_0_100%]\">\n <img\n className=\"oui-w-full oui-h-[calc((100vw-48px)/2)] oui-rounded-t-xl oui-object-fill\"\n src={image}\n alt={title}\n />\n\n <Flex\n itemAlign=\"start\"\n justify=\"between\"\n direction=\"column\"\n height=\"100%\"\n p={4}\n gapY={3}\n className=\"oui-font-semibold\"\n >\n <Flex direction=\"column\" itemAlign=\"start\" gapY={1}>\n <Text size=\"sm\">{title}</Text>\n <Text size=\"2xs\" intensity={54}>\n {displayTime}\n </Text>\n <Text size=\"2xs\" intensity={36}>\n {description}\n </Text>\n </Flex>\n <Flex justify=\"between\" width=\"100%\" gapX={3}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n fullWidth\n size=\"md\"\n onClick={() => {\n window.open(learnMoreUrl, \"_blank\");\n }}\n >\n {t(\"tradingLeaderboard.learnMore\")}\n </Button>\n <Button\n size=\"md\"\n fullWidth\n onClick={() => {\n window.open(tradingUrl, \"_self\");\n }}\n >\n {t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n </Flex>\n </Flex>\n </Box>\n );\n};\n\ninterface ScrollIndicatorProps {\n style?: React.CSSProperties;\n list: CurrentCampaigns[];\n scrollIndex: number;\n scrollTo?: (index: number) => void;\n}\n\nconst ScrollIndicator: React.FC<ScrollIndicatorProps> = (props) => {\n const { style, scrollIndex, list } = props;\n\n return (\n <Flex\n mt={3}\n r=\"full\"\n height={scrollIndicatorHeight}\n className={cn(\"oui-bg-line oui-mx-auto oui-relative\")}\n style={props.style}\n >\n {list.map((item, index) => {\n return (\n <Box\n key={index}\n width={scrollIndicatorWidth}\n height={scrollIndicatorHeight}\n onClick={() => {\n props.scrollTo?.(index);\n }}\n r=\"full\"\n className=\"oui-cursor-pointer\"\n />\n );\n })}\n <Box\n width={scrollIndicatorWidth}\n height={scrollIndicatorHeight}\n r=\"full\"\n className={cn(\n \"oui-absolute oui-left-0 oui-top-0\",\n \"oui-transition-all oui-duration-300\",\n \"oui-bg-primary\",\n )}\n style={{\n transform: `translateX(${scrollIndex * scrollIndicatorWidth}px)`,\n }}\n />\n </Flex>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useTrack } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { TrackerEventName } from \"@kodiak-finance/orderly-types\";\nimport { useEmblaCarousel } from \"@kodiak-finance/orderly-ui\";\nimport { formatCampaignDate } from \"../../../utils\";\nimport { useTradingLeaderboardContext, Campaign } from \"../provider\";\n\nexport type CampaignsScriptReturn = ReturnType<typeof useCampaignsScript>;\n\n// Define the type for our categorized campaigns\ntype CategorizedCampaigns = {\n ongoing: Campaign[];\n past: Campaign[];\n future: Campaign[];\n};\n\nexport type CurrentCampaigns = Campaign & {\n displayTime: string;\n learnMoreUrl: string;\n tradingUrl: string;\n};\n\nexport type TEmblaApi = {\n scrollTo?: (index: number) => void;\n};\n\ntype CategoryKey = keyof CategorizedCampaigns;\n\nexport function useCampaignsScript() {\n const { t } = useTranslation();\n const { campaigns = [], href } = useTradingLeaderboardContext();\n const [category, setCategory] = useState<CategoryKey>(\"ongoing\");\n\n const { track, tracking } = useTrack();\n\n const filterCampaigns = useMemo(() => {\n const now = new Date();\n\n return campaigns.reduce<CategorizedCampaigns>(\n (acc, campaign) => {\n const startTime = new Date(campaign.startTime);\n const endTime = new Date(campaign.endTime);\n\n if (now >= startTime && now <= endTime) {\n acc.ongoing.push(campaign);\n } else if (now > endTime) {\n acc.past.push(campaign);\n } else {\n acc.future.push(campaign);\n }\n\n return acc;\n },\n { ongoing: [], past: [], future: [] },\n );\n }, [campaigns]);\n\n const options = useMemo(() => {\n const opts: { label: string; value: CategoryKey }[] = [\n { label: t(\"tradingLeaderboard.ongoing\"), value: \"ongoing\" },\n { label: t(\"tradingLeaderboard.future\"), value: \"future\" },\n { label: t(\"tradingLeaderboard.past\"), value: \"past\" },\n ];\n\n // Filter out categories with no campaigns and map to the required format\n return opts.filter((item) => filterCampaigns[item.value].length > 0);\n }, [filterCampaigns, t]);\n\n const currentCampaigns = useMemo(() => {\n const list = filterCampaigns[category];\n return list.map((campaign) => {\n const { startTime, endTime } = campaign;\n\n let learnMoreUrl: string;\n let tradingUrl = href?.trading!;\n\n if (typeof campaign.href === \"object\") {\n learnMoreUrl = campaign.href.learnMore;\n tradingUrl = campaign.href.trading;\n } else {\n learnMoreUrl = campaign.href;\n }\n\n return {\n ...campaign,\n displayTime: `${formatCampaignDate(startTime)} - ${formatCampaignDate(\n endTime,\n )} UTC`,\n learnMoreUrl,\n tradingUrl,\n };\n });\n }, [filterCampaigns, category, href]);\n\n useEffect(() => {\n // Find the first non-empty category\n const categoryKeys: CategoryKey[] = [\"ongoing\", \"future\", \"past\"];\n\n const firstAvailableCategory = categoryKeys.find(\n (item) => filterCampaigns[item].length > 0,\n );\n\n if (firstAvailableCategory) {\n setCategory(firstAvailableCategory);\n }\n }, [filterCampaigns]);\n\n const onCategoryChange = (value: string) => {\n setCategory(value as CategoryKey);\n };\n const [scrollIndex, setScrollIndex] = useState(0);\n\n const [emblaRef, emblaApi] = useEmblaCarousel({\n loop: false,\n slidesToScroll: \"auto\",\n });\n\n useEffect(() => {\n emblaApi?.on(\"select\", () => {\n setScrollIndex(emblaApi?.selectedScrollSnap());\n });\n }, [emblaApi]);\n\n const onLearnMore = (campaign: CurrentCampaigns) => {\n track(TrackerEventName.leaderboardCampaignClickLearnMore, {\n campaign_title: campaign.title,\n });\n window.open(campaign.learnMoreUrl, \"_blank\");\n };\n\n const onTradeNow = (campaign: CurrentCampaigns) => {\n tracking(TrackerEventName.leaderboardCampaignClickTradeNow, {\n campaign_title: campaign.title,\n });\n window.open(campaign.tradingUrl, \"_self\");\n };\n\n return {\n options,\n currentCampaigns,\n category,\n onCategoryChange,\n tradingUrl: href?.trading,\n emblaRef,\n emblaApi: emblaApi as TEmblaApi,\n scrollIndex,\n enableScroll: currentCampaigns?.length > 1,\n onLearnMore,\n onTradeNow,\n };\n}\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Box, Text, Flex, Button, Select } from \"@kodiak-finance/orderly-ui\";\nimport { CampaignsScriptReturn, CurrentCampaigns } from \"./campaigns.script\";\n\nexport type CampaignsProps = {\n className?: string;\n style?: React.CSSProperties;\n} & CampaignsScriptReturn;\n\nexport const Campaigns: FC<CampaignsProps> = (props) => {\n if (props.currentCampaigns.length === 0) {\n return null;\n }\n\n return (\n <Box\n width=\"100%\"\n intensity={900}\n p={5}\n pr={2}\n height={288}\n className={cn(\n \"oui-trading-leaderboard-campaigns oui-rounded-[20px]\",\n props.className,\n )}\n style={props.style}\n >\n <Header {...props} />\n <Box\n mt={5}\n r=\"xl\"\n className={cn(\"oui-overflow-y-auto\", \"oui-custom-scrollbar\")}\n >\n <Flex\n gapY={5}\n height={200}\n direction=\"column\"\n r=\"xl\"\n className=\"oui-pr-1.5\"\n >\n {props.currentCampaigns.map((campaign) => {\n return (\n <CampaignItem\n key={campaign.title}\n campaign={campaign}\n onLearnMore={props.onLearnMore}\n onTradeNow={props.onTradeNow}\n />\n );\n })}\n </Flex>\n </Box>\n </Box>\n );\n};\n\nconst Header: FC<CampaignsScriptReturn> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex justify=\"between\" itemAlign=\"center\" pr={3}>\n <Text size=\"xl\">{t(\"tradingLeaderboard.campaigns\")}</Text>\n <Select.options\n size={\"xs\"}\n value={props.category}\n onValueChange={props.onCategoryChange}\n options={props.options}\n classNames={{\n // set the width of the trigger to the width of the content\n trigger: \"oui-w-[--radix-select-content-available-width]\",\n }}\n />\n </Flex>\n );\n};\n\ntype CampaignItemProps = {\n campaign: CurrentCampaigns;\n onLearnMore: (campaign: CurrentCampaigns) => void;\n onTradeNow: (campaign: CurrentCampaigns) => void;\n};\n\nconst CampaignItem: FC<CampaignItemProps> = ({\n campaign,\n onLearnMore,\n onTradeNow,\n}) => {\n const { title, description, image, displayTime } = campaign;\n const { t } = useTranslation();\n\n return (\n <Flex intensity={800} r=\"xl\" width=\"100%\">\n <img\n className=\"oui-h-[200px] oui-w-[400px] oui-rounded-l-xl oui-object-fill\"\n src={image}\n alt={title}\n />\n\n <Flex\n itemAlign=\"start\"\n justify=\"between\"\n direction=\"column\"\n height=\"100%\"\n p={5}\n className=\"oui-flex-1 oui-font-semibold\"\n >\n <Flex gap={1} direction=\"column\" itemAlign=\"start\">\n <Text size=\"xl\">{title}</Text>\n <Text size=\"sm\" intensity={36}>\n {description}\n </Text>\n </Flex>\n <Flex justify=\"between\" width=\"100%\">\n <Text size=\"xs\" intensity={54}>\n {displayTime}\n </Text>\n <Flex gap={3}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n size=\"md\"\n onClick={() => {\n onLearnMore(campaign);\n }}\n >\n {t(\"tradingLeaderboard.learnMore\")}\n </Button>\n <Button\n size=\"md\"\n onClick={() => {\n onTradeNow(campaign);\n }}\n >\n {t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n );\n};\n","import { FC, SVGProps } from \"react\";\nimport { cn, DataFilter, DataTable, Flex, Spinner } from \"@kodiak-finance/orderly-ui\";\nimport { useTradingListColumns } from \"./column\";\nimport {\n getRowKey,\n TradingData,\n TradingListScriptReturn,\n} from \"./tradingList.script\";\n\nexport type TradingListProps = {\n style?: React.CSSProperties;\n className?: string;\n} & TradingListScriptReturn;\n\nexport const MobileTradingList: FC<TradingListProps> = (props) => {\n const column = useTradingListColumns(props.address);\n\n return (\n <Flex\n direction=\"column\"\n width=\"100%\"\n itemAlign=\"start\"\n intensity={900}\n r=\"2xl\"\n px={4}\n style={props.style}\n className={cn(\n \"oui-mobile-trading-leaderboard-trading-list\",\n props.className,\n )}\n >\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n className={cn(\"oui-mobile-trading-leaderboard-trading-filter\")}\n >\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[40px] oui-border-none\"\n />\n )}\n </Flex>\n\n <DataTable\n classNames={{\n root: \"oui-pb-4\",\n body: \"oui-text-2xs\",\n scroll: \"oui-overflow-y-hidden oui-h-full\",\n }}\n loading={props.isLoading}\n id=\"oui-trading-leaderboard-trading-table\"\n columns={column}\n initialSort={props.initialSort}\n onSort={props.onSort}\n dataSource={props.dataList}\n generatedRowKey={(record: TradingData) => record.key || record.address}\n manualPagination\n manualSorting\n onRow={(record, index) => {\n return {\n className: cn(\"oui-h-[30px]\"),\n };\n }}\n onCell={(column, record, index) => {\n if (record.key === getRowKey(props.address!)) {\n const isFirst = column.getIsFirstColumn();\n const isLast = column.getIsLastColumn();\n\n return {\n className: cn(\n \"after:oui-absolute after:oui-h-[30px] after:oui-w-full\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \" after:oui-left-0 after:oui-top-0 after:oui-z-[-1]\",\n \"after:oui-border-y\",\n isFirst && \"after:oui-rounded-l-lg after:oui-border-l\",\n isLast && \"after:oui-rounded-r-lg after:oui-border-r\",\n ),\n };\n }\n return {};\n }}\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 </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Text, Column, Box, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { getRowKey } from \"./tradingList.script\";\n\nexport const useTradingListColumns = (address?: string) => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n return useMemo(() => {\n return [\n {\n title: t(\"tradingLeaderboard.rank\"),\n dataIndex: \"rank\",\n width: 40,\n render: (value: number) => {\n return (\n <Box width={20} className=\"oui-text-center\">\n {value}\n </Box>\n );\n },\n },\n {\n title: t(\"common.address\"),\n dataIndex: \"address\",\n render: (value: string, record: any) => {\n const isYou = record.key === getRowKey(address!);\n if (isMobile && isYou) {\n return <Text>You</Text>;\n }\n\n return (\n <>\n <Text.formatted rule=\"address\">{value}</Text.formatted>\n {isYou && <Text> (You)</Text>}\n </>\n );\n },\n width: 90,\n },\n {\n title: t(\"tradingLeaderboard.tradingVolume\"),\n dataIndex: \"perp_volume\",\n onSort: true,\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2}>\n {value}\n </Text.numeral>\n );\n },\n width: 105,\n },\n {\n title: t(\"common.realizedPnl\"),\n dataIndex: \"realized_pnl\",\n onSort: true,\n align: isMobile ? \"right\" : \"left\",\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2} coloring>\n {value}\n </Text.numeral>\n );\n },\n width: 90,\n },\n ] as Column[];\n }, [t, isMobile, address]);\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { differenceInDays } from \"date-fns\";\nimport {\n useAccount,\n useConfig,\n useInfiniteQuery,\n useQuery,\n usePrivateQuery,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { TableSort, usePagination, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useEndReached } from \"../../../hooks/useEndReached\";\nimport { getDateRange, formatDateRange } from \"../../../utils\";\n\nexport type TradingListScriptOptions = {};\n\nexport type TradingData = {\n account_id: string;\n address: string;\n broker_fee: number;\n date: string;\n perp_maker_volume: number;\n perp_taker_volume: number;\n perp_volume: number;\n total_fee: number;\n // custom field\n key?: string;\n};\n\nexport type TradingResponse = {\n meta: API.RecordsMeta;\n rows: TradingData[];\n};\nexport type TradingListScriptReturn = ReturnType<typeof useTradingListScript>;\n\nexport const FilterDays = [7, 14, 30, 90] as const;\nexport type TFilterDays = (typeof FilterDays)[number];\nexport type DateRange = {\n from?: Date;\n to?: Date;\n};\n\nexport function useTradingListScript() {\n const [searchValue, setSearchValue] = useState(\"\");\n const [initialSort] = useState<TableSort>({\n sortKey: \"perp_volume\",\n sort: \"desc\",\n });\n const [sort, setSort] = useState<TableSort | undefined>(initialSort);\n\n const { state } = useAccount();\n const brokerId = useConfig(\"brokerId\");\n\n const { isMobile } = useScreen();\n\n const { dateRange, filterDay, updateFilterDay, filterItems, onFilter } =\n useFilter();\n\n const { page, pageSize, setPage, parsePagination } = usePagination({\n pageSize: 100,\n });\n\n const getUrl = (args: {\n page: number;\n pageSize: number;\n address?: string;\n sort?: string | null;\n }) => {\n const searchParams = new URLSearchParams();\n\n searchParams.set(\"page\", args.page.toString());\n searchParams.set(\"size\", args.pageSize.toString());\n\n searchParams.set(\"aggregateBy\", \"address_per_builder\");\n\n if (brokerId) {\n searchParams.set(\"broker_id\", brokerId);\n }\n\n if (args.sort) {\n searchParams.set(\"sort\", args.sort);\n } else if (args.sort !== null && sort) {\n const prefix = sort.sort === \"asc\" ? \"ascending\" : \"descending\";\n searchParams.set(\"sort\", `${prefix}_${sort.sortKey}`);\n }\n\n if (dateRange.from) {\n searchParams.set(\"start_date\", formatDateRange(dateRange.from!));\n }\n\n if (dateRange.to) {\n searchParams.set(\"end_date\", formatDateRange(dateRange.to!));\n }\n\n if (args.address) {\n searchParams.set(\"address\", args.address);\n }\n\n return `/v1/broker/leaderboard/daily?${searchParams.toString()}`;\n };\n\n const { data, isLoading } = useQuery<TradingResponse>(\n getUrl({ page, pageSize, address: searchValue }),\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const {\n data: infiniteData,\n size,\n setSize,\n isValidating,\n } = useInfiniteQuery<TradingResponse>(\n (pageIndex: number, previousPageData: any): string | null => {\n // reached the end\n if (previousPageData && !previousPageData.rows?.length) return null;\n\n if (!isMobile) {\n return null;\n }\n\n return getUrl({\n page: pageIndex + 1,\n pageSize,\n address: searchValue,\n });\n },\n {\n initialSize: 1,\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n // it will use first page data cache\n const { data: top100Data } = useQuery<TradingResponse>(\n state.address\n ? getUrl({\n page: 1,\n pageSize: 100,\n sort: `descending_${sort?.sortKey || \"perp_volume\"}`,\n })\n : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const { data: userDataRes = [] } = usePrivateQuery<TradingData[]>(\n state.address\n ? getUrl({ page: 1, pageSize: 1, address: state.address, sort: null })\n : null,\n {\n revalidateOnFocus: false,\n },\n );\n\n const getAddressRank = useCallback(\n (address: string) => {\n const index = top100Data?.rows.findIndex((item) =>\n isSameAddress(item.address, address!),\n );\n return index !== -1 ? index! + 1 : \"100+\";\n },\n [top100Data],\n );\n\n const userDataList = useMemo(() => {\n if (!state.address || isLoading) {\n return [];\n }\n\n if (!userDataRes.length) {\n return [\n {\n key: getRowKey(state.address!),\n address: state.address,\n rank: \"-\",\n } as unknown as TradingData,\n ];\n }\n\n return userDataRes?.map((item) => ({\n ...item,\n rank: getAddressRank(item.address!),\n key: getRowKey(item.address!),\n }));\n }, [state.address, userDataRes, isLoading, getAddressRank]);\n\n const addRankForList = useCallback(\n (list: TradingData[], total: number) => {\n return list?.map((item, index) => {\n let rank: string | number = index + 1;\n\n if (searchValue) {\n rank = getAddressRank(item.address);\n } else {\n if (sort?.sort === \"asc\") {\n rank = total - (page - 1) * pageSize - index;\n } else if (sort?.sort === \"desc\") {\n rank = (page - 1) * pageSize + index + 1;\n }\n }\n\n return {\n ...item,\n rank,\n };\n });\n },\n [page, pageSize, sort, searchValue, getAddressRank],\n );\n\n const dataSource = useMemo(() => {\n const list = data?.rows || [];\n const total = data?.meta.total || 0;\n const rankList = addRankForList(list, total);\n if (page === 1 && !searchValue) {\n return [...userDataList, ...rankList];\n }\n return rankList;\n }, [data, page, userDataList, searchValue, addRankForList]);\n\n const dataList = useMemo(() => {\n if (!infiniteData?.length) {\n return [];\n }\n\n const total = infiniteData[0]?.meta.total || 0;\n const flatList = infiniteData?.map((item) => item.rows)?.flat();\n const rankList = addRankForList(flatList, total);\n\n if (!searchValue) {\n return [...userDataList, ...rankList];\n }\n\n return rankList;\n }, [infiniteData, userDataList, searchValue, addRankForList]);\n\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n const pagination = useMemo(\n () => parsePagination(data?.meta),\n [parsePagination, data],\n );\n\n useEndReached(sentinelRef, () => {\n if (!isValidating && isMobile) {\n setSize(size + 1);\n }\n });\n\n const onSearchValueChange = (value: string) => {\n setSearchValue(value);\n };\n\n const clearSearchValue = useCallback(() => {\n setSearchValue(\"\");\n }, []);\n\n const onSort = useCallback(\n (sort?: TableSort) => {\n setSort(sort || initialSort);\n },\n [initialSort],\n );\n\n useEffect(() => {\n if (searchValue) {\n setPage(1);\n }\n }, [searchValue]);\n\n useEffect(() => {\n setPage(1);\n }, [state.address]);\n\n useEffect(() => {\n if (dateRange.to && dateRange.from) {\n setPage(1);\n }\n }, [dateRange]);\n\n return {\n pagination,\n dateRange,\n filterDay,\n updateFilterDay,\n filterItems,\n onFilter,\n initialSort,\n onSort,\n dataSource,\n isLoading: isLoading || isValidating,\n searchValue,\n onSearchValueChange,\n clearSearchValue,\n isMobile,\n sentinelRef,\n dataList,\n address: state.address,\n };\n}\n\nconst useFilter = () => {\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 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 };\n};\n\nexport function isSameAddress(address1: string, address2: string) {\n return address1.toLowerCase() === address2.toLowerCase();\n}\n\nexport function getRowKey(address: string) {\n return `current-address-${address?.toLowerCase()}`;\n}\n","import { FC, SVGProps } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n CloseCircleFillIcon,\n cn,\n DataFilter,\n DataTable,\n Flex,\n Input,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { useTradingListColumns } from \"./column\";\nimport {\n FilterDays,\n getRowKey,\n TradingData,\n TradingListScriptReturn,\n} from \"./tradingList.script\";\n\nexport type TradingListProps = {\n style?: React.CSSProperties;\n className?: string;\n} & TradingListScriptReturn;\n\nexport const TradingList: FC<TradingListProps> = (props) => {\n const column = useTradingListColumns(props.address);\n const { t } = useTranslation();\n\n return (\n <Flex\n direction=\"column\"\n width=\"100%\"\n itemAlign=\"start\"\n intensity={900}\n r=\"2xl\"\n px={4}\n style={props.style}\n className={cn(\"oui-trading-leaderboard-trading-list\", props.className)}\n >\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n mt={2}\n className={cn(\n \"oui-trading-leaderboard-trading-filter\",\n \"oui-border-b oui-border-line\",\n )}\n >\n <Flex gap={3}>\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[53px] oui-border-none\"\n />\n )}\n {FilterDays.map((value) => {\n return (\n <button\n className=\"oui-relative oui-px-2 oui-py-[2px] oui-text-sm\"\n key={value}\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={props.filterDay === value ? \"brand\" : undefined}\n className={\n props.filterDay !== value\n ? \"oui-text-base-contrast-54\"\n : \"\"\n }\n >\n {`${value}D`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-absolute oui-inset-0 oui-rounded oui-opacity-[.12] oui-gradient-primary\"\n onClick={() => {\n props.updateFilterDay(value as any);\n }}\n ></div>\n </button>\n );\n })}\n </Flex>\n <Input\n value={props.searchValue}\n onValueChange={props.onSearchValueChange}\n placeholder={t(\"common.address.search.placeholder\")}\n className={cn(\n \"oui-trading-leaderboard-trading-search-input\",\n \"oui-w-[240px]\",\n )}\n size=\"sm\"\n prefix={\n <Box pl={3} pr={1}>\n <SearchIcon className=\"oui-text-base-contrast-36\" />\n </Box>\n }\n suffix={\n props.searchValue && (\n <Box mr={2}>\n <CloseCircleFillIcon\n size={14}\n className=\"oui-cursor-pointer oui-text-base-contrast-36\"\n onClick={props.clearSearchValue}\n />\n </Box>\n )\n }\n autoComplete=\"off\"\n />\n </Flex>\n\n <DataTable\n loading={props.isLoading}\n id=\"oui-trading-leaderboard-trading-table\"\n columns={column}\n initialSort={props.initialSort}\n onSort={props.onSort}\n bordered\n dataSource={props.dataSource}\n generatedRowKey={(record: TradingData) => record.key || record.address}\n manualPagination\n manualSorting\n pagination={props.pagination}\n classNames={{\n root: \"!oui-h-[calc(100%_-_53px_-_8px)]\",\n }}\n onRow={(record, index) => {\n return {\n className: cn(\"oui-h-[48px]\"),\n };\n }}\n onCell={(column, record, index) => {\n if (record.key === getRowKey(props.address!)) {\n const isFirst = column.getIsFirstColumn();\n const isLast = column.getIsLastColumn();\n\n return {\n className: cn(\n \"after:oui-absolute after:oui-h-[48px] after:oui-w-full\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \"after:oui-left-0 after:oui-top-0 after:oui-z-[-1]\",\n \"after:oui-border-y\",\n isFirst && \"after:oui-rounded-l-lg after:oui-border-l\",\n isLast && \"after:oui-rounded-r-lg after:oui-border-r\",\n ),\n };\n }\n return {};\n }}\n />\n </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { FC } from \"react\";\nimport { MobileTradingList } from \"./tradingList.mobile.ui\";\nimport { useTradingListScript } from \"./tradingList.script\";\nimport { TradingList, TradingListProps } from \"./tradingList.ui\";\n\nexport type TradingListWidgetProps = Pick<\n TradingListProps,\n \"style\" | \"className\"\n>;\n\n/**\n * @deprecated use TradingListPage instead\n * it will be removed in next version\n */\nexport const TradingListWidget: FC<TradingListWidgetProps> = (props) => {\n const state = useTradingListScript();\n if (state.isMobile) {\n return <MobileTradingList {...state} {...props} />;\n }\n return <TradingList {...state} {...props} />;\n};\n","import { useMemo } from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { Campaign } from \"../../components/provider\";\n\nexport type LeaderboardScriptReturn = ReturnType<typeof useLeaderboardScript>;\n\nexport type LeaderboardScriptOptions = {\n backgroundSrc?: string;\n campaigns?: Campaign[];\n};\n\nfunction isVideoSrc(src?: string) {\n const extension = src?.split(\".\").pop();\n return [\"mp4\", \"webm\", \"avi\", \"ogg\"].includes(extension ?? \"\");\n}\n\nexport function useLeaderboardScript(options: LeaderboardScriptOptions) {\n const { backgroundSrc, campaigns = [] } = options;\n const { isMobile } = useScreen();\n\n const showCampaigns = useMemo(() => campaigns?.length > 0, [campaigns]);\n\n const isVideo = useMemo(() => {\n return isVideoSrc(backgroundSrc);\n }, [backgroundSrc]);\n\n return {\n backgroundSrc,\n isVideo,\n showCampaigns,\n isMobile,\n };\n}\n","import { FC } from \"react\";\nimport { cn, Flex } from \"@kodiak-finance/orderly-ui\";\nimport { BrokerStatsWidget } from \"../../../components/brokerStats/brokerStats.ui\";\nimport { CampaignsWidget } from \"../../components/campaigns\";\nimport { TradingListWidget } from \"../../components/tradingList\";\nimport { LeaderboardScriptReturn } from \"./leaderboard.script\";\n\nexport type LeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n} & LeaderboardScriptReturn;\n\nexport const Leaderboard: FC<LeaderboardProps> = (props) => {\n const renderBackground = () => {\n const linearGradient =\n \"linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)\";\n\n if (props.isVideo) {\n return (\n <div\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\",\n )}\n >\n <div\n style={{\n backgroundImage: linearGradient,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\",\n )}\n />\n <video\n autoPlay\n loop\n muted\n className={cn(\n // rest style\n \"oui-border-none oui-outline-none oui-bg-transparent\",\n \"oui-w-full oui-h-full\",\n // \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-object-cover\",\n \"oui-opacity-50\",\n )}\n >\n <source src={props.backgroundSrc} type=\"video/mp4\" />\n <source src={props.backgroundSrc} type=\"video/webm\" />\n <source src={props.backgroundSrc} type=\"video/ogg\" />\n <source src={props.backgroundSrc} type=\"video/avi\" />\n Your browser does not support the video tag.\n </video>\n </div>\n );\n }\n\n if (props.backgroundSrc) {\n return (\n <div\n style={{\n backgroundImage: `${linearGradient}, url(${props.backgroundSrc}) `,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\",\n \"oui-opacity-50\",\n )}\n />\n );\n }\n };\n\n return (\n <div\n style={props.style}\n className={cn(\"oui-h-full oui-mix-blend-screen\", props.className)}\n >\n {renderBackground()}\n <Flex\n direction=\"column\"\n gapY={5}\n height=\"100%\"\n className={cn(\n \"oui-trading-leaderboard oui-relative\",\n \"oui-max-w-[1040px] oui-px-3 oui-mx-auto \",\n )}\n >\n {props.showCampaigns && <CampaignsWidget />}\n <BrokerStatsWidget />\n <TradingListWidget\n className={cn(\n props.showCampaigns\n ? \"oui-h-[calc(100%_-_288px_-_20px)]\"\n : \"oui-h-full\",\n )}\n />\n </Flex>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport {\n TradingLeaderboardProvider,\n TradingLeaderboardProviderProps,\n} from \"../../components/provider\";\nimport { MobileLeaderboardWidget } from \"./leaderboard.mobile.ui\";\nimport { useLeaderboardScript } from \"./leaderboard.script\";\nimport { Leaderboard, LeaderboardProps } from \"./leaderboard.ui\";\n\nexport type LeaderboardWidgetProps = TradingLeaderboardProviderProps &\n Pick<LeaderboardProps, \"style\" | \"className\">;\n\n/**\n * @deprecated use LeaderboardPage instead\n * it will be removed in next version\n */\nexport const LeaderboardWidget: FC<LeaderboardWidgetProps> = (props) => {\n const state = useLeaderboardScript({\n backgroundSrc: props.backgroundSrc,\n campaigns: props.campaigns,\n });\n\n return (\n <TradingLeaderboardProvider campaigns={props.campaigns} href={props.href}>\n {state.isMobile ? (\n <MobileLeaderboardWidget {...state} />\n ) : (\n <Leaderboard\n {...state}\n className={props.className}\n style={props.style}\n />\n )}\n </TradingLeaderboardProvider>\n );\n};\n","import React, {\n createContext,\n useContext,\n useMemo,\n useState,\n useEffect,\n} from \"react\";\nimport { parseISO } from \"date-fns\";\nimport { sortWith, descend } from \"ramda\";\nimport {\n usePrivateQuery,\n RefferalAPI,\n useMemoizedFn,\n noCacheConfig,\n useConfig,\n useQuery,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { getCurrentTierIndex } from \"../campaigns/pricePool/utils\";\nimport {\n CampaignConfig,\n UserData,\n CampaignStatsResponse,\n CampaignStatistics,\n} from \"../campaigns/type\";\n\n/**\n * Trading leaderboard provider state\n */\nexport type TradingLeaderboardState = {\n /** campaigns config, if not provided, will not show campaigns section */\n campaigns?: CampaignConfig[];\n /** background src, it can be a image resource or video resource */\n backgroundSrc?: string;\n href?: {\n /** default trading now button url */\n trading: string;\n };\n currentCampaignId: string | number;\n currentCampaign?: CampaignConfig;\n onCampaignChange: (campaignId: string | number) => void;\n /** leaderboard user data, it will be used to calculate the rewards */\n userData?: UserData;\n /** set leaderboard user data */\n setUserData?: (userdata: UserData) => void;\n /** campaign ranking list updated time */\n updatedTime?: number;\n /** set snapshot time */\n setUpdatedTime?: (updatedTime?: number) => void;\n /** custom data, if use this, you can full control the data */\n dataAdapter?: (info: { page: number; pageSize: number }) => {\n loading: boolean;\n dataSource?: any[];\n dataList?: any[];\n userData?: any;\n updatedTime?: number;\n meta?: {\n total: number;\n current_page: number;\n records_per_page: number;\n };\n };\n campaignDateRange?: {\n start_time: Date | string;\n end_time: Date | string;\n };\n /** custom time range for leaderboard (supports 'now' for current date) */\n timeRange?: {\n from?: string | Date;\n to?: string | Date | \"now\";\n };\n statistics?: CampaignStatistics;\n setStatistics?: (statistics: CampaignStatistics) => void;\n};\n\n/**\n * Trading leaderboard context\n */\nexport const TradingLeaderboardContext = createContext<TradingLeaderboardState>(\n {} as TradingLeaderboardState,\n);\n\nexport type TradingLeaderboardProviderProps = Pick<\n TradingLeaderboardState,\n \"campaigns\" | \"href\" | \"backgroundSrc\" | \"dataAdapter\" | \"timeRange\"\n> & {\n campaignId?: string | number;\n onCampaignChange?: (campaignId: string | number) => void;\n};\n\nexport const TradingLeaderboardProvider: React.FC<\n React.PropsWithChildren<TradingLeaderboardProviderProps>\n> = (props) => {\n const {\n campaignId,\n campaigns,\n backgroundSrc,\n href,\n children,\n dataAdapter,\n onCampaignChange,\n timeRange,\n } = props;\n\n const [userData, setUserData] = useState<UserData>();\n const [updatedTime, setUpdatedTime] = useState<number>();\n const [statistics, setStatistics] = useState<CampaignStatistics>({\n total_participants: 0,\n total_volume: 0,\n });\n\n const { data: generateCode, mutate: generateCodeMutate } =\n usePrivateQuery<RefferalAPI.ReferralInfo>(\"/v1/referral/info\", {\n revalidateOnFocus: true,\n errorRetryCount: 3,\n ...noCacheConfig,\n });\n\n const refererCode = generateCode?.referee_info?.referer_code ?? \"\";\n\n useEffect(() => {\n if (refererCode && userData?.referral_code != refererCode) {\n setUserData({ ...userData!, referral_code: refererCode });\n generateCodeMutate();\n }\n }, [userData, refererCode, generateCodeMutate]);\n\n const currentCampaign = useMemo(() => {\n return campaigns?.find((campaign) => campaign.campaign_id == campaignId);\n }, [campaigns, campaignId]);\n\n const filteredCampaigns = useMemo(() => {\n // Using date-fns to parse date strings and sort by end_time in descending order\n return campaigns\n ? sortWith(\n [descend((campaign: CampaignConfig) => parseISO(campaign.end_time))],\n campaigns,\n )\n : campaigns;\n }, [campaigns]);\n\n const memoCampaignChange = useMemoizedFn((id: string | number) => {\n onCampaignChange?.(id);\n });\n\n const symbols = Array.isArray(currentCampaign?.volume_scope)\n ? currentCampaign?.volume_scope.join(\",\")\n : currentCampaign?.volume_scope;\n\n const brokerId = useConfig(\"brokerId\");\n\n const searchParams = useMemo(() => {\n return {\n campaign_id: campaignId?.toString() || \"\",\n symbols: symbols || \"\",\n broker_id: brokerId,\n group_by: \"BROKER\",\n };\n }, [campaignId, symbols, brokerId]);\n\n const { data: stats } = useQuery<CampaignStatsResponse>(\n campaignId !== \"general\"\n ? `https://api.orderly.org/v1/public/campaign/stats?${new URLSearchParams(searchParams).toString()}`\n : null,\n { revalidateOnFocus: false },\n );\n\n useEffect(() => {\n setStatistics({\n total_participants: stats?.user_count,\n total_volume: stats?.volume,\n });\n }, [stats?.user_count, stats?.volume]);\n\n const tieredIndex = useMemo(() => {\n if (!currentCampaign?.tiered_prize_pools) return 0;\n return getCurrentTierIndex(\n statistics?.total_volume || 0,\n currentCampaign?.tiered_prize_pools,\n );\n }, [statistics?.total_volume, currentCampaign?.tiered_prize_pools]);\n\n const _currentCampaign = useMemo(() => {\n if (currentCampaign?.tiered_prize_pools) {\n return {\n ...currentCampaign,\n prize_pools: currentCampaign?.tiered_prize_pools[tieredIndex],\n };\n }\n return currentCampaign;\n }, [currentCampaign, tieredIndex]);\n\n const campaignDateRange = useMemo(() => {\n return currentCampaign?.start_time && currentCampaign?.end_time\n ? {\n start_time: currentCampaign.start_time,\n end_time: currentCampaign.end_time,\n }\n : undefined;\n }, [currentCampaign]);\n\n const memoizedValue = useMemo<TradingLeaderboardState>(() => {\n return {\n campaigns: filteredCampaigns,\n href: href,\n backgroundSrc: backgroundSrc,\n currentCampaignId: campaignId || \"general\",\n currentCampaign: _currentCampaign,\n updatedTime,\n userData,\n setUserData,\n onCampaignChange: memoCampaignChange,\n setUpdatedTime: setUpdatedTime,\n dataAdapter: dataAdapter,\n campaignDateRange,\n timeRange,\n statistics,\n setStatistics,\n };\n }, [\n backgroundSrc,\n currentCampaign,\n campaignId,\n filteredCampaigns,\n href,\n updatedTime,\n userData,\n dataAdapter,\n memoCampaignChange,\n campaignDateRange,\n timeRange,\n statistics,\n setStatistics,\n ]);\n\n return (\n <TradingLeaderboardContext.Provider value={memoizedValue}>\n {children}\n </TradingLeaderboardContext.Provider>\n );\n};\n\nexport const useTradingLeaderboardContext = () => {\n const ctx = useContext<TradingLeaderboardState>(TradingLeaderboardContext);\n return ctx;\n};\n","export const isReachedVolumeLimit = (volume: number, volumeLimit: number) => {\n return volume >= volumeLimit;\n};\n\n/**\n * Get the highest tier index that the user has reached based on trading volume\n * @param tradingVolume Current trading volume\n * @param tieredPrizePools Array of prize pool tiers with volume limits\n * @returns Highest reached tier index (0-based), or -1 if invalid data or no tiers reached\n */\nexport const getCurrentTierIndex = (\n tradingVolume: number,\n tieredPrizePools: Array<Array<{ volume_limit?: number }>>,\n): number => {\n if (!tieredPrizePools || tieredPrizePools.length === 0) {\n return -1;\n }\n\n // Extract volume limits and sort them in ascending order\n const volumeLimits = tieredPrizePools\n .map((tier) => tier[0]?.volume_limit || 0)\n .filter((limit) => limit >= 0)\n .sort((a, b) => a - b);\n\n if (volumeLimits.length === 0) {\n return -1;\n }\n\n // If trading volume is 0 or negative, no tiers reached\n // if (tradingVolume <= 0) {\n // return -1;\n // }\n\n // Find the highest tier that the user has reached\n let highestReachedTier = -1;\n for (let i = 0; i < volumeLimits.length; i++) {\n if (tradingVolume >= volumeLimits[i]) {\n highestReachedTier = i;\n } else {\n break;\n }\n }\n\n return highestReachedTier;\n};\n\n/**\n * Calculate progress bar width percentage based on current trading volume and tiered volume limits\n * @param tradingVolume Current trading volume\n * @param tieredPrizePools Array of prize pool tiers with volume limits\n * @returns Width percentage (0-100)\n */\nexport const calculateProgressWidth = (\n tradingVolume: number,\n tieredPrizePools: Array<Array<{ volume_limit?: number }>>,\n offset: number = 0,\n): number => {\n if (!tieredPrizePools || tieredPrizePools.length === 0) {\n return 0;\n }\n\n // Extract volume limits and sort them in ascending order\n const volumeLimits = tieredPrizePools\n .map((tier) => tier[0]?.volume_limit || 0)\n .filter((limit) => limit >= 0)\n .sort((a, b) => a - b);\n\n if (volumeLimits.length === 0) {\n return 0;\n }\n\n const firstSegmentWidth = getFirstSegmentWidth(volumeLimits.length);\n\n const segmentWidth = (100 - firstSegmentWidth) / (volumeLimits.length - 1);\n\n // Calculate the width of each segment (equally distributed)\n // const segmentWidth = 100 / volumeLimits.length;\n\n // If trading volume exceeds the highest limit, return 100%\n const maxLimit = volumeLimits[volumeLimits.length - 1];\n if (tradingVolume >= maxLimit) {\n return 100;\n }\n\n // Find which segment the current volume falls into (not necessarily reached)\n let segmentIndex = 0;\n for (let i = 0; i < volumeLimits.length; i++) {\n if (tradingVolume < volumeLimits[i]) {\n segmentIndex = i;\n break;\n }\n }\n\n // Calculate progress within the segment\n const segmentStart = segmentIndex === 0 ? 0 : volumeLimits[segmentIndex - 1];\n const segmentEnd = volumeLimits[segmentIndex];\n const segmentRange = segmentEnd - segmentStart;\n const volumeInSegment = tradingVolume - segmentStart;\n\n // Calculate progress percentage within current segment\n const progressInSegment =\n segmentRange > 0 ? volumeInSegment / segmentRange : 0;\n\n let totalWidth = firstSegmentWidth;\n for (let i = 1; i <= segmentIndex; i++) {\n if (i === segmentIndex) {\n const limitWidth = totalWidth + segmentWidth;\n const progressWidth = totalWidth + progressInSegment * segmentWidth;\n\n if (limitWidth - progressWidth < offset) {\n totalWidth = limitWidth - offset;\n } else {\n totalWidth = progressWidth;\n }\n } else {\n totalWidth += segmentWidth;\n }\n }\n\n return Math.min(Math.max(totalWidth, 0), 100);\n};\n\nconst getFirstSegmentWidth = (totalTiers: number) => {\n return Math.floor(100 / (totalTiers * 2));\n};\n\nexport const getProgressLeft = (totalTiers: number, index: number) => {\n const firstSegmentWidth = getFirstSegmentWidth(totalTiers);\n\n if (totalTiers === 1) {\n return `${firstSegmentWidth}%`;\n }\n\n const left =\n firstSegmentWidth + (index * (100 - firstSegmentWidth)) / (totalTiers - 1);\n return `${Math.min(left, 100)}%`;\n};\n","// deprecated, it will be removed in future version\nexport * from \"./deprecated/pages/leaderboard\";\nexport * from \"./deprecated/components/campaigns\";\nexport * from \"./deprecated/components/tradingList\";\nexport { type Campaign } from \"./deprecated/components/provider\";\n\nexport * from \"./components/provider\";\nexport * from \"./components/ranking/generalRanking\";\nexport * from \"./components/ranking/campaignRanking\";\nexport * from \"./components/ranking/shared/ranking.ui\";\n\nexport * from \"./components/leaderboard/generalLeaderboard\";\nexport * from \"./components/leaderboard/campaignLeaderboard\";\nexport * from \"./components/brokerStats/brokerStats.ui\";\nexport * from \"./pages/leaderboard/page\";\n\nexport * from \"./components/campaigns/type\";\nexport * from \"./type\";\nexport { getDateRange } from \"./utils\";\nexport { CampaignsHeaderWidget } from \"./components/campaigns/header\";\nexport { LeaderboardBackground } from \"./components/background\";\n","import { FC } from \"react\";\nimport { Ranking, RankingProps } from \"../shared/ranking.ui\";\nimport {\n CampaignRankingScriptOptions,\n useCampaignRankingScript,\n} from \"./campaignRanking.script\";\n\nexport type CampaignRankingWidgetProps = Pick<\n RankingProps,\n \"style\" | \"className\" | \"fields\"\n> &\n CampaignRankingScriptOptions;\n\nexport const CampaignRankingWidget: FC<CampaignRankingWidgetProps> = (\n props,\n) => {\n const { campaignId, fields, sortKey, ...rest } = props;\n const state = useCampaignRankingScript({\n campaignId,\n sortKey,\n });\n\n // @ts-ignore\n return <Ranking {...state} {...rest} fields={fields} type=\"campaign\" />;\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useAccount,\n useConfig,\n useInfiniteQuery,\n useQuery,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { TableSort, usePagination, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useEndReached } from \"../../../hooks/useEndReached\";\nimport { CampaignConfig, UserData } from \"../../campaigns/type\";\nimport { useTradingLeaderboardContext } from \"../../provider\";\nimport { calculateUserPoolReward } from \"../../rewards/utils\";\nimport { getCurrentAddressRowKey, isSameAddress } from \"../shared/util\";\n\nexport type CampaignRankingData = {\n broker_id: string;\n account_id: string;\n address: string;\n volume: number;\n pnl: number;\n total_deposit_amount: number;\n total_withdrawal_amount: number;\n start_account_value: number;\n end_account_value: number;\n\n // custom field\n key?: string;\n rank?: number | string;\n rewards?: {\n amount: number;\n currency: string;\n };\n};\n\ntype CampaignRankingResponse = {\n meta: API.RecordsMeta;\n rows: CampaignRankingData[];\n updated_time: number;\n};\nexport type CampaignRankingScriptReturn = ReturnType<\n typeof useCampaignRankingScript\n>;\n\nexport type CampaignRankingScriptOptions = {\n campaignId: number | string;\n sortKey?: \"volume\" | \"pnl\";\n};\n\nexport function useCampaignRankingScript(\n options: CampaignRankingScriptOptions,\n) {\n const { campaignId, sortKey = \"volume\" } = options;\n const [initialSort] = useState<TableSort>({\n sortKey,\n sort: \"desc\",\n });\n const [sort, setSort] = useState<TableSort | undefined>(initialSort);\n\n const { currentCampaign, setUserData, setUpdatedTime, dataAdapter } =\n useTradingLeaderboardContext();\n\n const { state } = useAccount();\n const brokerId = useConfig(\"brokerId\");\n\n const { isMobile } = useScreen();\n\n const { page, pageSize, setPage, parsePagination } = usePagination({\n pageSize: isMobile ? 100 : 20,\n });\n\n const isCustomData = typeof dataAdapter === \"function\";\n\n const customData = useMemo(() => {\n if (typeof dataAdapter === \"function\") {\n return dataAdapter({ page, pageSize });\n }\n }, [dataAdapter, page, pageSize]);\n\n const getUrl = (args: {\n page: number;\n pageSize: number;\n sort?: string | null;\n }) => {\n if (isCustomData) {\n return null;\n }\n const searchParams = new URLSearchParams();\n\n searchParams.set(\"page\", args.page.toString());\n searchParams.set(\n \"size\",\n // if page is 1, we need to set page size to 100 to get the top 100 data to judge user rank\n args.page === 1 ? \"100\" : args.pageSize.toString(),\n );\n\n if (campaignId) {\n searchParams.set(\"campaign_id\", campaignId.toString());\n }\n\n if (brokerId) {\n searchParams.set(\"broker_id\", brokerId);\n }\n\n if (args.sort) {\n searchParams.set(\"sort_by\", args.sort);\n } else if (args.sort !== null && sort) {\n searchParams.set(\"sort_by\", sort.sortKey);\n }\n\n // https://orderly.network/docs/build-on-omnichain/evm-api/restful-api/public/get-campaign-ranking\n // only get prod ranking data\n return `https://api.orderly.org/v1/public/campaign/ranking?${searchParams.toString()}`;\n };\n\n const { data, isLoading } = useQuery<CampaignRankingResponse>(\n getUrl({ page, pageSize }),\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const {\n data: infiniteData,\n size,\n setSize,\n isValidating,\n } = useInfiniteQuery<CampaignRankingResponse>(\n (pageIndex: number, previousPageData: any): string | null => {\n // reached the end\n if (previousPageData && !previousPageData.rows?.length) return null;\n\n if (!isMobile) {\n return null;\n }\n\n return getUrl({\n page: pageIndex + 1,\n pageSize,\n });\n },\n {\n initialSize: 1,\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n // it will use first page data cache\n const { data: top100Data } = useQuery<CampaignRankingResponse>(\n state.address\n ? getUrl({\n page: 1,\n pageSize: 100,\n // sort: \"desc\",\n })\n : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const getUserUrl = () => {\n if (!state.address || !campaignId || isCustomData) {\n return null;\n }\n\n const searchParams = new URLSearchParams();\n\n if (brokerId) {\n searchParams.set(\"broker_id\", brokerId);\n }\n\n searchParams.set(\"campaign_id\", campaignId.toString());\n searchParams.set(\"address\", state.address!);\n\n // https://orderly.network/docs/build-on-omnichain/evm-api/restful-api/public/get-campaign-user-info\n // only get prod user data\n return `https://api.orderly.org/v1/public/campaign/user?${searchParams.toString()}`;\n };\n\n const { data: userDataRes } = useQuery<CampaignRankingData[]>(getUserUrl(), {\n revalidateOnFocus: false,\n });\n\n const getAddressRank = useCallback(\n (address: string) => {\n if (top100Data?.rows?.length === 0) {\n return \"-\";\n }\n\n const index = top100Data?.rows.findIndex((item) =>\n isSameAddress(item.address, address!),\n );\n return index !== -1 ? index! + 1 : \"100+\";\n },\n [top100Data],\n );\n\n const userData = useMemo(() => {\n if (customData) {\n return customData?.userData;\n }\n\n if (!state.address || isLoading) {\n return undefined;\n }\n\n if (!userDataRes) {\n return {\n key: getCurrentAddressRowKey(state.address!),\n address: state.address,\n rank: \"-\",\n } as unknown as CampaignRankingData;\n }\n\n return {\n ...userDataRes,\n address: state.address,\n rank: getAddressRank(state.address!),\n key: getCurrentAddressRowKey(state.address!),\n };\n }, [state.address, userDataRes, isLoading, getAddressRank, customData]);\n\n const addRankForList = useCallback(\n (list: CampaignRankingData[], total: number) => {\n return list?.map((item, index) => {\n let rank: string | number = index + 1;\n\n if (sort?.sort === \"asc\") {\n rank = total - (page - 1) * pageSize - index;\n } else if (sort?.sort === \"desc\") {\n rank = (page - 1) * pageSize + index + 1;\n }\n\n return {\n ...item,\n rank,\n };\n });\n },\n [page, pageSize, sort],\n );\n\n const dataSource = useMemo(() => {\n if (customData) {\n return formatData(customData?.dataSource, currentCampaign, sortKey);\n }\n\n let list = data?.rows || [];\n if (page === 1) {\n list = list.slice(0, pageSize);\n }\n const total = data?.meta.total || 0;\n const rankList = addRankForList(list, total);\n\n const _data =\n page === 1 ? (userData ? [userData, ...rankList] : rankList) : rankList;\n\n return formatData(_data, currentCampaign, sortKey);\n }, [\n data,\n page,\n pageSize,\n userData,\n addRankForList,\n currentCampaign,\n sortKey,\n customData,\n ]);\n\n const dataList = useMemo(() => {\n if (customData) {\n return formatData(customData?.dataList, currentCampaign, sortKey);\n }\n\n if (!infiniteData?.length) {\n return [];\n }\n\n const total = infiniteData[0]?.meta.total || 0;\n const flatList = infiniteData?.map((item) => item.rows)?.flat();\n const rankList = addRankForList(flatList, total);\n\n const _data = userData ? [userData, ...rankList] : rankList;\n\n return formatData(_data, currentCampaign, sortKey);\n }, [\n infiniteData,\n userData,\n addRankForList,\n currentCampaign,\n sortKey,\n customData,\n ]);\n\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n const pagination = useMemo(\n () =>\n parsePagination({\n total: customData?.meta?.total || data?.meta?.total || 0,\n current_page:\n customData?.meta?.current_page || data?.meta?.current_page || 1,\n records_per_page: pageSize,\n }),\n [\n data?.meta?.total,\n data?.meta?.current_page,\n pageSize,\n parsePagination,\n customData,\n ],\n );\n\n useEndReached(sentinelRef, () => {\n if (!isValidating && isMobile) {\n setSize(size + 1);\n }\n });\n\n useEffect(() => {\n setPage(1);\n }, [state.address]);\n\n useEffect(() => {\n if (userData) {\n setUserData?.(userData as any);\n }\n }, [userData]);\n\n useEffect(() => {\n const time = customData?.updatedTime || data?.updated_time || 0;\n setUpdatedTime?.(time);\n // when currentCampaign changed, we need to reset the campaign ranking list updated time\n }, [data, currentCampaign, customData]);\n\n useEffect(() => {\n setSort({ sortKey, sort: \"desc\" });\n }, [sortKey]);\n\n return {\n pagination,\n initialSort,\n dataSource,\n isLoading: isLoading || isValidating || customData?.loading,\n isMobile,\n sentinelRef,\n dataList,\n address: state.address,\n };\n}\n\nfunction formatData(\n data?: any[],\n currentCampaign?: CampaignConfig,\n metric?: \"volume\" | \"pnl\",\n) {\n const pool = currentCampaign?.prize_pools?.find(\n (item) => item.metric === metric,\n );\n\n return data?.map((item) => {\n const rewards = pool ? calculateUserPoolReward(item as UserData, pool!) : 0;\n\n return {\n ...item,\n rewards: {\n amount: rewards,\n currency: pool?.currency,\n },\n };\n });\n}\n","import {\n TicketTierRule,\n TicketLinearRule,\n TicketRules,\n CampaignConfig,\n UserData,\n PrizePool,\n} from \"../campaigns/type\";\n\n/**\n * Get user metric value based on pool metric type\n */\nfunction getUserMetricValue(\n userdata: UserData,\n metric: \"volume\" | \"pnl\",\n): number {\n return metric === \"volume\" ? userdata.volume : userdata.pnl;\n}\n\n/**\n * Estimate user's rank based on current performance\n */\nfunction estimateUserRank(\n userdata: UserData,\n metric: \"volume\" | \"pnl\",\n): number | null {\n // If we have actual rank data, use it\n if (userdata.rank) {\n return Number(userdata.rank);\n }\n\n // Otherwise, make a simple estimation based on performance\n const userMetricValue = getUserMetricValue(userdata, metric);\n const totalParticipants = userdata.total_participants || 1000;\n\n if (userMetricValue <= 0) return null;\n\n // Simple heuristic: assume better performance means better rank\n // In reality, you would compare against actual leaderboard data\n if (userMetricValue >= 100000) return 1;\n if (userMetricValue >= 50000) return Math.floor(totalParticipants * 0.05); // Top 5%\n if (userMetricValue >= 10000) return Math.floor(totalParticipants * 0.2); // Top 20%\n if (userMetricValue >= 1000) return Math.floor(totalParticipants * 0.5); // Top 50%\n\n return Math.floor(totalParticipants * 0.8); // Bottom 80%\n}\n\n/**\n * Find reward amount for user based on estimated rank in a specific pool\n */\nfunction findRewardInPool(userdata: UserData, pool: PrizePool): number {\n const userMetricValue = getUserMetricValue(userdata, pool.metric);\n\n // Skip if user has no relevant data\n if (userMetricValue <= 0) return 0;\n\n const estimatedRank = estimateUserRank(userdata, pool.metric);\n if (estimatedRank === null) return 0;\n\n // Find matching tier based on estimated rank\n for (const tier of pool.tiers) {\n let isInTier = false;\n\n if (tier.position && estimatedRank === tier.position) {\n isInTier = true;\n } else if (tier.position_range) {\n const [start, end] = tier.position_range;\n if (estimatedRank >= start && estimatedRank <= end) {\n isInTier = true;\n }\n }\n\n if (isInTier) {\n return tier.amount;\n }\n }\n\n return 0;\n}\n\n/**\n * Calculate estimated rewards based on user's current performance and campaign configuration\n * @param userdata User's current trading data\n * @param campaign Campaign configuration\n * @returns Estimated reward amount with currency\n */\nexport function calculateEstimatedRewards(\n userdata: UserData,\n campaign: CampaignConfig,\n): { amount: number; currency: string } | null {\n if (!campaign.prize_pools || campaign.prize_pools.length === 0) {\n return null;\n }\n\n let totalEstimatedReward = 0;\n const mainCurrency = campaign.prize_pools[0].currency;\n\n // Only sum rewards from pools with the same currency to avoid mixing different currencies\n for (const pool of campaign.prize_pools) {\n totalEstimatedReward += findRewardInPool(userdata, pool);\n }\n\n return totalEstimatedReward > 0\n ? { amount: totalEstimatedReward, currency: mainCurrency }\n : null;\n}\n\n/**\n * Calculate estimated tickets earned based on user's trading performance\n * @param userdata User's current trading data\n * @param ticketRules Ticket configuration rules\n * @returns Estimated number of tickets\n */\nexport function calculateEstimatedTickets(\n userdata: UserData,\n ticketRules: TicketRules,\n): number {\n const userMetricValue =\n ticketRules.metric === \"volume\" ? userdata.volume : userdata.pnl;\n\n if (!userMetricValue) return 0;\n\n if (userMetricValue <= 0) return 0;\n\n if (ticketRules.mode === \"tiered\") {\n return calculateTieredTickets(userMetricValue, ticketRules.tiers || []);\n } else if (ticketRules.mode === \"linear\") {\n return calculateLinearTickets(userMetricValue, ticketRules.linear);\n }\n\n return 0;\n}\n\n/**\n * Calculate tickets using tiered mode\n * ≥ 25,000 volume → 10 tickets\n * ≥ 10,000 and < 25,000 → 5 tickets\n * ≥ 5,000 and < 10,000 → 1 ticket\n * < 5,000 → 0 tickets\n */\nfunction calculateTieredTickets(\n metricValue: number,\n tiers: TicketTierRule[],\n): number {\n // Sort tiers by value in descending order\n const sortedTiers = [...tiers].sort((a, b) => b.value - a.value);\n\n for (const tier of sortedTiers) {\n if (metricValue >= tier.value) {\n return tier.tickets;\n }\n }\n\n return 0;\n}\n\n/**\n * Calculate tickets using linear mode\n * Get X ticket for every Y volume/pnl\n */\nfunction calculateLinearTickets(\n metricValue: number,\n linearRule?: TicketLinearRule,\n): number {\n if (!linearRule || linearRule.every <= 0) return 0;\n\n const multiplier = Math.floor(metricValue / linearRule.every);\n return multiplier * linearRule.tickets;\n}\n\n/**\n * Format reward amount with currency for display\n */\nexport function formatRewardAmount(amount: number, currency: string): string {\n return `${amount.toLocaleString()} ${currency}`;\n}\n\n/**\n * Format ticket count for display\n */\nexport function formatTicketCount(tickets: number): string {\n return tickets.toLocaleString();\n}\n\n/**\n * Calculate user's estimated reward for a specific prize pool\n * @param userdata User's current trading data\n * @param pool Specific prize pool\n * @returns Estimated reward amount for this pool, or 0 if not eligible\n */\nexport function calculateUserPoolReward(\n userdata: UserData,\n pool: PrizePool,\n): number {\n return findRewardInPool(userdata, pool);\n}\n\n/**\n * Calculate progress percentage and next tier requirements for tickets\n * @param userdata User's current trading data\n * @param ticketRules Ticket configuration rules\n * @returns Object containing progress percentage and next tier requirements\n */\nexport function calculateTicketProgress(\n userdata: UserData,\n ticketRules: TicketRules,\n): { percent: number; value: number; atMax?: boolean } | null {\n if (!userdata || !ticketRules) return null;\n\n const userMetricValue = getUserMetricValue(userdata, ticketRules.metric);\n\n if (!userMetricValue) {\n if (ticketRules.mode === \"linear\") {\n return {\n percent: 0,\n value: ticketRules.linear?.every || 0,\n };\n } else {\n return {\n percent: 0,\n value: ticketRules.tiers?.[0]?.value || 0,\n };\n }\n }\n\n if (ticketRules.mode === \"linear\") {\n if (!ticketRules.linear) return null;\n\n const { every, tickets } = ticketRules.linear;\n const currentTier = Math.floor(userMetricValue / every);\n const nextTier = currentTier + 1;\n const progress = ((userMetricValue % every) / every) * 100;\n const nextTierValue = nextTier * every;\n\n return {\n percent: progress,\n value: nextTierValue - userMetricValue,\n };\n }\n\n if (ticketRules.mode === \"tiered\" && ticketRules.tiers) {\n const sortedTiers = [...ticketRules.tiers].sort(\n (a, b) => a.value - b.value,\n );\n\n // Check if tiers array is empty\n if (sortedTiers.length === 0) {\n return null;\n }\n\n // Special case: if user metric value is 0 or negative, show progress to first tier\n if (userMetricValue <= 0) {\n return {\n percent: 0,\n value: sortedTiers[0].value,\n };\n }\n\n // Find current tier and next tier\n let currentTier = null;\n let nextTier = sortedTiers[0]; // Default next tier is the first one\n\n for (let i = 0; i < sortedTiers.length; i++) {\n if (userMetricValue >= sortedTiers[i].value) {\n currentTier = sortedTiers[i];\n nextTier = sortedTiers[i + 1] || null; // Next tier or null if at max\n } else {\n // User hasn't reached this tier yet, so this is the next tier\n nextTier = sortedTiers[i];\n break;\n }\n }\n\n if (!nextTier) {\n return {\n percent: 100,\n value: 0,\n atMax: true,\n };\n }\n\n // If user hasn't reached any tier yet, calculate progress to first tier\n if (!currentTier) {\n const progress = (userMetricValue / nextTier.value) * 100;\n return {\n percent: progress,\n value: nextTier.value - userMetricValue,\n };\n }\n\n const progress =\n ((userMetricValue - currentTier.value) /\n (nextTier.value - currentTier.value)) *\n 100;\n\n return {\n percent: progress,\n value: nextTier.value - userMetricValue,\n };\n }\n\n return null;\n}\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 parseTimeRange,\n} from \"../../../utils\";\n\nexport type GeneralLeaderboardScriptReturn = ReturnType<\n typeof useGeneralLeaderboardScript\n>;\n\nexport const FilterDays = [1, 7, 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 timeRange?: {\n from?: string | Date;\n to?: string | Date | \"now\";\n };\n};\n\nexport function useGeneralLeaderboardScript(\n options?: GeneralLeaderboardScriptOptions,\n) {\n const { campaignDateRange, timeRange } = 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 parsedTimeRange = useMemo(() => {\n return parseTimeRange(timeRange);\n }, [timeRange]);\n\n const [activeTab, setActiveTab] = useState<LeaderboardTab>(\n LeaderboardTab.Volume,\n );\n const filterState = useFilter({\n defaultRange: currentOrAllTimeRange,\n customTimeRange: parsedTimeRange,\n });\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({\n defaultRange,\n customTimeRange,\n}: {\n defaultRange?: DateRange;\n customTimeRange?: DateRange | null;\n}) {\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 // For 1D, we want yesterday + today, so we pass 2 to getDateRange\n const daysToFetch = day === 1 ? 2 : day;\n setDateRange(getDateRange(daysToFetch));\n };\n\n useEffect(() => {\n // Use customTimeRange if provided, otherwise fall back to defaultRange or 90 days\n const rangeToUse = customTimeRange || defaultRange || getDateRange(90);\n setDateRange(rangeToUse);\n\n // Only reset filterDay if a custom timeRange is actually provided\n if (customTimeRange && rangeToUse?.from && rangeToUse?.to) {\n const offsetDay =\n Math.abs(differenceInDays(rangeToUse.from, rangeToUse.to)) + 1;\n if (FilterDays.includes(offsetDay as TFilterDays)) {\n setFilterDay(offsetDay as TFilterDays);\n } else {\n setFilterDay(null);\n }\n }\n // If no custom timeRange, keep the current filterDay (which defaults to 90)\n }, [defaultRange, customTimeRange]);\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","export type DateRange = {\n from?: Date;\n to?: Date;\n label?: string;\n};\n\nexport enum LeaderboardTab {\n Volume = \"volume\",\n Pnl = \"pnl\",\n Points = \"points\",\n}\n","import { FC, useMemo, lazy, Suspense } from \"react\";\nimport { cn, Box, useScreen, Divider } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTab } from \"../../../type\";\nimport { BrokerStatsWidget } from \"../../brokerStats/brokerStats.ui\";\nimport { RankingColumnFields } from \"../../ranking/shared/column\";\nimport { LeaderboardFilter } from \"../shared/LeaderboardFilter\";\nimport { LeaderboardTabs } from \"../shared/LeaderboardTabs\";\nimport { GeneralLeaderboardScriptReturn } from \"./generalLeaderboard.script\";\n\n// Lazy load GeneralRankingWidget to avoid SSR issues with OrderlyProvider hooks\nconst GeneralRankingWidget = lazy(() =>\n import(\"../../ranking/generalRanking\").then((mod) => ({\n default: mod.GeneralRankingWidget,\n })),\n);\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 leaderboardEndpoint?: string;\n timeRange?: {\n from?: string | Date;\n to?: string | Date | \"now\";\n };\n} & GeneralLeaderboardScriptReturn;\n\nexport const GeneralLeaderboard: FC<GeneralLeaderboardProps> = (props) => {\n const { isMobile } = useScreen();\n\n const fields = useMemo<RankingColumnFields[]>(() => {\n if (isMobile) {\n if (props.activeTab === LeaderboardTab.Points) {\n return [\"rank\", \"address\", \"points\"];\n }\n return [\n \"rank\",\n \"address\",\n props.activeTab === LeaderboardTab.Volume ? \"volume\" : \"pnl\",\n ];\n }\n const baseFields: RankingColumnFields[] = [\n \"rank\",\n \"address\",\n \"volume\",\n \"pnl\",\n ];\n if (props.leaderboardEndpoint) {\n baseFields.push(\"points\");\n }\n return baseFields;\n }, [isMobile, props.activeTab, props.leaderboardEndpoint]);\n\n if (isMobile) {\n return (\n <>\n <BrokerStatsWidget dateRange={props.dateRange} />\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 <LeaderboardFilter {...props} />\n <LeaderboardTabs\n isMobile={isMobile}\n className=\"oui-pt-0\"\n activeTab={props.activeTab}\n onTabChange={props.onTabChange}\n leaderboardEndpoint={props.leaderboardEndpoint}\n />\n\n <Suspense fallback={null}>\n <GeneralRankingWidget\n dateRange={props.dateRange}\n address={props.searchValue}\n sortKey={\n props.activeTab === LeaderboardTab.Volume\n ? \"perp_volume\"\n : \"realized_pnl\"\n }\n fields={fields}\n leaderboardEndpoint={props.leaderboardEndpoint}\n />\n </Suspense>\n </Box>\n </>\n );\n }\n\n return (\n <>\n <BrokerStatsWidget dateRange={props.dateRange} />\n <Box\n pt={2}\n px={6}\n r=\"2xl\"\n intensity={900}\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 <LeaderboardFilter {...props} />\n <Divider intensity={8} />\n\n <Suspense fallback={null}>\n <GeneralRankingWidget\n dateRange={props.dateRange}\n address={props.searchValue}\n fields={fields}\n leaderboardEndpoint={props.leaderboardEndpoint}\n />\n </Suspense>\n </Box>\n </>\n );\n};\n","import { FC, SVGProps } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n CloseCircleFillIcon,\n cn,\n DataFilter,\n Flex,\n Input,\n Text,\n useScreen,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ScrollIndicator } from \"@kodiak-finance/orderly-ui\";\nimport {\n FilterDays,\n GeneralLeaderboardScriptReturn,\n} from \"../generalLeaderboard/generalLeaderboard.script\";\n\nexport type LeaderboardFilterProps = GeneralLeaderboardScriptReturn;\n\nexport const LeaderboardFilter: FC<LeaderboardFilterProps> = (props) => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const { useCampaignDateRange, weeklyRanges, setDateRange } = props;\n\n const weeklyView = (\n <Flex gap={3} className={cn(isMobile ? \"oui-h-[24px]\" : \"oui-h-[53px]\")}>\n {weeklyRanges.map((range) => (\n <button\n className=\"oui-relative oui-w-fit oui-whitespace-nowrap oui-px-2 oui-py-[2px] oui-text-sm oui-bg-base-4\"\n key={range.label}\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={\n props.dateRange?.label === range.label ? \"brand\" : undefined\n }\n className={\n props.dateRange?.label !== range.label\n ? \"oui-text-base-contrast-54\"\n : \"\"\n }\n >\n {`${range.label}`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-absolute oui-inset-0 oui-rounded oui-opacity-[.12] oui-gradient-primary\"\n onClick={() => {\n setDateRange(range);\n }}\n ></div>\n </button>\n ))}\n </Flex>\n );\n\n const input = (\n <Input\n value={props.searchValue}\n onValueChange={props.onSearchValueChange}\n placeholder={t(\"common.address.search.placeholder\")}\n className={cn(\n \"oui-trading-leaderboard-trading-search-input\",\n \"oui-w-full\",\n )}\n size=\"sm\"\n prefix={\n <Box pl={3} pr={1}>\n <SearchIcon className=\"oui-text-base-contrast-36\" />\n </Box>\n }\n suffix={\n props.searchValue && (\n <Box mr={2}>\n <CloseCircleFillIcon\n size={14}\n className=\"oui-cursor-pointer oui-text-base-contrast-36\"\n onClick={props.clearSearchValue}\n />\n </Box>\n )\n }\n autoComplete=\"off\"\n />\n );\n\n const dateRangeView = props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[53px] oui-border-none\"\n />\n );\n\n const filterDayView = FilterDays.map((value) => {\n return (\n <button\n className={`oui-px-3 oui-py-1 oui-rounded oui-text-xs oui-font-medium oui-transition-colors ${\n props.filterDay === value\n ? \"oui-bg-primary oui-text-white\"\n : \"oui-bg-base-6 oui-text-base-contrast-60 hover:oui-bg-base-4 hover:oui-text-base-contrast\"\n }`}\n key={value}\n onClick={() => {\n props.updateFilterDay(value as any);\n }}\n >\n {`${value}D`}\n </button>\n );\n });\n\n if (isMobile) {\n return (\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n direction=\"column\"\n mt={3}\n className={cn(\"oui-mobile-trading-leaderboard-ranking-filter\")}\n >\n {input}\n\n {useCampaignDateRange ? (\n <Flex gap={3} className=\"oui-w-full oui-py-3\">\n <ScrollIndicator className=\"oui-w-full\">\n {weeklyView}\n </ScrollIndicator>\n </Flex>\n ) : (\n <Flex gap={3} className=\"oui-w-full\">\n {dateRangeView}\n <ScrollIndicator className=\"oui-w-full\">\n <Flex gap={3}>{filterDayView}</Flex>\n </ScrollIndicator>\n </Flex>\n )}\n </Flex>\n );\n }\n\n return (\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n className={cn(\"oui-trading-leaderboard-ranking-filter\")}\n >\n <Flex gap={2}>\n {useCampaignDateRange && weeklyView}\n {!useCampaignDateRange && dateRangeView}\n {!useCampaignDateRange && filterDayView}\n </Flex>\n <Box width={240}>{input}</Box>\n </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { FC, useEffect, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Flex, TabPanel, Tabs } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTab } from \"../../../type\";\nimport { formatUpdateDate } from \"../../../utils\";\nimport { useTradingLeaderboardContext } from \"../../provider\";\n\ntype LeaderboardTabsProps = {\n isMobile?: boolean;\n className?: string;\n activeTab: LeaderboardTab;\n onTabChange: (tab: LeaderboardTab) => void;\n leaderboardEndpoint?: string;\n};\n\nexport const LeaderboardTabs: FC<LeaderboardTabsProps> = (props) => {\n const { t } = useTranslation();\n const { updatedTime, currentCampaign } = useTradingLeaderboardContext();\n\n const updateTime = useMemo(() => {\n if (updatedTime && currentCampaign) {\n return formatUpdateDate(updatedTime);\n }\n return \"\";\n }, [props.isMobile, updatedTime, currentCampaign]);\n\n const { showVolume, showPnl, showPoints } = useMemo(() => {\n const metrics = currentCampaign?.prize_pools?.map((item) => item.metric);\n const isMobileGeneral = props.isMobile && !currentCampaign;\n const showVolume = isMobileGeneral\n ? true\n : metrics?.includes(LeaderboardTab.Volume);\n const showPnl = isMobileGeneral\n ? true\n : metrics?.includes(LeaderboardTab.Pnl);\n const showPoints = !!props.leaderboardEndpoint;\n\n return {\n showVolume,\n showPnl,\n showPoints,\n };\n }, [\n currentCampaign,\n props.activeTab,\n props.isMobile,\n props.leaderboardEndpoint,\n ]);\n\n useEffect(() => {\n // set default tab\n if (showVolume && showPnl) {\n props.onTabChange(LeaderboardTab.Volume);\n } else if (showVolume) {\n props.onTabChange(LeaderboardTab.Volume);\n } else if (showPnl) {\n props.onTabChange(LeaderboardTab.Pnl);\n } else if (showPoints) {\n props.onTabChange(LeaderboardTab.Points);\n }\n }, [currentCampaign, showVolume, showPnl, showPoints]);\n\n const renderTabs = () => {\n const hasAnyTab = showVolume || showPnl || showPoints;\n\n if (!hasAnyTab) {\n return <div></div>;\n }\n\n return (\n <Tabs\n value={props.activeTab}\n onValueChange={props.onTabChange as (tab: string) => void}\n variant=\"contained\"\n size=\"lg\"\n key={currentCampaign?.campaign_id}\n >\n {showVolume && (\n <TabPanel\n title={t(\"tradingLeaderboard.tradingVolume\")}\n value={LeaderboardTab.Volume}\n ></TabPanel>\n )}\n {showPnl && (\n <TabPanel\n title={t(\"common.realizedPnl\")}\n value={LeaderboardTab.Pnl}\n ></TabPanel>\n )}\n {showPoints && (\n <TabPanel\n title={t(\"tradingLeaderboard.points\")}\n value={LeaderboardTab.Points}\n ></TabPanel>\n )}\n </Tabs>\n );\n };\n\n return (\n <Flex\n width=\"100%\"\n py={3}\n justify=\"between\"\n className={cn(\n \"oui-trading-leaderboard-ranking-tabs\",\n \"oui-border-b oui-border-line\",\n props.className,\n )}\n >\n {renderTabs()}\n {/* <Tabs\n value={props.activeTab}\n onValueChange={props.onTabChange as (tab: string) => void}\n variant=\"contained\"\n size=\"lg\"\n >\n <TabPanel\n title=\"Trading volume\"\n value={LeaderboardTab.Volume}\n ></TabPanel>\n <TabPanel title=\"Realized PnL\" value={LeaderboardTab.Pnl}></TabPanel>\n </Tabs> */}\n {updateTime && (\n <Flex\n itemAlign=\"start\"\n direction={props.isMobile ? \"column\" : \"row\"}\n gap={1}\n className={cn(\n props.isMobile ? \"oui-text-3xs\" : \"oui-text-sm\",\n \"oui-text-base-contrast-36\",\n )}\n >\n <span>{t(\"tradingLeaderboard.lastUpdate\")}:</span>\n <span>{updateTime}</span>\n </Flex>\n )}\n </Flex>\n );\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\"\n | \"className\"\n | \"campaignDateRange\"\n | \"leaderboardEndpoint\"\n | \"timeRange\"\n>;\n\nexport const GeneralLeaderboardWidget: FC<GeneralLeaderboardWidgetProps> = (\n props,\n) => {\n const state = useGeneralLeaderboardScript({\n campaignDateRange: props.campaignDateRange,\n timeRange: props.timeRange,\n });\n\n return (\n <GeneralLeaderboard\n {...state}\n className={props.className}\n style={props.style}\n leaderboardEndpoint={props.leaderboardEndpoint}\n timeRange={props.timeRange}\n />\n );\n};\n","import { useMemo, useState } from \"react\";\nimport { LeaderboardTab } from \"../../../type\";\nimport { useTradingLeaderboardContext } from \"../../provider\";\n\nexport type CampaignLeaderboardScriptReturn = ReturnType<\n typeof useCampaignLeaderboardScript\n>;\n\nexport function useCampaignLeaderboardScript() {\n const [activeTab, setActiveTab] = useState<LeaderboardTab>(\n LeaderboardTab.Volume,\n );\n const { currentCampaign } = useTradingLeaderboardContext();\n\n const excludeColumns = useMemo(() => {\n return (\n currentCampaign?.leaderboard_config?.exclude_leaderboard_columns || []\n );\n }, [currentCampaign]);\n\n return {\n activeTab,\n onTabChange: setActiveTab,\n excludeColumns,\n };\n}\n","import { FC, useMemo } from \"react\";\nimport { difference } from \"ramda\";\nimport { cn, Box, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTab } from \"../../../type\";\nimport { CampaignRankingWidget } from \"../../ranking/campaignRanking\";\nimport { RankingColumnFields } from \"../../ranking/shared/column\";\nimport { LeaderboardTabs } from \"../shared/LeaderboardTabs\";\nimport { CampaignLeaderboardScriptReturn } from \"./campaignLeaderboard.script\";\n\nexport type CampaignLeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n campaignId: number | string;\n} & CampaignLeaderboardScriptReturn;\n\nexport const CampaignLeaderboard: FC<CampaignLeaderboardProps> = (props) => {\n const { isMobile } = useScreen();\n\n const sortKey = useMemo(() => {\n return props.activeTab === LeaderboardTab.Volume ? \"volume\" : \"pnl\";\n }, [props.activeTab]);\n\n const fields = useMemo<RankingColumnFields[]>(() => {\n const allFields: RankingColumnFields[] = [\n \"rank\",\n \"address\",\n sortKey,\n \"rewards\",\n ];\n return difference(allFields, props.excludeColumns || []);\n }, [isMobile, sortKey, props.excludeColumns]);\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-campaign-leaderboard oui-relative\",\n )}\n >\n <LeaderboardTabs\n isMobile={isMobile}\n activeTab={props.activeTab}\n onTabChange={props.onTabChange}\n />\n\n <CampaignRankingWidget\n campaignId={props.campaignId}\n fields={fields}\n sortKey={sortKey}\n />\n </Box>\n );\n }\n\n return (\n <Box\n pt={2}\n px={6}\n r=\"2xl\"\n intensity={900}\n className={cn(\n \"oui-trading-leaderboard-campaign-leaderboard oui-relative\",\n \"oui-mx-auto oui-max-w-[992px]\",\n )}\n >\n <LeaderboardTabs\n isMobile={isMobile}\n activeTab={props.activeTab}\n onTabChange={props.onTabChange}\n />\n <CampaignRankingWidget\n campaignId={props.campaignId}\n fields={fields}\n sortKey={sortKey}\n />\n </Box>\n );\n};\n","import { FC } from \"react\";\nimport { useCampaignLeaderboardScript } from \"./campaignLeaderboard.script\";\nimport {\n CampaignLeaderboard,\n CampaignLeaderboardProps,\n} from \"./campaignLeaderboard.ui\";\n\nexport type CampaignLeaderboardWidgetProps = Pick<\n CampaignLeaderboardProps,\n \"style\" | \"className\" | \"campaignId\"\n>;\n\nexport const CampaignLeaderboardWidget: FC<CampaignLeaderboardWidgetProps> = (\n props,\n) => {\n const state = useCampaignLeaderboardScript();\n\n return (\n <CampaignLeaderboard\n {...state}\n className={props.className}\n style={props.style}\n campaignId={props.campaignId}\n />\n );\n};\n","import { FC, ReactNode, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Box, cn, Flex, Text, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardBackground } from \"../../components/background\";\nimport { BrokerStatsWidget } from \"../../components/brokerStats/brokerStats.ui\";\nimport { CampaignsWidget } from \"../../components/campaigns/campaigns.widget\";\nimport { GeneralLeaderboardIWidget } from \"../../components/leaderboard128/generalLeaderboard\";\nimport { CampaignLeaderboardWidget } from \"../../components/leaderboard/campaignLeaderboard\";\nimport {\n GeneralLeaderboard,\n GeneralLeaderboardWidgetProps,\n} from \"../../components/leaderboard/generalLeaderboard\";\nimport { useGeneralLeaderboardScript } from \"../../components/leaderboard/generalLeaderboard/generalLeaderboard.script\";\nimport {\n TradingLeaderboardProvider,\n TradingLeaderboardProviderProps,\n useTradingLeaderboardContext,\n} from \"../../components/provider\";\nimport { RewardsWidget } from \"../../components/rewards/rewards.widget\";\nimport { RuleWidget } from \"../../components/rule\";\n\nexport type LeaderboardPageProps = GeneralLeaderboardWidgetProps &\n TradingLeaderboardProviderProps & {\n style?: React.CSSProperties;\n className?: string;\n hideCampaignsBanner?: boolean;\n };\n\nexport const LeaderboardPage: FC<LeaderboardPageProps> = (props) => {\n const { hideCampaignsBanner, ...rest } = props;\n return (\n <TradingLeaderboardProvider {...rest}>\n <div\n style={{\n paddingBottom: \"calc(64px + env(safe-area-inset-bottom))\",\n }}\n className={cn(\n \"oui-trading-leaderboard-page\",\n \"oui-relative oui-bg-base-10\",\n \"oui-font-semibold\",\n props.className,\n )}\n >\n <CampaignsWidget\n hideCampaignsBanner={hideCampaignsBanner}\n className=\"oui-relative oui-z-[1] oui-mx-6\"\n />\n <RewardsWidget />\n <LeaderboardSection {...props} />\n <RuleWidget />\n </div>\n </TradingLeaderboardProvider>\n );\n};\n\ntype LeaderboardSectionProps = {\n style?: React.CSSProperties;\n className?: string;\n};\n\nexport const LeaderboardSection: FC<LeaderboardSectionProps> = (props) => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const {\n currentCampaignId,\n currentCampaign,\n backgroundSrc,\n campaignDateRange,\n timeRange,\n } = useTradingLeaderboardContext();\n\n // Lift the hook to page level so both widgets share the same dateRange state\n const leaderboardScript = useGeneralLeaderboardScript({\n campaignDateRange,\n timeRange,\n });\n\n // Memoize dateRange to prevent unnecessary re-renders in BrokerStatsWidget\n const memoizedDateRange = useMemo(\n () => leaderboardScript.dateRange,\n [leaderboardScript.dateRange?.from, leaderboardScript.dateRange?.to],\n );\n\n if (currentCampaignId === \"general\") {\n return (\n <Box px={3} className={cn(\"oui-mix-blend-screen\")}>\n <LeaderboardBackground backgroundSrc={backgroundSrc} />\n <BrokerStatsWidget dateRange={memoizedDateRange} />\n <GeneralLeaderboard\n {...leaderboardScript}\n // className=\"oui-mt-10\"\n timeRange={timeRange}\n />\n </Box>\n );\n }\n\n if (currentCampaign?.leaderboard_config?.use_general_leaderboard) {\n return (\n <Box px={3}>\n <BrokerStatsWidget dateRange={memoizedDateRange} />\n <LeaderboardTitle\n title={t(\"tradingLeaderboard.arena\")}\n isMobile={isMobile}\n />\n <GeneralLeaderboardIWidget\n {...props}\n // className=\"oui-mt-10\"\n campaignDateRange={campaignDateRange}\n timeRange={timeRange}\n weekOneAddresses={\n currentCampaign?.leaderboard_config?.week_one_addresses\n }\n />\n </Box>\n );\n }\n\n if (\n currentCampaign &&\n !currentCampaign.hide_arena &&\n currentCampaignId != \"general\"\n ) {\n return (\n <Box px={3}>\n <BrokerStatsWidget dateRange={memoizedDateRange} />\n <LeaderboardTitle\n title={t(\"tradingLeaderboard.arena\")}\n isMobile={isMobile}\n />\n <CampaignLeaderboardWidget {...props} campaignId={currentCampaignId} />\n </Box>\n );\n }\n\n return null;\n};\n\nexport const LeaderboardTitle = (props: {\n title: ReactNode;\n isMobile?: boolean;\n}) => {\n return (\n <Flex\n mb={props.isMobile ? 3 : 6}\n gapY={1}\n justify=\"center\"\n direction=\"column\"\n >\n <Text\n className={cn(\n \"oui-trading-leaderboard-title oui-font-bold\",\n props.isMobile\n ? \"oui-text-[20px] oui-leading-[24px]\"\n : \"oui-text-[32px] oui-leading-[44px]\",\n )}\n >\n {props.title}\n </Text>\n <Box\n width={24}\n height={6}\n r=\"base\"\n className=\"oui-bg-[linear-gradient(270deg,rgb(var(--oui-gradient-brand-start))_0%,rgb(var(--oui-gradient-brand-end))_100%)]\"\n />\n </Flex>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { cn, useScreen } from \"@kodiak-finance/orderly-ui\";\n\ntype BackgroundProps = {\n backgroundSrc?: string;\n};\n\nexport const LeaderboardBackground: FC<BackgroundProps> = (props) => {\n const { isMobile } = useScreen();\n\n const isVideo = useMemo(() => {\n return isVideoSrc(props.backgroundSrc);\n }, [props.backgroundSrc]);\n\n if (isMobile) {\n return null;\n }\n\n const linearGradient =\n \"linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)\";\n\n if (isVideo) {\n return (\n <div className={cn(\"oui-absolute oui-left-0 oui-top-0\", \"oui-size-full\")}>\n <div\n style={{\n backgroundImage: linearGradient,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\"oui-absolute oui-left-0 oui-top-0\", \"oui-size-full\")}\n />\n <video\n autoPlay\n loop\n muted\n className={cn(\n // rest style\n \"oui-border-none oui-bg-transparent oui-outline-none\",\n \"oui-size-full\",\n // \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-object-cover\",\n \"oui-opacity-50\",\n )}\n >\n <source src={props.backgroundSrc} type=\"video/mp4\" />\n <source src={props.backgroundSrc} type=\"video/webm\" />\n <source src={props.backgroundSrc} type=\"video/ogg\" />\n <source src={props.backgroundSrc} type=\"video/avi\" />\n Your browser does not support the video tag.\n </video>\n </div>\n );\n }\n\n if (props.backgroundSrc) {\n return (\n <div\n style={{\n backgroundImage: `${linearGradient}, url(${props.backgroundSrc}) `,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-general-leaderboard-background\",\n \"oui-absolute oui-left-0 oui-top-0 oui-z-[-1]\",\n \"oui-size-full\",\n \"oui-opacity-50\",\n )}\n />\n );\n }\n};\n\nfunction isVideoSrc(src?: string) {\n const extension = src?.split(\".\").pop();\n return [\"mp4\", \"webm\", \"avi\", \"ogg\"].includes(extension ?? \"\");\n}\n","import { FC, useMemo } from \"react\";\nimport { cn, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useCanTrade } from \"../../hooks/useCanTrade\";\nimport { CampaignsContentDesktopUI } from \"./campaigns.content.desktop.ui\";\nimport { useCampaignsScript } from \"./campaigns.script\";\nimport { CampaignsTimeDesktopUI } from \"./components/time.desktop.ui\";\nimport { CampaignsHeaderWidget } from \"./header\";\n\nexport type CampaignsWidgetProps = {\n className?: string;\n style?: React.CSSProperties;\n hideCampaignsBanner?: boolean;\n};\n\nexport const CampaignsWidget: FC<CampaignsWidgetProps> = (props) => {\n const state = useCampaignsScript();\n const { isMobile } = useScreen();\n\n const canTrade = useCanTrade();\n\n const emphasisConfig = state.currentCampaign?.emphasisConfig;\n\n const contentClassNames = useMemo(() => {\n if (emphasisConfig?.subtitle) {\n return {\n container: !canTrade\n ? \"!oui-h-[680px] lg:!oui-h-[700px]\"\n : \"!oui-h-[600px] lg:!oui-h-[700px]\",\n topContainer: \"!oui-w-[90%]\",\n };\n }\n\n if (!isMobile) return undefined;\n return {\n container: cn(\"oui-h-[400px] oui-gap-5\"),\n time: \"oui-text-sm oui-h-5\",\n title: \"oui-text-[24px] oui-leading-[32px]\",\n description: \"oui-text-2xs oui-leading-[15px]\",\n topContainer: cn(\"oui-w-[284px] oui-gap-1\"),\n };\n }, [isMobile, emphasisConfig, canTrade]);\n\n return (\n <div\n className={cn([\"oui-relative oui-z-[1] oui-overflow-hidden\"])}\n style={props.style}\n >\n {!props.hideCampaignsBanner && (\n <CampaignsHeaderWidget\n backgroundSrc={state.backgroundSrc}\n campaigns={state.campaigns}\n currentCampaignId={state.currentCampaignId.toString()}\n onCampaignChange={state.onCampaignChange}\n />\n )}\n {state.currentCampaign && (\n <CampaignsContentDesktopUI\n {...state}\n classNames={contentClassNames}\n isMobile={isMobile}\n campaign={state.currentCampaign}\n />\n )}\n {state.currentCampaign && (\n <CampaignsTimeDesktopUI\n campaign={state.currentCampaign}\n isMobile={isMobile}\n />\n )}\n </div>\n );\n};\n","import { useMemo } from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\n\nexport function useCanTrade() {\n const { state } = useAccount();\n\n const { wrongNetwork, disabledConnect } = useAppContext();\n\n const canTrade = useMemo(() => {\n return (\n !wrongNetwork &&\n !disabledConnect &&\n (state.status === AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected)\n );\n }, [state.status, wrongNetwork, disabledConnect]);\n\n return canTrade;\n}\n","import { FC, useMemo, useState } from \"react\";\nimport { cn, Flex, Text } from \"@kodiak-finance/orderly-ui\";\nimport { CampaignsScriptReturn } from \"./campaigns.script\";\nimport { NormalPricePoolUI } from \"./pricePool/normalPricePool.ui\";\nimport { PricePoolWidget } from \"./pricePool/pricePool.widget\";\nimport { CampaignConfig } from \"./type\";\nimport {\n formatCampaignDateRange,\n getTradingVolume,\n getTicketPrizePool,\n} from \"./utils\";\n\ntype CampaignsContentDesktopUIProps = Partial<CampaignsScriptReturn> & {\n classNames?: {\n container?: string;\n title?: string;\n description?: string;\n time?: string;\n topContainer?: string;\n descriptionContainer?: string;\n };\n isMobile?: boolean;\n campaign: CampaignConfig;\n};\nexport const CampaignsContentDesktopUI: FC<CampaignsContentDesktopUIProps> = ({\n campaign,\n statistics,\n onLearnMore,\n onTradeNow,\n backgroundSrc,\n classNames,\n isMobile,\n shouldShowJoinButton,\n joinCampaign,\n isJoining,\n canTrade,\n totalPrizePool,\n}) => {\n const bgSrc = campaign?.image || backgroundSrc;\n const dateRange = formatCampaignDateRange(\n campaign?.start_time || \"\",\n campaign?.end_time || \"\",\n );\n // for mobile\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n const tooltipProps = useMemo(() => {\n if (!isMobile) {\n return {};\n }\n return {\n open: tooltipOpen,\n onOpenChange: setTooltipOpen,\n };\n }, [tooltipOpen, isMobile, setTooltipOpen]);\n\n // Get campaign data using utility functions\n const tradingVolume = getTradingVolume(statistics);\n const ticketPrizePool = getTicketPrizePool(campaign);\n\n const showTradeButton = useMemo(() => {\n return (\n !shouldShowJoinButton && new Date().toISOString() < campaign.end_time\n );\n }, [shouldShowJoinButton, campaign.end_time]);\n\n const isCampaignStarted = useMemo(() => {\n return campaign.start_time < new Date().toISOString();\n }, [campaign]);\n\n const highlightPool = useMemo(() => {\n if (!campaign?.highlight_pool_id) {\n return null;\n }\n return campaign?.prize_pools?.find(\n (pool) => pool.pool_id === campaign.highlight_pool_id,\n );\n }, [campaign]);\n\n const showTieredPricePool = useMemo(() => {\n return (\n campaign?.tiered_prize_pools && campaign?.tiered_prize_pools.length > 0\n );\n }, [campaign]);\n\n const renderContent = () => {\n if (campaign?.emphasisConfig) {\n return (\n <Flex\n id=\"oui-trading-leaderboard-emphasis-campaign-content\"\n direction=\"column\"\n itemAlign=\"center\"\n className=\"oui-gap-y-1 lg:oui-gap-y-2\"\n >\n <Text\n className={cn([\n \"oui-trading-leaderboard-title oui-text-[56px]oui-font-bold oui-text-center oui-text-base-contrast\",\n \"oui-text-[32px] oui-leading-[32px] lg:oui-text-[56px] lg:oui-leading-[56px]\",\n ])}\n >\n {campaign?.title}\n </Text>\n <Text.gradient\n color=\"brand\"\n className={cn([\n \"oui-text-center oui-font-bold\",\n \"oui-text-[28px] oui-leading-[36px] lg:oui-text-[48px] lg:oui-leading-[56px]\",\n \"oui-w-[85%] lg:oui-w-full\",\n ])}\n >\n {campaign?.emphasisConfig?.subtitle}\n </Text.gradient>\n <Text\n className={cn([\n \"oui-text-center oui-font-semibold oui-text-base-contrast-80\",\n \"oui-text-[16px] oui-leading-[24px] lg:oui-text-[24px] lg:oui-leading-[32px]\",\n ])}\n >\n {campaign?.description}\n </Text>\n </Flex>\n );\n }\n return (\n <>\n <Text\n className={cn([\n \"oui-trading-leaderboard-title oui-text-center oui-text-[48px] oui-font-bold oui-leading-[56px] oui-text-base-contrast\",\n classNames?.title,\n ])}\n >\n {campaign.title}\n </Text>\n <div\n className={cn([\n \"oui-w-[342px] oui-text-center\",\n classNames?.descriptionContainer,\n ])}\n >\n <Text\n size=\"sm\"\n weight=\"semibold\"\n className={cn([\n \"oui-text-base-contrast-54\",\n classNames?.description,\n ])}\n >\n {campaign.description}\n </Text>\n </div>\n </>\n );\n };\n\n return (\n <div\n className={cn([\n \"oui-flex oui-h-[500px] oui-w-full oui-flex-col oui-items-center oui-justify-center oui-gap-10\",\n `oui-bg-cover oui-bg-center oui-bg-no-repeat`,\n campaign?.tiered_prize_pools?.length && !isMobile && \"oui-h-[634px]\",\n classNames?.container,\n ])}\n style={{\n backgroundImage: `linear-gradient(180deg, rgba(var(--oui-color-base-10) / 1) 0%, rgba(var(--oui-color-base-10) / 0.8) 15%, rgba(var(--oui-color-base-10) / 0.4) 40%, rgba(var(--oui-color-base-10) / 0.4) 60%, rgba(var(--oui-color-base-10) / 0.8) 85%, rgba(var(--oui-color-base-10) / 1) 100%), url(${bgSrc})`,\n }}\n >\n <div\n className={cn([\n \"oui-flex oui-flex-col oui-items-center oui-justify-center oui-gap-[10px]\",\n classNames?.topContainer,\n ])}\n >\n <Text\n size=\"sm\"\n weight=\"semibold\"\n className={cn([\"oui-text-base-contrast-54\", classNames?.time])}\n >\n {dateRange}\n </Text>\n {renderContent()}\n </div>\n {showTieredPricePool ? (\n <PricePoolWidget\n onLearnMore={onLearnMore as () => void}\n onTradeNow={onTradeNow as () => void}\n shouldShowJoinButton={shouldShowJoinButton as boolean}\n joinCampaign={\n joinCampaign as (data: {\n campaign_id: string | number;\n }) => Promise<any>\n }\n isJoining={isJoining as boolean}\n canTrade={canTrade as boolean}\n campaign={campaign}\n statistics={statistics}\n tradingVolume={tradingVolume}\n isMobile={isMobile as boolean}\n isCampaignStarted={isCampaignStarted}\n tooltipProps={tooltipProps}\n showTradeButton={showTradeButton}\n totalPrizePool={totalPrizePool as any}\n />\n ) : (\n <NormalPricePoolUI\n totalPrizePool={totalPrizePool}\n onLearnMore={onLearnMore}\n onTradeNow={onTradeNow}\n shouldShowJoinButton={shouldShowJoinButton}\n campaign={campaign}\n statistics={statistics}\n tradingVolume={tradingVolume}\n ticketPrizePool={ticketPrizePool as any}\n highlightPool={highlightPool as any}\n isMobile={isMobile as boolean}\n isCampaignStarted={isCampaignStarted}\n tooltipProps={tooltipProps}\n showTradeButton={showTradeButton}\n joinCampaign={\n joinCampaign as (data: {\n campaign_id: string | number;\n }) => Promise<any>\n }\n isJoining={isJoining as boolean}\n canTrade={canTrade as boolean}\n />\n )}\n </div>\n );\n};\n","import { FC, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n cn,\n Text,\n Tooltip,\n InfoCircleIcon,\n ChevronRightIcon,\n Button,\n} from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuard } from \"@kodiak-finance/orderly-ui-connector\";\nimport { CampaignsScriptReturn } from \"../campaigns.script\";\nimport { CampaignConfig } from \"../type\";\nimport { formatPrizeAmount } from \"../utils\";\n\ntype NormalPricePoolUIProps = Partial<CampaignsScriptReturn> & {\n isMobile: boolean;\n campaign: CampaignConfig;\n isCampaignStarted: boolean;\n ticketPrizePool?: { amount: number; currency: string };\n highlightPool?: { label: string; total_prize: number; currency: string };\n tradingVolume: number;\n tooltipProps: any;\n showTradeButton: boolean;\n};\n\nexport const NormalPricePoolUI: FC<NormalPricePoolUIProps> = ({\n totalPrizePool,\n ticketPrizePool,\n highlightPool,\n isMobile,\n isCampaignStarted,\n campaign,\n onLearnMore,\n onTradeNow,\n shouldShowJoinButton,\n joinCampaign,\n isJoining,\n canTrade,\n statistics,\n tradingVolume,\n tooltipProps,\n showTradeButton,\n}) => {\n const { t } = useTranslation();\n\n const tooltipContent = useMemo(() => {\n if (!campaign?.prize_pools) {\n return null;\n }\n\n return (\n <div className=\"oui-flex oui-min-w-[240px] oui-flex-col oui-gap-1\">\n {campaign?.prize_pools?.map((pool) => {\n return (\n <div\n key={pool.pool_id}\n className=\"oui-flex oui-h-[18px] oui-items-center oui-justify-between\"\n >\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast-54\"\n >\n {pool.label}\n </Text>\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <Text.numeral\n dp={2}\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast\"\n >\n {pool.total_prize}\n </Text.numeral>\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast\"\n >\n {pool.currency}\n </Text>\n </div>\n </div>\n );\n })}\n </div>\n );\n }, [campaign]);\n return (\n <div className=\"oui-overflow-hidden oui-rounded-2xl oui-border oui-border-solid oui-border-base-contrast/[0.08]\">\n <div\n className={cn([\n \"oui-flex oui-items-center oui-gap-4 oui-px-4 oui-py-3 oui-backdrop-blur-[10px]\",\n isCampaignStarted ? \"\" : \"oui-hidden\",\n ])}\n >\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast-54\"\n >\n {campaign?.user_account_label ||\n t(\"tradingLeaderboard.participants\")}\n </Text>\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast-80\"\n >\n {statistics?.total_participants}\n </Text>\n </div>\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast-54\"\n >\n {t(\"tradingLeaderboard.tradingVolume\")}\n </Text>\n <Text.numeral\n dp={2}\n currency=\"$\"\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast-80\"\n >\n {tradingVolume}\n </Text.numeral>\n </div>\n </div>\n <div\n className={cn([\n \"oui-rounded-2xl oui-border oui-border-solid oui-border-base-contrast/[0.08] oui-bg-primary/[0.08] oui-p-4 oui-backdrop-blur-[10px]\",\n \"oui-flex oui-flex-col oui-gap-4\",\n isCampaignStarted ? \"\" : \"oui-border-transparent\",\n ])}\n >\n <div className=\"oui-flex oui-items-center oui-gap-6\">\n <div className=\"oui-flex oui-flex-col\">\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <Text\n size={isMobile ? \"2xs\" : \"xs\"}\n weight=\"semibold\"\n className=\"oui-text-base-contrast-54\"\n >\n {/* {t(\"tradingLeaderboard.prizePool\")} */}\n {\"Total prize pool\"}\n </Text>\n <Tooltip\n // @ts-ignore\n content={tooltipContent}\n {...tooltipProps}\n className=\"oui-max-w-[260px] oui-bg-base-5 oui-px-2 oui-py-1\"\n >\n <div\n className=\"oui-flex oui-size-4 oui-items-center oui-justify-center\"\n onClick={() => tooltipProps.onOpenChange(true)}\n >\n <InfoCircleIcon className=\"oui-cursor-pointer\" />\n </div>\n </Tooltip>\n </div>\n <div>\n <Text.gradient\n weight=\"bold\"\n color=\"brand\"\n className={cn([\n \"oui-trading-leaderboard-title\",\n isMobile\n ? \"oui-text-[20px] oui-leading-[24px]\"\n : \"oui-text-[24px] oui-leading-[28px]\",\n ])}\n >\n {totalPrizePool\n ? formatPrizeAmount(\n totalPrizePool.amount,\n totalPrizePool.currency,\n )\n : \"0 USDC\"}\n </Text.gradient>\n </div>\n </div>\n {(ticketPrizePool || highlightPool) && (\n <div className=\"oui-flex oui-flex-col\">\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <Text\n size={isMobile ? \"2xs\" : \"xs\"}\n weight=\"semibold\"\n className=\"oui-text-base-contrast-54\"\n >\n {/* {t(\"tradingLeaderboard.ticketPrizePool\")} */}\n {highlightPool?.label || \"Raffle prize\"}\n </Text>\n </div>\n <div>\n <Text.gradient\n weight=\"bold\"\n color=\"brand\"\n className={cn([\n \"oui-trading-leaderboard-title\",\n isMobile\n ? \"oui-text-[20px] oui-leading-[24px]\"\n : \"oui-text-[24px] oui-leading-[28px]\",\n ])}\n >\n {formatPrizeAmount(\n ticketPrizePool?.amount || highlightPool?.total_prize || 0,\n ticketPrizePool?.currency ||\n highlightPool?.currency ||\n \"USDC\",\n )}\n </Text.gradient>\n </div>\n </div>\n )}\n </div>\n {isMobile && campaign?.rule_url && (\n <div\n className=\"-oui-mb-1 -oui-mt-2 oui-flex oui-items-center oui-gap-0.5 oui-text-2xs oui-leading-[15px] oui-text-base-contrast-36\"\n onClick={onLearnMore}\n >\n {t(\"tradingLeaderboard.viewRules\")}\n <ChevronRightIcon size={16} className=\"oui-text-base-contrast-36\" />\n </div>\n )}\n <div\n className={cn(\n \"oui-flex oui-gap-4\",\n campaign?.rule_url || canTrade ? \"\" : \"oui-hidden\",\n )}\n >\n {!isMobile && campaign?.rule_url && (\n <Button\n size=\"md\"\n variant=\"outlined\"\n className=\"oui-flex-1 \n oui-border-[rgb(var(--oui-gradient-brand-start))] \n oui-text-[rgb(var(--oui-gradient-brand-start))] \n hover:oui-bg-[rgb(var(--oui-gradient-brand-start))]/[0.08]\n active:oui-bg-[rgb(var(--oui-gradient-brand-start))]/[0.08]\n \"\n onClick={onLearnMore}\n fullWidth\n >\n {t(\"tradingLeaderboard.viewRules\")}\n </Button>\n )}\n {(shouldShowJoinButton || showTradeButton) && (\n <div className=\"oui-w-full\">\n <AuthGuard\n buttonProps={{\n fullWidth: true,\n size: isMobile ? \"sm\" : \"md\",\n className: \"oui-px-5\",\n }}\n >\n {shouldShowJoinButton && (\n <Button\n size={isMobile ? \"sm\" : \"md\"}\n variant=\"gradient\"\n color=\"primary\"\n className=\"oui-flex-1\"\n loading={isJoining}\n disabled={isJoining}\n onClick={async () => {\n try {\n await joinCampaign?.({\n campaign_id: Number(campaign.campaign_id),\n });\n } catch (error) {\n console.error(\"Failed to join campaign:\", error);\n }\n }}\n fullWidth\n >\n {t(\"tradingLeaderboard.joinNow\")}\n </Button>\n )}\n {showTradeButton && (\n <Button\n size={isMobile ? \"sm\" : \"md\"}\n variant=\"gradient\"\n color=\"primary\"\n className=\"oui-flex-1\"\n onClick={onTradeNow}\n fullWidth\n >\n {campaign?.trading_config?.format ||\n t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n )}\n </AuthGuard>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import { format } from \"date-fns\";\nimport { i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { TimelinePoint } from \"./components/axis\";\nimport { CampaignConfig, CampaignTagEnum, CampaignStatistics } from \"./type\";\n\n// Default timezone display for campaigns\nconst DEFAULT_TIMEZONE_DISPLAY = \"UTC\";\n\n/**\n * Get user's current timezone display name\n * @returns Display name for the user's timezone (e.g., 'UTC', 'EST', 'PST')\n */\nexport const getUserTimezoneDisplay = (): string => {\n try {\n const date = new Date();\n const timeString = date.toLocaleTimeString(\"en-US\", {\n timeZoneName: \"short\",\n });\n const shortName = timeString.split(\" \").pop();\n return shortName || DEFAULT_TIMEZONE_DISPLAY;\n } catch (error) {\n console.warn(\"Failed to detect user timezone, using default:\", error);\n return DEFAULT_TIMEZONE_DISPLAY;\n }\n};\n\n/**\n * Get the appropriate tag for a campaign based on its configuration and current conditions\n * @param campaign Campaign configuration object\n * @param userReferralCode User's referral code (optional)\n * @returns CampaignTagEnum representing the current status of the campaign\n */\nexport const getCampaignTag = (\n campaign: CampaignConfig,\n userReferralCode?: string,\n): CampaignTagEnum => {\n const currentTime = new Date();\n const startTime = new Date(campaign.start_time);\n const endTime = new Date(campaign.end_time);\n\n // For non-exclusive campaigns, check time-based status\n if (currentTime < startTime) {\n return CampaignTagEnum.COMING;\n } else if (currentTime > endTime) {\n return CampaignTagEnum.ENDED;\n } else {\n if (campaign.referral_codes && campaign.referral_codes.length > 0) {\n if (\n !userReferralCode ||\n !campaign.referral_codes.includes(userReferralCode)\n ) {\n return CampaignTagEnum.EXCLUSIVE;\n }\n }\n return CampaignTagEnum.ONGOING;\n }\n};\n\n/**\n * Check if a campaign is visible to the current user\n * @param campaign Campaign configuration object\n * @param userReferralCode User's referral code (optional)\n * @returns boolean indicating if the campaign should be displayed\n */\nexport const isCampaignVisible = (\n campaign: CampaignConfig,\n userReferralCode?: string,\n): boolean => {\n // If campaign has referral code restrictions\n if (campaign.referral_codes && campaign.referral_codes.length > 0) {\n // Only show if user has a valid referral code\n return (\n !!userReferralCode && campaign.referral_codes.includes(userReferralCode)\n );\n }\n\n // For non-exclusive campaigns, always visible\n return true;\n};\n\n/**\n * Format campaign date range to display format like \"Feb 28, 2025 - March 2, 2025 PST\"\n * @param startTime Start time string or timestamp (should be UTC)\n * @param endTime End time string or timestamp (should be UTC)\n * @param showTimezone Whether to show timezone suffix (defaults to true)\n * @returns Formatted date range string with user's timezone\n */\nexport const formatCampaignDateRange = (\n startTime: string | number | Date,\n endTime: string | number | Date,\n showTimezone: boolean = true,\n): string => {\n try {\n // Convert to Date objects - JavaScript automatically handles UTC conversion to local time\n const startDate = new Date(startTime);\n const endDate = new Date(endTime);\n\n // Check if dates are valid\n if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) {\n console.warn(\"Invalid date value provided to formatCampaignDateRange:\", {\n startTime,\n endTime,\n });\n return \"Invalid date range\";\n }\n\n // Format dates using date-fns (will display in user's local timezone)\n // MMM d, yyyy format gives us \"Feb 28, 2025\" style\n const startFormatted = format(startDate, \"MMM d, yyyy\");\n const endFormatted = format(endDate, \"MMM d, yyyy\");\n\n const dateRange = `${startFormatted} - ${endFormatted}`;\n\n if (!showTimezone) {\n return dateRange;\n }\n\n // Add user's timezone suffix\n const timezoneDisplay = getUserTimezoneDisplay();\n return `${dateRange} ${timezoneDisplay}`;\n } catch (error) {\n console.error(\"Error formatting campaign date range:\", error, {\n startTime,\n endTime,\n });\n return \"Date formatting error\";\n }\n};\n\n/**\n * Get total participants count from campaign statistics\n * @param statistics Campaign statistics data from API\n * @returns Formatted participants count\n */\nexport const getParticipantsCount = (\n statistics?: CampaignStatistics,\n): number => {\n return statistics?.total_participants || 0;\n};\n\n/**\n * Get total trading volume from campaign statistics\n * @param statistics Campaign statistics data from API\n * @returns Total trading volume amount\n */\nexport const getTradingVolume = (statistics?: CampaignStatistics): number => {\n return statistics?.total_volume || 0;\n};\n\n/**\n * Calculate total prize pool amount from campaign configuration\n * @param campaign Campaign configuration object\n * @returns Object with total amount and currency, or null if no prize pools\n */\nexport const getTotalPrizePool = (\n campaign?: CampaignConfig,\n tieredIndex?: number,\n): { amount: number; currency: string } | null => {\n if (campaign?.tiered_prize_pools && campaign.tiered_prize_pools.length > 0) {\n return {\n amount: campaign.tiered_prize_pools[tieredIndex || 0]?.[0]?.total_prize,\n currency: campaign.tiered_prize_pools[tieredIndex || 0]?.[0]?.currency,\n };\n }\n\n if (!campaign?.prize_pools || campaign.prize_pools.length === 0) {\n return null;\n }\n\n // Group by currency and sum up the amounts\n const currencyTotals: Record<string, number> = {};\n\n campaign.prize_pools.forEach((pool) => {\n currencyTotals[pool.currency] =\n (currencyTotals[pool.currency] || 0) + pool.total_prize;\n });\n\n // For now, return the first currency found (typically USDC)\n // In the future, we might want to handle multiple currencies differently\n const currencies = Object.keys(currencyTotals);\n if (currencies.length === 0) return null;\n\n const mainCurrency = currencies[0];\n return {\n amount: currencyTotals[mainCurrency],\n currency: mainCurrency,\n };\n};\n\n/**\n * Get ticket prize pool amount from campaign configuration\n * @param campaign Campaign configuration object\n * @returns Object with amount and currency, or null if no ticket rules\n */\nexport const getTicketPrizePool = (\n campaign?: CampaignConfig,\n): { amount: number; currency: string } | null => {\n if (!campaign?.ticket_rules) {\n return null;\n }\n\n return {\n amount: campaign.ticket_rules.total_prize,\n currency: campaign.ticket_rules.currency,\n };\n};\n\n/**\n * Format prize amount for display\n * @param amount Prize amount\n * @param currency Currency symbol\n * @returns Formatted string like \"15,000 USDC\"\n */\nexport const formatPrizeAmount = (amount: number, currency: string): string => {\n return `${amount?.toLocaleString()} ${currency}`;\n};\n\n/**\n * Format trading volume for display with currency symbol\n * @param volume Trading volume amount\n * @returns Formatted string with $ prefix\n */\nexport const formatTradingVolume = (\n volume: number,\n decimalPlaces: number = 1,\n): string => {\n if (volume >= 1_000_000) {\n return `$${(volume / 1_000_000).toFixed(decimalPlaces)}M`;\n } else if (volume >= 1_000) {\n return `$${(volume / 1_000).toFixed(decimalPlaces)}K`;\n } else {\n return `$${volume.toFixed(decimalPlaces)}`;\n }\n};\n\n/**\n * Format participants count for display\n * @param count Participants count\n * @returns Formatted string with proper formatting\n */\nexport const formatParticipantsCount = (\n count: number,\n decimalPlaces: number = 1,\n): string => {\n if (count >= 1_000_000) {\n return `${(count / 1_000_000).toFixed(decimalPlaces)}M`;\n } else if (count >= 1_000) {\n return `${(count / 1_000).toFixed(decimalPlaces)}K`;\n } else {\n return count.toLocaleString();\n }\n};\n\n/**\n * Generate timeline data points for campaign visualization\n * @param campaign Campaign configuration object\n * @returns Array of TimelinePoint objects (max 4 points) in user's local timezone\n */\nexport const generateCampaignTimeline = (\n campaign: CampaignConfig,\n): TimelinePoint[] => {\n const currentTime = new Date();\n const registerTime = campaign.register_time\n ? new Date(campaign.register_time)\n : null;\n const startTime = new Date(campaign.start_time);\n const endTime = new Date(campaign.end_time);\n const rewardTime = campaign.reward_distribution_time\n ? new Date(campaign.reward_distribution_time)\n : null;\n\n const timeline: TimelinePoint[] = [];\n\n // Helper function to determine point type based on time\n const getTimelineType = (\n time: Date,\n isNow: boolean = false,\n ): \"past\" | \"active\" | \"future\" => {\n if (isNow) return \"active\";\n return currentTime >= time ? \"past\" : \"future\";\n };\n\n // Helper function to format time for display in user's local timezone\n const formatTimeDisplay = (time: Date): string => {\n try {\n // Format time using date-fns (displays in user's local timezone)\n const formatted = format(time, \"yyyy-MM-dd HH:mm\");\n const timezoneDisplay = getUserTimezoneDisplay();\n return `${formatted} ${timezoneDisplay}`;\n } catch (error) {\n console.error(\"Error formatting time:\", error);\n return time.toISOString();\n }\n };\n\n if (registerTime) {\n timeline.push({\n title: \"Battle Registration\",\n type: getTimelineType(registerTime),\n time: formatTimeDisplay(registerTime),\n });\n\n const isInRegisterTime =\n currentTime >= registerTime && currentTime <= startTime;\n if (isInRegisterTime) {\n timeline.push({\n title: i18n.t(\"chart.now\"),\n type: \"active\",\n time: formatTimeDisplay(currentTime),\n });\n }\n }\n\n // Battle starts point\n timeline.push({\n title: i18n.t(\"tradingLeaderboard.battleStarts\"),\n type: getTimelineType(startTime),\n time: formatTimeDisplay(startTime),\n });\n\n // Add \"Now\" point if battle is ongoing\n const isOngoing = currentTime >= startTime && currentTime <= endTime;\n if (isOngoing) {\n timeline.push({\n title: i18n.t(\"chart.now\"),\n type: \"active\",\n time: formatTimeDisplay(currentTime),\n });\n }\n\n // Battle ends point\n timeline.push({\n title: i18n.t(\"tradingLeaderboard.battleEnds\"),\n type: getTimelineType(endTime),\n time: formatTimeDisplay(endTime),\n });\n\n // Reward distribution point (if provided)\n if (rewardTime) {\n timeline.push({\n title: i18n.t(\"tradingLeaderboard.rewardDistribution\"),\n type: getTimelineType(rewardTime),\n time: formatTimeDisplay(rewardTime),\n });\n }\n\n // Ensure we don't exceed 4 points\n return timeline.slice(0, 4);\n};\n","import { ReactNode } from \"react\";\nimport { RankingColumnFields } from \"../ranking/shared/column\";\nimport { DescriptionConfig, DescriptionItem } from \"../rule/description\";\n\nexport enum CampaignTagEnum {\n ONGOING = \"ongoing\",\n COMING = \"coming\",\n ENDED = \"ended\",\n EXCLUSIVE = \"exclusive\",\n}\n\n// Campaign statistics data structure (from campaign statistics API)\nexport interface CampaignStatistics {\n total_participants?: number;\n total_volume?: number;\n}\n\n// Campaign prize pool configuration types\nexport interface PrizePoolTier {\n position?: number;\n position_range?: [number, number];\n amount: number;\n}\n\nexport interface PrizePool {\n pool_id: string;\n label: string;\n total_prize: number;\n currency: string;\n metric: \"volume\" | \"pnl\";\n tiers: PrizePoolTier[];\n volume_limit?: number;\n}\n\n// Ticket prize configuration types\nexport interface TicketTierRule {\n value: number;\n tickets: number;\n}\n\nexport interface TicketLinearRule {\n every: number;\n tickets: number;\n}\n\nexport interface TicketRules {\n total_prize: number;\n currency: string;\n metric: \"volume\" | \"pnl\";\n mode: \"tiered\" | \"linear\";\n tiers?: TicketTierRule[];\n linear?: TicketLinearRule;\n}\n\n// Campaign configuration\nexport interface CampaignConfig {\n campaign_id: number | string;\n title: string;\n subtitle?: string;\n description: string;\n content?: ReactNode;\n classNames?: {\n container?: string;\n topContainer?: string;\n title?: string;\n description?: string;\n descriptionContainer?: string;\n };\n register_time?: string;\n start_time: string;\n end_time: string;\n reward_distribution_time?: string;\n volume_scope?: string | string[];\n referral_codes?: string[] | string;\n prize_pools?: PrizePool[];\n tiered_prize_pools?: Array<PrizePool[]>;\n ticket_rules?: TicketRules;\n image?: string;\n rule_url?: string;\n rule_config?: {\n action?: \"scroll\" | \"click\";\n };\n trading_url?: string;\n trading_config?: {\n format?: string;\n };\n href?: string;\n hide_arena?: boolean;\n hide_rewards?: boolean;\n hide_estimated_rewards?: boolean;\n highlight_pool_id?: string;\n user_account_label?: string;\n rule?: {\n rule: DescriptionItem[];\n terms: DescriptionItem[];\n ruleConfig?: DescriptionConfig;\n };\n leaderboard_config?: LeaderboardConfig;\n // template config, will be remove when campaign is ended\n emphasisConfig?: {\n subtitle: string;\n walletConnect: {\n title: string;\n description: string;\n };\n hideConnectWallet: boolean;\n };\n}\n\nexport interface LeaderboardConfig {\n use_general_leaderboard?: boolean;\n exclude_leaderboard_columns?: RankingColumnFields[];\n // for 128 campaign\n week_one_addresses?: string[];\n}\n\n// User data for calculations\nexport interface UserData {\n rank?: number | string;\n pnl: number;\n total_participants?: number;\n volume: number;\n referral_code?: string;\n}\n\nexport type CampaignStatsDetailsResponse = {\n broker_id: string;\n user_count: number;\n volume: number;\n symbol: string;\n}[];\n\nexport type CampaignStatsResponse = {\n sign_up_count: number;\n user_count: number;\n volume: number;\n updated_time: number;\n};\n\nexport type UserCampaignsResponse = {\n id: string;\n register_time: number;\n}[];\n","import { FC } from \"react\";\nimport { Box, Button, cn, Flex, Text, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuard } from \"@kodiak-finance/orderly-ui-connector\";\nimport { CampaignConfig } from \"../type\";\nimport { PricePoolDesktopUI } from \"./pricePool.desktop.ui\";\nimport { usePricePoolScript } from \"./pricePool.script\";\n\ntype PricePoolWidgetProps = {\n campaign: CampaignConfig;\n statistics: any;\n tradingVolume: number;\n isMobile: boolean;\n isCampaignStarted: boolean;\n tooltipProps: any;\n showTradeButton: boolean;\n onLearnMore: () => void;\n onTradeNow: () => void;\n shouldShowJoinButton: boolean;\n joinCampaign: (data: { campaign_id: string | number }) => Promise<any>;\n isJoining: boolean;\n canTrade: boolean;\n totalPrizePool: { amount: number; currency: string } | null;\n};\n\nexport const PricePoolWidget: FC<PricePoolWidgetProps> = (props) => {\n const state = usePricePoolScript(props.campaign);\n\n const emphasisConfig = props.campaign?.emphasisConfig;\n const { isMobile } = useScreen();\n\n return (\n <div>\n <PricePoolDesktopUI {...state} {...props} />\n {emphasisConfig?.hideConnectWallet && (\n <Box mt={4}>\n <AuthGuard\n buttonProps={{\n size: isMobile ? \"lg\" : \"xl\",\n fullWidth: true,\n className: \"oui-rounded-full lg:oui-rounded-2xl\",\n }}\n labels={{\n connectWallet: emphasisConfig?.walletConnect?.title,\n }}\n descriptions={{\n // @ts-ignore\n connectWallet: (\n <Text.gradient\n color=\"brand\"\n className={cn([\n \"oui-text-center oui-font-semibold\",\n \"oui-text-[14px] oui-leading-[20px] lg:oui-text-[16px] lg:oui-leading-[24px]\",\n ])}\n >\n {emphasisConfig?.walletConnect?.description}\n </Text.gradient>\n ),\n }}\n />\n </Box>\n )}\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Text, ChevronRightIcon, Button } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuard } from \"@kodiak-finance/orderly-ui-connector\";\nimport { useCanTrade } from \"../../../hooks/useCanTrade\";\nimport { CampaignConfig, PrizePool } from \"../type\";\nimport { formatPrizeAmount, formatTradingVolume } from \"../utils\";\nimport { PricePoolScriptReturn } from \"./pricePool.script\";\nimport {\n calculateProgressWidth,\n getCurrentTierIndex,\n getProgressLeft,\n} from \"./utils\";\n\ntype PricePoolDesktopUIProps = PricePoolScriptReturn & {\n isMobile?: boolean;\n tradingVolume: number;\n isCampaignStarted: boolean;\n tooltipProps: any;\n onLearnMore: () => void;\n statistics: any;\n campaign: CampaignConfig;\n shouldShowJoinButton: boolean;\n joinCampaign: (data: { campaign_id: string | number }) => Promise<any>;\n isJoining: boolean;\n showTradeButton: boolean;\n onTradeNow: () => void;\n totalPrizePool: { amount: number; currency: string } | null;\n};\n\nexport const PricePoolDesktopUI: FC<PricePoolDesktopUIProps> = ({\n totalPrizePool,\n ticketPrizePool,\n highlightPool,\n isMobile,\n onLearnMore,\n statistics,\n tradingVolume,\n campaign,\n shouldShowJoinButton,\n joinCampaign,\n isJoining,\n showTradeButton,\n onTradeNow,\n status,\n}) => {\n const { t } = useTranslation();\n const canTrade = useCanTrade();\n\n const renderButton = () => {\n if (campaign?.emphasisConfig?.hideConnectWallet && !canTrade) {\n return null;\n }\n\n if (shouldShowJoinButton || showTradeButton) {\n return (\n <div className=\"oui-w-full\">\n <AuthGuard\n buttonProps={{\n size: \"md\",\n fullWidth: true,\n className: cn([\"oui-px-5\", !isMobile && \"oui-w-[590px]\"]),\n }}\n >\n {shouldShowJoinButton && (\n <Button\n size={\"md\"}\n variant=\"gradient\"\n color=\"primary\"\n className=\"oui-flex-1\"\n loading={isJoining}\n disabled={isJoining}\n onClick={async () => {\n try {\n await joinCampaign?.({\n campaign_id: Number(campaign.campaign_id),\n });\n } catch (error) {\n console.error(\"Failed to join campaign:\", error);\n }\n }}\n fullWidth\n >\n {t(\"tradingLeaderboard.joinNow\")}\n </Button>\n )}\n {showTradeButton && (\n <Button\n size={\"md\"}\n variant=\"gradient\"\n color=\"primary\"\n className=\"oui-flex-1\"\n onClick={onTradeNow}\n fullWidth\n >\n {campaign?.trading_config?.format ||\n t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n )}\n </AuthGuard>\n </div>\n );\n }\n return null;\n };\n\n return (\n <div\n className={cn([\n \"oui-rounded-[24px] oui-border oui-border-solid oui-border-base-contrast/[0.08] oui-bg-primary/[0.08] oui-p-6 oui-backdrop-blur-[10px]\",\n \"oui-flex oui-flex-col\",\n isMobile ? \"oui-w-[calc(100vw-24px)]\" : \"oui-w-[640px]\",\n ])}\n >\n <div className=\"oui-flex oui-items-center\">\n <div className=\"oui-flex oui-flex-1 oui-flex-col\">\n <div className=\"oui-text-xs oui-font-semibold oui-text-base-contrast-54\">\n Current total prize pool\n </div>\n <div>\n <Text.gradient\n weight=\"bold\"\n color=\"brand\"\n className={cn([\n \"oui-trading-leaderboard-title \",\n isMobile\n ? \"oui-text-[20px] oui-leading-[28px]\"\n : \"oui-text-[32px] oui-leading-[28px]\",\n ])}\n >\n {totalPrizePool\n ? formatPrizeAmount(\n totalPrizePool.amount,\n totalPrizePool.currency,\n )\n : \"USDC\"}\n </Text.gradient>\n </div>\n </div>\n {(ticketPrizePool || highlightPool) && (\n <div className=\"oui-flex oui-flex-1 oui-flex-col\">\n <div className=\"oui-text-xs oui-font-semibold oui-text-base-contrast-54\">\n {highlightPool?.label || \"Raffle prize\"}\n </div>\n <div>\n <Text.gradient\n weight=\"bold\"\n color=\"brand\"\n className={cn([\n \"oui-trading-leaderboard-title oui-leading-[28px]\",\n isMobile\n ? \"oui-text-[20px] oui-leading-[28px]\"\n : \"oui-text-[32px] oui-leading-[28px]\",\n ])}\n >\n {formatPrizeAmount(\n ticketPrizePool?.amount || highlightPool?.total_prize || 0,\n ticketPrizePool?.currency ||\n highlightPool?.currency ||\n \"USDC\",\n )}\n </Text.gradient>\n </div>\n </div>\n )}\n </div>\n\n <div className=\"oui-mb-3 oui-mt-4\">\n <TradingVolumeAndParticipation\n onLearnMore={onLearnMore}\n tradingVolume={tradingVolume}\n statistics={statistics}\n />\n </div>\n\n <PricePoolProgress\n isMobile={isMobile}\n tieredPrizePools={campaign?.tiered_prize_pools || []}\n tradingVolume={tradingVolume}\n />\n\n <div\n className={cn([\n \"oui-flex oui-gap-4\",\n isMobile ? \"oui-mt-3\" : canTrade && \"oui-mt-6\",\n ])}\n >\n {isMobile && campaign?.rule_url && (\n <div className=\"oui-w-full\">\n <Button\n fullWidth\n size=\"md\"\n variant=\"outlined\"\n className=\"oui-flex-1 \n oui-border-[rgb(var(--oui-gradient-brand-start))] \n oui-text-[rgb(var(--oui-gradient-brand-start))] \n hover:oui-bg-[rgb(var(--oui-gradient-brand-start))]/[0.08]\n active:oui-bg-[rgb(var(--oui-gradient-brand-start))]/[0.08]\n \"\n onClick={onLearnMore}\n >\n {t(\"tradingLeaderboard.viewRules\")}\n </Button>\n </div>\n )}\n {renderButton()}\n </div>\n </div>\n );\n};\n\nconst TradingVolumeAndParticipation = ({\n onLearnMore,\n tradingVolume,\n statistics,\n}: {\n onLearnMore: () => void;\n tradingVolume: number;\n statistics: any;\n}) => {\n const { t } = useTranslation();\n return (\n <div className=\"oui-flex oui-items-center oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n <div>{t(\"tradingLeaderboard.tradingVolume\")}</div>\n <div className=\"oui-ml-1 oui-mr-2\">\n <Text.gradient color=\"brand\">\n <Text.numeral dp={2} prefix=\"$\">\n {tradingVolume}\n </Text.numeral>\n </Text.gradient>\n </div>\n <div>{t(\"tradingLeaderboard.participants\")}</div>\n <div className=\"oui-ml-1 oui-text-base-contrast-54\">\n <Text.numeral dp={0}>{statistics?.total_participants}</Text.numeral>\n </div>\n <div\n className=\"oui-ml-auto oui-flex oui-cursor-pointer oui-items-center oui-gap-0.5 oui-text-2xs oui-leading-[15px] oui-text-base-contrast-36\"\n onClick={onLearnMore}\n >\n {t(\"tradingLeaderboard.viewRules\")}\n <ChevronRightIcon size={16} className=\"oui-text-base-contrast-36\" />\n </div>\n </div>\n );\n};\n\ntype PricePoolProgressProps = {\n isMobile?: boolean;\n tieredPrizePools: Array<Array<PrizePool>>;\n tradingVolume: number;\n};\n\nconst PricePoolProgress: FC<PricePoolProgressProps> = ({\n isMobile,\n tieredPrizePools,\n tradingVolume,\n}) => {\n // Calculate the progress bar width b ased on current trading volume\n const progressWidth = calculateProgressWidth(\n tradingVolume,\n tieredPrizePools,\n isMobile ? 6 : 2,\n );\n const currentTierIndex = getCurrentTierIndex(tradingVolume, tieredPrizePools);\n\n return (\n <div\n className={cn([\n \"oui-relative oui-flex oui-items-center oui-p-4 oui-pr-12 oui-font-medium\",\n \"oui-rounded-[10px] oui-border oui-border-solid oui-border-base-contrast/[0.12]\",\n \"oui-trading-leaderboard-title\",\n isMobile ? \"oui-h-[88px] oui-text-3xs\" : \"oui-h-[114px] oui-text-sm\",\n ])}\n >\n <div className=\"oui-absolute oui-flex oui-h-6 oui-w-[calc(100%-64px)] oui-items-center\">\n <div\n className={cn([\n \"oui-relative oui-flex oui-flex-1 oui-flex-col oui-rounded-[14px] oui-bg-base-5 oui-p-0.5\",\n isMobile ? \"oui-h-3\" : \"oui-h-4\",\n ])}\n >\n <div\n className=\"oui-h-full oui-rounded-[14px] oui-bg-[linear-gradient(270deg,rgb(var(--oui-gradient-brand-start))_0%,rgb(var(--oui-gradient-brand-end))_100%)]\"\n style={{ width: `${progressWidth}%` }}\n />\n <div\n style={{\n position: \"absolute\",\n left: `${progressWidth}%`,\n transform: `translate(-90%, ${isMobile ? \"-44\" : \"-25\"}%)`,\n scale: isMobile ? \"0.8\" : \"1\",\n zIndex: 50,\n }}\n >\n <Dot />\n </div>\n </div>\n </div>\n <div\n className={cn(\n \"oui-absolute oui-left-1 oui-flex oui-w-[calc(100%-64px)] oui-items-center\",\n \"oui-p-4 oui-pr-12\",\n )}\n >\n {tieredPrizePools?.map((prizePool: PrizePool[], index: number) => {\n const isReached = index <= currentTierIndex;\n const isCurrentTier = index === currentTierIndex;\n\n const left = getProgressLeft(tieredPrizePools.length, index);\n\n return (\n <div\n key={prizePool[0].pool_id}\n className=\"oui-flex oui-items-center\"\n >\n <div\n className={cn(\n \"oui-absolute oui-top-[-12px] lg:oui-top-[-24px]\",\n \"-oui-translate-x-1/2\",\n isReached\n ? \"oui-text-base-contrast\"\n : \"oui-text-base-contrast-36\",\n )}\n style={{ left }}\n >{`>${formatTradingVolume(prizePool[0].volume_limit || 0, 0)}`}</div>\n <div\n className={cn(\n \"oui-absolute\",\n \" oui-rounded-full\",\n isMobile ? \"oui-size-[4px]\" : \"oui-size-[6px]\",\n isReached ? \"oui-bg-white/[0.8]\" : \"oui-bg-[#00A9DE]\",\n )}\n style={{ left }}\n />\n <div\n className=\"oui-absolute oui-bottom-[-12px] -oui-translate-x-1/2 lg:oui-bottom-[-24px]\"\n style={{ left }}\n >\n {isCurrentTier ? (\n <Text.gradient color=\"brand\" weight=\"bold\">\n <Text.numeral dp={0} prefix={\"$\"}>\n {prizePool[0].total_prize}\n </Text.numeral>\n </Text.gradient>\n ) : (\n <Text.numeral\n dp={0}\n prefix={\"$\"}\n className={cn([\n isReached\n ? \"oui-text-base-contrast\"\n : \"oui-text-base-contrast-36\",\n ])}\n >\n {prizePool[0].total_prize}\n </Text.numeral>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nconst Dot = () => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 0.749939C18.2132 0.749939 23.25 5.78674 23.25 11.9999C23.25 18.2131 18.2132 23.2499 12 23.2499C5.7868 23.2499 0.75 18.2131 0.75 11.9999C0.75 5.78674 5.7868 0.749939 12 0.749939Z\"\n fill=\"#161B22\"\n />\n <path\n d=\"M12 0.749939C18.2132 0.749939 23.25 5.78674 23.25 11.9999C23.25 18.2131 18.2132 23.2499 12 23.2499C5.7868 23.2499 0.75 18.2131 0.75 11.9999C0.75 5.78674 5.7868 0.749939 12 0.749939Z\"\n stroke=\"url(#paint0_linear_31433_10290)\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M8.30771 17.9999V16.3999H6.66669V7.59994H8.30771V5.99994H9.53848V7.59994H11.1795V16.3999H9.53848V17.9999H8.30771ZM7.89746 15.1999H9.94874V8.79994H7.89746V15.1999ZM14.4616 17.9999V14.1537H12.8205V9.12314H14.4616V5.99994H15.6923V9.12314H17.3334V14.1537H15.6923V17.9999H14.4616ZM14.0513 12.9537H16.1026V10.3229H14.0513V12.9537Z\"\n fill=\"url(#paint1_linear_31433_10290)\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_31433_10290\"\n x1=\"24\"\n y1=\"11.9999\"\n x2=\"-1.39122e-07\"\n y2=\"11.9999\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#59B0FE\" />\n <stop offset=\"1\" stopColor=\"#26FEFE\" />\n </linearGradient>\n <linearGradient\n id=\"paint1_linear_31433_10290\"\n x1=\"17.3334\"\n y1=\"11.9999\"\n x2=\"6.66669\"\n y2=\"11.9999\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#59B0FE\" />\n <stop offset=\"1\" stopColor=\"#26FEFE\" />\n </linearGradient>\n </defs>\n </svg>\n );\n};\n","import { useMemo } from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { CampaignConfig } from \"../type\";\nimport { getTicketPrizePool } from \"../utils\";\n\nexport const usePricePoolScript = (campaign: CampaignConfig) => {\n const { state } = useAccount();\n const ticketPrizePool = useMemo(\n () => getTicketPrizePool(campaign),\n [campaign],\n );\n\n const highlightPool = useMemo(() => {\n if (!campaign?.highlight_pool_id) {\n return null;\n }\n return campaign?.prize_pools?.find(\n (pool) => pool.pool_id === campaign.highlight_pool_id,\n );\n }, [campaign]);\n\n return {\n ticketPrizePool,\n highlightPool,\n status: state.status,\n };\n};\n\nexport type PricePoolScriptReturn = ReturnType<typeof usePricePoolScript>;\n","import { useMemo, useCallback } from \"react\";\nimport { useQuery, useMutation, useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { useTradingLeaderboardContext } from \"../provider\";\nimport { getCurrentTierIndex } from \"./pricePool/utils\";\nimport { UserCampaignsResponse } from \"./type\";\nimport { getTotalPrizePool } from \"./utils\";\n\n/**\n * Hook for managing campaigns data and statistics\n * TODO: Replace mock data with real API calls when backend is ready\n */\nexport const useCampaignsScript = () => {\n const {\n campaigns = [],\n currentCampaignId,\n onCampaignChange,\n currentCampaign,\n userData,\n backgroundSrc,\n statistics,\n } = useTradingLeaderboardContext();\n\n const isCampaignEnded = useMemo(() => {\n return (\n currentCampaign?.end_time &&\n currentCampaign?.end_time < new Date().toISOString()\n );\n }, [currentCampaign]);\n\n const { state } = useAccount();\n\n const { data: userCampaigns, mutate: refreshUserCampaigns } =\n useQuery<UserCampaignsResponse>(\n currentCampaignId !== \"general\" && state.address\n ? `https://api.orderly.org/v1/public/campaigns?address=${state.address}`\n : null,\n { revalidateOnFocus: false },\n );\n\n const isParticipated = useMemo(() => {\n const target = userCampaigns?.find((item) => item.id == currentCampaignId);\n return !!target;\n }, [userCampaigns, currentCampaignId]);\n\n const shouldShowJoinButton = useMemo(() => {\n // return false;\n return !!state.address && !isCampaignEnded && !isParticipated;\n }, [state.address, isCampaignEnded, isParticipated]);\n\n const [doJoinCampaign, { isMutating: isJoining, error: joinError }] =\n useMutation(`/v1/client/campaign/sign_up`, \"POST\");\n\n const joinCampaign = useCallback(\n async (data: { campaign_id: string | number }) => {\n try {\n if (state.status < AccountStatusEnum.EnableTrading) {\n toast.error(\"Please enable trading to proceed.\");\n return;\n }\n const result = await doJoinCampaign(data);\n\n // hardcode for 128 campaign\n if (String(data.campaign_id) === \"128\") {\n Promise.all(\n [\"130\", \"131\", \"132\", \"133\", \"134\", \"136\"].map(\n async (campaignId) => {\n await doJoinCampaign({ campaign_id: campaignId });\n },\n ),\n );\n }\n\n if (result?.success !== false) {\n // Refresh user campaigns data to update participation status\n await refreshUserCampaigns();\n toast.success(result?.message || \"Campaign joined successfully\");\n return result;\n } else {\n toast.error(result?.message || \"Failed to join campaign\");\n }\n } catch (error) {\n console.error(\"Failed to join campaign:\", error);\n throw error;\n }\n },\n [doJoinCampaign, refreshUserCampaigns, state.status],\n );\n\n const onLearnMore = () => {\n if (currentCampaign?.rule_url) {\n if (currentCampaign.rule_config?.action === \"scroll\") {\n document\n .getElementById(currentCampaign.rule_url)\n ?.scrollIntoView({ behavior: \"smooth\" });\n } else {\n window.open(currentCampaign.rule_url, \"_blank\");\n }\n }\n };\n\n const onTradeNow = () => {\n if (currentCampaign?.trading_url) {\n window.open(currentCampaign.trading_url, \"_self\");\n }\n };\n\n const canTrade = useMemo(() => {\n if (!currentCampaign) return false;\n return (\n currentCampaign?.start_time < new Date().toISOString() &&\n currentCampaign?.end_time > new Date().toISOString() &&\n state.status >= AccountStatusEnum.EnableTrading\n );\n }, [currentCampaign, state.status]);\n\n const tieredIndex = useMemo(() => {\n if (!currentCampaign?.tiered_prize_pools) return 0;\n return getCurrentTierIndex(\n statistics?.total_volume || 0,\n currentCampaign?.tiered_prize_pools,\n );\n }, [statistics?.total_volume, currentCampaign?.tiered_prize_pools]);\n\n const totalPrizePool = useMemo(() => {\n return getTotalPrizePool(currentCampaign, tieredIndex ?? undefined);\n }, [currentCampaign, tieredIndex]);\n\n return {\n campaigns,\n currentCampaignId,\n currentCampaign,\n onCampaignChange,\n statistics,\n userData,\n onLearnMore,\n onTradeNow,\n backgroundSrc,\n joinCampaign,\n isJoining,\n isParticipated,\n shouldShowJoinButton,\n joinError,\n canTrade,\n totalPrizePool,\n status: state.status,\n };\n};\n\nexport type CampaignsScriptReturn = ReturnType<typeof useCampaignsScript>;\n","import { FC } from \"react\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport { CampaignConfig } from \"../type\";\nimport { generateCampaignTimeline } from \"../utils\";\nimport { CampaignsAxis, CampaignsAxisMobile } from \"./axis\";\nimport { CampaignsCountdown } from \"./countdown\";\n\nexport const CampaignsTimeDesktopUI: FC<{\n campaign: CampaignConfig;\n isMobile?: boolean;\n}> = ({ campaign, isMobile }) => {\n const timelineData = generateCampaignTimeline(campaign);\n\n return (\n <div\n className={cn([\n \"oui-max-w-[992px] oui-mx-auto oui-flex oui-flex-col oui-items-center\",\n isMobile ? \"oui-pt-4 oui-gap-10 oui-pb-10\" : \"oui-py-10 oui-gap-4\",\n ])}\n >\n <CampaignsCountdown campaign={campaign} isMobile={isMobile} />\n {isMobile ? (\n <CampaignsAxisMobile points={timelineData} />\n ) : (\n <CampaignsAxis points={timelineData} />\n )}\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\n\nexport interface TimelinePoint {\n title: string;\n type: \"past\" | \"active\" | \"future\";\n time: string;\n}\n\nexport interface CampaignsAxisProps {\n points: TimelinePoint[];\n}\n\nexport const CampaignsAxis: FC<CampaignsAxisProps> = ({ points }) => {\n if (!points || points.length === 0) {\n return null;\n }\n\n // Find the index of the active point\n const activeIndex = points.findIndex((point) => point.type === \"active\");\n\n // For single point, center it without any lines\n if (points.length === 1) {\n return (\n <div className=\"oui-flex oui-w-full oui-justify-center\">\n <div className=\"oui-flex oui-flex-col oui-items-center\">\n <AxisPoint type={points[0].type} />\n <div className=\"oui-mt-4 oui-flex oui-flex-col oui-items-center oui-text-center\">\n <div className=\"oui-trading-leaderboard-title oui-mb-1 oui-whitespace-nowrap oui-text-sm oui-font-medium oui-text-base-contrast-54\">\n {points[0].title}\n </div>\n <div className=\"oui-whitespace-nowrap oui-text-xs oui-text-base-contrast-36\">\n {points[0].time}\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // Helper function to determine line background class\n const getLineBackgroundClass = (segmentIndex: number): string => {\n // If there's an active point and this segment is to the left of it, use oui-bg-base-3\n if (activeIndex !== -1 && segmentIndex < activeIndex) {\n return \"oui-bg-base-3\";\n }\n // Otherwise use regular color\n return \"oui-bg-base-8\";\n };\n\n const widthPercentage = points?.length > 3 ? \"110%\" : \"120%\";\n\n return (\n <div className=\"oui-flex oui-w-full\" style={{ width: widthPercentage }}>\n {points.map((point, index) => {\n const isFirst = index === 0;\n const isLast = index === points.length - 1;\n\n return (\n <div\n key={index}\n className=\"oui-relative oui-flex oui-flex-1 oui-flex-col oui-items-center\"\n >\n {/* Point container with connecting lines */}\n <div className=\"oui-relative oui-flex oui-w-full oui-items-center\">\n {/* Left line - always occupy space, but invisible for first point */}\n <div\n className={cn([\n \"oui-h-[6px] oui-flex-1\",\n !isFirst && getLineBackgroundClass(index - 1),\n ])}\n />\n\n {/* Point */}\n <div className=\"oui-z-10 oui-shrink-0\">\n <AxisPoint type={point.type} />\n </div>\n\n {/* Right line - always occupy space, but invisible for last point */}\n <div\n className={cn([\n \"oui-h-[6px] oui-flex-1\",\n !isLast && getLineBackgroundClass(index),\n ])}\n />\n </div>\n\n {/* Label below point */}\n <div className=\"oui-mt-4 oui-flex oui-flex-col oui-items-center oui-text-center\">\n <div className=\"oui-trading-leaderboard-title oui-mb-1 oui-whitespace-nowrap oui-text-sm oui-font-medium oui-text-base-contrast-54\">\n {point.title}\n </div>\n <div className=\"oui-whitespace-nowrap oui-text-xs oui-text-base-contrast-36\">\n {point.type !== \"active\" && point.time}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n\nexport const CampaignsAxisMobile: FC<CampaignsAxisProps> = ({ points }) => {\n if (!points || points.length === 0) {\n return null;\n }\n\n // Find the index of the active point\n const activeIndex = points.findIndex((point) => point.type === \"active\");\n\n // Helper function to determine line background class\n const getLineBackgroundClass = (segmentIndex: number): string => {\n // If there's an active point and this segment is above it, use oui-bg-base-3\n if (activeIndex !== -1 && segmentIndex < activeIndex) {\n return \"oui-bg-base-3\";\n }\n // Otherwise use regular color\n return \"oui-bg-base-8\";\n };\n\n return (\n <div className=\"oui-flex oui-w-full oui-flex-col oui-items-center oui-gap-10\">\n {points.map((point, index) => {\n const isFirst = index === 0;\n const isLast = index === points.length - 1;\n\n return (\n <div key={index} className={cn([\"oui-relative\"])}>\n {/* Main content container */}\n <div className=\"oui-flex oui-h-10 oui-items-start oui-gap-4\">\n {/* Point with connecting line */}\n <div\n className={cn([\n \"oui-relative oui-flex oui-flex-col oui-items-center\",\n isFirst && \"oui-translate-y-[10px]\",\n ])}\n >\n <AxisPoint type={point.type} />\n\n {/* Vertical connecting line - only show if not the last point */}\n {!isLast && (\n <div\n className={cn([\n \"oui-h-[64px] oui-w-[6px]\",\n getLineBackgroundClass(index),\n ])}\n />\n )}\n </div>\n\n {/* Text content */}\n <div className=\"oui-flex oui-flex-col oui-justify-start\">\n <div className=\"oui-trading-leaderboard-title oui-mb-1 oui-text-sm oui-font-medium oui-text-base-contrast-54\">\n {point.title}\n </div>\n <div className=\"oui-min-w-[160px] oui-text-xs oui-text-base-contrast-36\">\n {point.type !== \"active\" && point.time}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n\nconst AxisPoint: FC<{ type: \"past\" | \"active\" | \"future\" }> = ({ type }) => {\n return (\n <div\n className={cn([\n \"oui-size-5 oui-shrink-0 oui-rounded-full\",\n type === \"past\" && \"oui-bg-base-contrast-80\",\n type === \"active\" &&\n \"oui-bg-gradient-to-r oui-from-[rgba(var(--oui-gradient-brand-start))] oui-to-[rgba(var(--oui-gradient-brand-end))]\",\n type === \"future\" &&\n \"oui-border-[2.5px] oui-border-solid oui-border-base-contrast-80 oui-bg-[#07080A]\",\n ])}\n />\n );\n};\n","import { FC, useState, useEffect } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport { CampaignConfig } from \"../type\";\n\nconst Circle = () => (\n <div className=\"oui-w-1 oui-h-1 oui-rounded-full oui-bg-white/[0.16]\" />\n);\n\ninterface TimeLeft {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\ninterface TimeUnitProps {\n value: number;\n label: string;\n isMobile?: boolean;\n}\n\nconst TimeUnit: FC<TimeUnitProps> = ({ value, label, isMobile }) => (\n <div\n className={cn([\n \"oui-flex oui-flex-col oui-items-center oui-gap-1\",\n isMobile ? \"oui-w-[45px]\" : \"oui-w-[63px]\",\n ])}\n >\n <div\n className={cn([\n \"oui-trading-leaderboard-title oui-text-base-contrast oui-font-medium\",\n isMobile\n ? \"oui-text-[20px] oui-leading-[24px] oui-h-[24px]\"\n : \"oui-text-[36px] oui-leading-[44px] oui-h-[44px]\",\n ])}\n >\n {value.toString().padStart(2, \"0\")}\n </div>\n <div\n className={cn([\n \"oui-trading-leaderboard-title oui-text-base-contrast-80 oui-font-medium\",\n isMobile\n ? \"oui-text-[10px] oui-leading-[14px] oui-h-[14px]\"\n : \"oui-text-sm oui-leading-[20px] oui-h-[20px]\",\n ])}\n >\n {label}\n </div>\n </div>\n);\n\nexport const CampaignsCountdown: FC<{\n campaign: CampaignConfig;\n isMobile?: boolean;\n}> = ({ campaign, isMobile }) => {\n const { t } = useTranslation();\n const [timeLeft, setTimeLeft] = useState<TimeLeft>({\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0,\n });\n const [isStarted, setIsStarted] = useState(false);\n\n useEffect(() => {\n const calculateTimeLeft = () => {\n const currentTime = new Date().getTime();\n const startTime = new Date(campaign.start_time).getTime();\n const endTime = new Date(campaign.end_time).getTime();\n\n // Determine if campaign has started\n const hasStarted = currentTime >= startTime;\n setIsStarted(hasStarted);\n\n // Calculate time difference based on campaign status\n const targetTime = hasStarted ? endTime : startTime;\n const difference = targetTime - currentTime;\n\n if (difference > 0) {\n const days = Math.floor(difference / (1000 * 60 * 60 * 24));\n const hours = Math.floor(\n (difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60),\n );\n const minutes = Math.floor(\n (difference % (1000 * 60 * 60)) / (1000 * 60),\n );\n const seconds = Math.floor((difference % (1000 * 60)) / 1000);\n\n setTimeLeft({ days, hours, minutes, seconds });\n } else {\n setTimeLeft({ days: 0, hours: 0, minutes: 0, seconds: 0 });\n }\n };\n\n // Calculate immediately\n calculateTimeLeft();\n\n // Set up interval to update every second\n const timer = setInterval(calculateTimeLeft, 1000);\n\n // Cleanup interval on component unmount\n return () => clearInterval(timer);\n }, [campaign.start_time, campaign.end_time]);\n\n // Check if campaign has ended\n const currentTime = new Date();\n const endTime = new Date(campaign.end_time);\n\n if (currentTime > endTime) {\n return (\n <div className=\"oui-w-full oui-flex oui-items-center oui-justify-center oui-gap-4\">\n <div\n className=\"oui-max-w-[382px] oui-w-full oui-h-[1px] oui-bg-gradient-to-r oui-from-[rgba(var(--oui-gradient-brand-end)/0)]\n oui-to-[rgba(var(--oui-gradient-brand-start))]\"\n />\n <div\n className={cn([\n \"oui-trading-leaderboard-title oui-flex oui-items-center oui-justify-center oui-font-medium oui-text-base-contrast-54\",\n isMobile\n ? \"oui-text-[14px] oui-leading-[20px] oui-h-[20px] oui-whitespace-nowrap\"\n : \"oui-p-5 oui-text-[18px] oui-leading-[26px] oui-h-[26px]\",\n ])}\n >\n {t(\"tradingLeaderboard.batteleHasEnded\")}\n </div>\n <div\n className=\"oui-max-w-[382px] oui-w-full oui-h-[1px] oui-bg-gradient-to-r oui-from-[rgba(var(--oui-gradient-brand-start))]\n oui-to-[rgba(var(--oui-gradient-brand-end)/0)]\"\n />\n </div>\n );\n }\n\n const titleText = isStarted\n ? t(\"tradingLeaderboard.battleEndsIn\")\n : t(\"tradingLeaderboard.battleStartsIn\");\n\n // Time units configuration\n const timeUnits = [\n { value: timeLeft.days, label: \"Days\" },\n { value: timeLeft.hours, label: \"Hours\" },\n { value: timeLeft.minutes, label: \"Minutes\" },\n { value: timeLeft.seconds, label: \"Seconds\" },\n ];\n\n return (\n <div className=\"oui-w-full oui-flex oui-items-center oui-justify-center oui-gap-4\">\n <div\n className=\"oui-max-w-[298px] oui-w-full oui-h-[1px] oui-bg-gradient-to-r oui-from-[rgba(var(--oui-gradient-brand-end)/0)]\n oui-to-[rgba(var(--oui-gradient-brand-start))]\"\n />\n <div\n className={cn([\n \"oui-flex oui-flex-col oui-items-center\",\n isMobile ? \"oui-p-0 oui-gap-1\" : \"oui-p-5 oui-gap-2\",\n ])}\n >\n <div\n className={cn([\n \"oui-trading-leaderboard-title oui-font-medium oui-text-base-contrast-54\",\n isMobile\n ? \"oui-text-[14px] oui-leading-[20px] oui-h-[20px]\"\n : \"oui-text-[18px] oui-leading-[26px] oui-h-[26px]\",\n ])}\n >\n {titleText}\n </div>\n <div\n className={cn([\n \"oui-flex oui-items-center\",\n isMobile ? \"oui-gap-2\" : \"oui-gap-[10px]\",\n ])}\n >\n {timeUnits.map((unit, index) => (\n <div\n key={unit.label}\n className={cn([\n \"oui-flex oui-items-center\",\n isMobile ? \"oui-gap-2\" : \"oui-gap-[10px]\",\n ])}\n >\n <TimeUnit\n value={unit.value}\n label={unit.label}\n isMobile={isMobile}\n />\n {index < timeUnits.length - 1 && <Circle />}\n </div>\n ))}\n </div>\n </div>\n <div\n className=\"oui-max-w-[298px] oui-w-full oui-h-[1px] oui-bg-gradient-to-r oui-from-[rgba(var(--oui-gradient-brand-start))]\n oui-to-[rgba(var(--oui-gradient-brand-end)/0)]\"\n />\n </div>\n );\n};\n","import { FC, useCallback, useState, useEffect } from \"react\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n useEmblaCarousel,\n} from \"@kodiak-finance/orderly-ui\";\nimport { DefaultCampaign } from \"../DefaultCampaign\";\nimport { CampaignItemUI } from \"../campaign.item.ui\";\nimport { CampaignConfig } from \"../type\";\nimport { getCampaignTag } from \"../utils\";\n\nexport const CampaignsHeaderUI: FC<{\n campaigns: CampaignConfig[];\n currentCampaignId: string;\n onCampaignChange: (campaignId: string) => void;\n backgroundSrc?: string;\n}> = ({ campaigns, currentCampaignId, onCampaignChange, backgroundSrc }) => {\n const [isLargeScreen, setIsLargeScreen] = useState(false);\n const [canScrollPrev, setCanScrollPrev] = useState(false);\n const [canScrollNext, setCanScrollNext] = useState(false);\n\n useEffect(() => {\n const checkScreenSize = () => {\n setIsLargeScreen(window.innerWidth >= 1024);\n };\n\n // Check initial size\n checkScreenSize();\n\n // Add event listener\n window.addEventListener(\"resize\", checkScreenSize);\n\n // Cleanup\n return () => window.removeEventListener(\"resize\", checkScreenSize);\n }, []);\n\n const [emblaRef, emblaApi] = useEmblaCarousel({\n loop: false,\n align: \"start\",\n containScroll: \"keepSnaps\",\n slidesToScroll: 1,\n skipSnaps: false,\n dragFree: false,\n });\n\n // Update scroll availability\n const updateScrollAvailability = useCallback(() => {\n if (!emblaApi || !campaigns?.length) {\n return;\n }\n\n setCanScrollPrev(emblaApi.canScrollPrev());\n\n // Check if the last slide is in view\n const slidesInView = emblaApi.slidesInView();\n const lastSlideIndex = campaigns.length - 1;\n const isLastSlideInView = slidesInView.includes(lastSlideIndex);\n\n setCanScrollNext(emblaApi.canScrollNext() && !isLastSlideInView);\n }, [emblaApi, campaigns]);\n\n useEffect(() => {\n if (!emblaApi) {\n return;\n }\n\n // Initial check\n updateScrollAvailability();\n\n // Listen for scroll events\n emblaApi.on(\"select\", updateScrollAvailability);\n emblaApi.on(\"reInit\", updateScrollAvailability);\n emblaApi.on(\"scroll\", updateScrollAvailability);\n\n return () => {\n emblaApi.off(\"select\", updateScrollAvailability);\n emblaApi.off(\"reInit\", updateScrollAvailability);\n emblaApi.off(\"scroll\", updateScrollAvailability);\n };\n }, [emblaApi, updateScrollAvailability]);\n\n const scrollPrev = useCallback(() => {\n if (emblaApi) emblaApi.scrollPrev();\n }, [emblaApi]);\n\n const scrollNext = useCallback(() => {\n if (emblaApi) emblaApi.scrollNext();\n }, [emblaApi]);\n\n // Calculate width considering gap (0.5rem = 8px)\n // For 2 items: (100% - 1 * gap) / 2\n // For 3 items: (100% - 2 * gap) / 3\n const slideStyle = isLargeScreen\n ? { flexBasis: \"calc((100% - 2rem) / 4)\", width: \"calc((100% - 2rem) / 4)\" }\n : {\n flexBasis: \"calc((100% - 1rem) / 3)\",\n width: \"calc((100% - 1rem) / 3)\",\n };\n\n // Check if scroll buttons should be hidden based on screen size and campaign count\n const shouldHideScrollButtons = isLargeScreen\n ? campaigns.length <= 4\n : campaigns.length <= 3;\n\n return (\n <div className=\"oui-flex oui-w-full oui-items-center oui-gap-2 oui-px-6\">\n <div className=\"oui-shrink-0\">\n <DefaultCampaign\n currentCampaignId={currentCampaignId}\n onCampaignChange={onCampaignChange}\n className=\"oui-min-w-[322px]\"\n />\n </div>\n\n <div className=\"oui-h-[78px] oui-w-px oui-bg-white/[0.16]\" />\n\n <button\n onClick={scrollPrev}\n disabled={!canScrollPrev}\n className={`oui-group oui-flex oui-h-[78px] oui-w-6 oui-shrink-0 oui-items-center oui-justify-center oui-rounded-lg oui-transition-colors hover:oui-bg-base-7 disabled:oui-cursor-not-allowed disabled:oui-opacity-30 disabled:hover:oui-bg-transparent ${shouldHideScrollButtons ? \"oui-hidden\" : \"\"}`}\n aria-label=\"Previous campaigns\"\n >\n <ChevronLeftIcon\n opacity={1}\n className=\"oui-text-base-contrast-54 group-hover:oui-text-base-contrast\"\n />\n </button>\n\n <div className=\"oui-min-w-0 oui-flex-1 oui-overflow-hidden\">\n <div ref={emblaRef}>\n <div className=\"oui-flex oui-gap-2\">\n {campaigns?.map((campaign) => (\n <div\n key={campaign.campaign_id}\n className=\"oui-shrink-0\"\n style={slideStyle}\n >\n <CampaignItemUI\n backgroundSrc={backgroundSrc}\n campaign={campaign}\n tag={getCampaignTag(campaign)}\n active={currentCampaignId == campaign.campaign_id}\n onCampaignChange={onCampaignChange}\n classNames={{\n tag: {\n container: \"oui-h-[23px] oui-py-1 oui-px-2\",\n },\n }}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n <button\n onClick={scrollNext}\n disabled={!canScrollNext}\n className={`oui-group oui-flex oui-h-[78px] oui-w-6 oui-shrink-0 oui-items-center oui-justify-center oui-rounded-lg oui-transition-colors hover:oui-bg-base-7 disabled:oui-cursor-not-allowed disabled:oui-opacity-30 disabled:hover:oui-bg-transparent ${shouldHideScrollButtons ? \"oui-hidden\" : \"\"}`}\n aria-label=\"Next campaigns\"\n >\n <ChevronRightIcon\n opacity={1}\n className=\"oui-text-base-contrast-54 group-hover:oui-text-base-contrast\"\n />\n </button>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\n\nexport const DefaultCampaign: FC<{\n currentCampaignId: string;\n onCampaignChange: (campaignId: string) => void;\n style?: React.CSSProperties;\n className?: string;\n}> = ({ currentCampaignId, onCampaignChange, style, className }) => {\n const { t } = useTranslation();\n return (\n <div\n className={cn([\n \"oui-trading-leaderboard-title\",\n \"oui-flex oui-items-center oui-justify-center oui-cursor-pointer\",\n \"oui-bg-base-9 oui-h-[78px] oui-rounded-lg oui-border oui-border-solid\",\n currentCampaignId === \"general\"\n ? \"oui-border-[rgba(var(--oui-gradient-brand-start))]\"\n : \"oui-border-transparent\",\n className,\n ])}\n style={style}\n onClick={() => onCampaignChange(\"general\")}\n >\n {t(\"tradingLeaderboard.generalLeaderboard\")}\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { cn, Text } from \"@kodiak-finance/orderly-ui\";\nimport { CampaignConfig, CampaignTagEnum } from \"./type\";\nimport { formatParticipantsCount, getTotalPrizePool } from \"./utils\";\n\ninterface CampaignItemUIProps {\n className?: string;\n active?: boolean;\n tag: CampaignTagEnum;\n onCampaignChange: (campaignId: string) => void;\n campaign: CampaignConfig;\n backgroundSrc?: string;\n classNames?: {\n container?: string;\n content?: string;\n tag?: {\n container?: string;\n text?: string;\n };\n title?: string;\n };\n}\n\nexport const CampaignItemUI: FC<CampaignItemUIProps> = ({\n active,\n tag,\n onCampaignChange,\n campaign,\n backgroundSrc,\n classNames,\n}) => {\n const totalPrizePool = getTotalPrizePool(campaign);\n const formattedPrice = formatParticipantsCount(\n totalPrizePool?.amount || 0,\n 0,\n );\n\n return (\n <div\n className={cn([\n \"oui-w-full\",\n \"oui-relative oui-h-[78px] oui-cursor-pointer oui-overflow-hidden oui-rounded-lg oui-bg-white/[0.04]\",\n \"oui-group oui-border oui-border-solid oui-backdrop-blur-[200px]\",\n active\n ? \"oui-border-[rgba(var(--oui-gradient-brand-start))]\"\n : \"oui-border-transparent\",\n \"hover:oui-border-base-contrast\",\n classNames?.container,\n ])}\n onClick={() => onCampaignChange(campaign.campaign_id.toString())}\n >\n <CampaignTag tag={tag} active={active} classNames={classNames?.tag} />\n <PriceTag price={formattedPrice} active={active} />\n <div\n className={cn([\n \"oui-size-full\",\n \"oui-absolute oui-left-0 oui-top-0\",\n \"oui-bg-cover oui-bg-center oui-bg-no-repeat oui-bg-blend-luminosity\",\n active ? \"oui-bg-transparent\" : \"oui-bg-[lightgray] oui-opacity-40\",\n \"group-hover:oui-bg-transparent group-hover:oui-opacity-100\",\n ])}\n style={{\n backgroundImage: `url(${campaign?.image || backgroundSrc})`,\n }}\n />\n <div\n className={cn([\n \"oui-flex oui-size-full oui-flex-col oui-items-center oui-justify-center oui-gap-1\",\n \"oui-absolute oui-left-0 oui-top-0 oui-z-10\",\n classNames?.content,\n ])}\n >\n <Text\n weight=\"semibold\"\n className={cn([\n active ? \"oui-text-base-contrast\" : \"oui-text-base-contrast-54\",\n \"group-hover:oui-text-base-contrast\",\n \"oui-trading-leaderboard-title\",\n \"oui-w-3/5 oui-text-center oui-text-sm\",\n classNames?.title,\n ])}\n >\n {campaign.title}\n </Text>\n {campaign.referral_codes && (\n <Text\n className={cn([\n \"oui-text-base-contrast-54\",\n \"oui-text-center oui-text-[10px]\",\n ])}\n >\n {Array.isArray(campaign.referral_codes)\n ? campaign.referral_codes.join(\",\")\n : campaign.referral_codes}\n </Text>\n )}\n </div>\n </div>\n );\n};\n\nconst CampaignTag: FC<{\n tag: CampaignTagEnum;\n active?: boolean;\n classNames?: {\n container?: string;\n text?: string;\n };\n}> = ({ tag, active, classNames }) => {\n const tagText = tag.slice(0, 1).toUpperCase() + tag.slice(1);\n return (\n <div\n className={cn([\n \"oui-w-fit oui-rounded-br-lg\",\n \"oui-absolute oui-left-0 oui-top-0 oui-z-10 oui-flex oui-items-center\",\n active && tag !== CampaignTagEnum.COMING\n ? \"oui-bg-[rgba(var(--oui-gradient-brand-start))]\"\n : \"oui-bg-base-4\",\n active && tag !== CampaignTagEnum.ENDED && \"group-hover:oui-bg-base-4\",\n tag === CampaignTagEnum.ENDED &&\n \"oui-bg-base-6 group-hover:oui-bg-base-6\",\n classNames?.container,\n ])}\n >\n {tag === CampaignTagEnum.ENDED ? (\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className={cn([\"oui-text-base-contrast-54\", classNames?.text])}\n >\n {tagText}\n </Text>\n ) : (\n <Text.gradient\n size=\"2xs\"\n weight=\"semibold\"\n color=\"brand\"\n className={cn([\n active &&\n tag !== CampaignTagEnum.COMING &&\n \"oui-text-black/[0.88] group-hover:oui-text-transparent\",\n classNames?.text,\n ])}\n >\n {tagText}\n </Text.gradient>\n )}\n </div>\n );\n};\n\nconst PriceTag = ({ price, active }: { price: string; active?: boolean }) => {\n return (\n <div\n className={cn([\n \"oui-flex oui-h-[18px] oui-items-center oui-gap-0.5 oui-rounded-lg oui-bg-[rgba(255,169,64,0.70)] oui-px-1 oui-py-0.5 oui-backdrop-blur-[2px]\",\n \"oui-absolute oui-right-1 oui-top-1 oui-z-10 oui-flex oui-items-center\",\n active ? \"oui-opacity-100\" : \"oui-opacity-60\",\n ])}\n >\n <LeaderboardTotalPrice />\n <Text\n size=\"2xs\"\n className={cn(\n \"oui-trading-leaderboard-title oui-font-medium oui-text-base-contrast\",\n )}\n >\n {price}\n </Text>\n </div>\n );\n};\n\nconst LeaderboardTotalPrice = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n >\n <path\n d=\"M3.2 9.5C2.44167 9.5 1.80208 9.23958 1.28125 8.71875C0.760417 8.19792 0.5 7.55833 0.5 6.8C0.5 6.48333 0.554167 6.175 0.6625 5.875C0.770833 5.575 0.925 5.30417 1.125 5.0625L2.9 2.925L1.6875 0.5H8.3125L7.1 2.925L8.875 5.0625C9.075 5.30417 9.22917 5.575 9.3375 5.875C9.44583 6.175 9.5 6.48333 9.5 6.8C9.5 7.55833 9.2375 8.19792 8.7125 8.71875C8.1875 9.23958 7.55 9.5 6.8 9.5H3.2ZM5 7C4.725 7 4.48958 6.90208 4.29375 6.70625C4.09792 6.51042 4 6.275 4 6C4 5.725 4.09792 5.48958 4.29375 5.29375C4.48958 5.09792 4.725 5 5 5C5.275 5 5.51042 5.09792 5.70625 5.29375C5.90208 5.48958 6 5.725 6 6C6 6.275 5.90208 6.51042 5.70625 6.70625C5.51042 6.90208 5.275 7 5 7ZM3.8125 2.5H6.1875L6.6875 1.5H3.3125L3.8125 2.5ZM3.2 8.5H6.8C7.275 8.5 7.67708 8.33542 8.00625 8.00625C8.33542 7.67708 8.5 7.275 8.5 6.8C8.5 6.6 8.46458 6.40625 8.39375 6.21875C8.32292 6.03125 8.225 5.8625 8.1 5.7125L6.2625 3.5H3.75L1.9 5.7C1.775 5.85 1.67708 6.02083 1.60625 6.2125C1.53542 6.40417 1.5 6.6 1.5 6.8C1.5 7.275 1.66458 7.67708 1.99375 8.00625C2.32292 8.33542 2.725 8.5 3.2 8.5Z\"\n fill=\"#FFDD45\"\n />\n </svg>\n );\n};\n","import { useCallback, useState, useEffect, memo, useRef } from \"react\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n useEmblaCarousel,\n} from \"@kodiak-finance/orderly-ui\";\nimport { DefaultCampaign } from \"../DefaultCampaign\";\nimport { CampaignItemUI } from \"../campaign.item.ui\";\nimport { CampaignConfig } from \"../type\";\nimport { getCampaignTag } from \"../utils\";\n\nexport const CampaignsHeaderMobileUI = memo<{\n campaigns: CampaignConfig[];\n currentCampaignId: string;\n onCampaignChange: (campaignId: string) => void;\n backgroundSrc?: string;\n}>(({ campaigns, currentCampaignId, onCampaignChange, backgroundSrc }) => {\n const [canScrollPrev, setCanScrollPrev] = useState(false);\n const [canScrollNext, setCanScrollNext] = useState(false);\n const hasInitialScrolled = useRef(false);\n const isInitializing = useRef(true);\n\n const [emblaRef, emblaApi] = useEmblaCarousel({\n loop: false,\n align: \"start\",\n containScroll: \"keepSnaps\",\n slidesToScroll: 1,\n skipSnaps: false,\n dragFree: false,\n });\n\n // All campaign items including default campaign\n const allCampaignItems = [\n { campaign_id: \"general\", isDefault: true },\n ...campaigns.map((campaign) => ({ ...campaign, isDefault: false })),\n ];\n\n // Update scroll availability and handle auto campaign change on slide\n const updateScrollAvailability = useCallback(() => {\n if (!emblaApi || !campaigns?.length) return;\n\n setCanScrollPrev(emblaApi.canScrollPrev());\n setCanScrollNext(emblaApi.canScrollNext());\n\n // Skip auto campaign change during initialization or before initial scroll is completed\n if (isInitializing.current || !hasInitialScrolled.current) return;\n\n // Auto trigger onCampaignChange when slide changes (only after user interaction)\n const selectedIndex = emblaApi.selectedScrollSnap();\n const selectedCampaign = allCampaignItems[selectedIndex];\n\n if (selectedCampaign) {\n const campaignId = selectedCampaign.isDefault\n ? \"general\"\n : String(selectedCampaign.campaign_id);\n if (campaignId != currentCampaignId) {\n onCampaignChange(campaignId);\n }\n }\n }, [\n emblaApi,\n campaigns,\n currentCampaignId,\n onCampaignChange,\n allCampaignItems,\n ]);\n\n // Auto scroll to current campaign on initial load\n const scrollToCurrentCampaign = useCallback(() => {\n if (!emblaApi || !campaigns?.length) {\n return;\n }\n\n const targetIndex = allCampaignItems.findIndex((item) => {\n const campaignId = item.isDefault ? \"general\" : String(item.campaign_id);\n return campaignId === currentCampaignId;\n });\n\n if (targetIndex !== -1 && targetIndex !== emblaApi.selectedScrollSnap()) {\n emblaApi.scrollTo(targetIndex, false); // false to disable animation for initial scroll\n }\n\n // Mark as scrolled and initialized after the scroll operation\n hasInitialScrolled.current = true;\n // Small delay to ensure the scroll operation is completed before enabling auto change\n setTimeout(() => {\n isInitializing.current = false;\n }, 100);\n }, [emblaApi, campaigns, currentCampaignId, allCampaignItems]);\n\n useEffect(() => {\n if (!emblaApi) {\n return;\n }\n\n // Initial check\n updateScrollAvailability();\n\n // Auto scroll to current campaign on initial load\n scrollToCurrentCampaign();\n\n // Listen for scroll events\n emblaApi.on(\"select\", updateScrollAvailability);\n emblaApi.on(\"reInit\", updateScrollAvailability);\n\n return () => {\n emblaApi.off(\"select\", updateScrollAvailability);\n emblaApi.off(\"reInit\", updateScrollAvailability);\n };\n }, [emblaApi, updateScrollAvailability, scrollToCurrentCampaign]);\n\n // Reset scroll flag when currentCampaignId changes externally\n useEffect(() => {\n hasInitialScrolled.current = false;\n isInitializing.current = true;\n if (emblaApi) {\n scrollToCurrentCampaign();\n }\n }, [currentCampaignId, scrollToCurrentCampaign, emblaApi]);\n\n const scrollPrev = useCallback(() => {\n if (emblaApi) {\n // Enable auto campaign change after user interaction\n isInitializing.current = false;\n emblaApi.scrollPrev();\n }\n }, [emblaApi]);\n\n const scrollNext = useCallback(() => {\n if (emblaApi) {\n // Enable auto campaign change after user interaction\n isInitializing.current = false;\n emblaApi.scrollNext();\n }\n }, [emblaApi]);\n\n // Mobile shows one item at full width\n const slideStyle = { flexBasis: \"100%\", width: \"100%\", height: \"42px\" };\n\n // Hide scroll buttons when there's only one or no campaigns\n const shouldHideScrollButtons = campaigns.length < 1;\n\n return (\n <div className=\"oui-flex oui-w-full oui-items-center oui-gap-2 oui-px-3\">\n <button\n onClick={scrollPrev}\n disabled={!canScrollPrev}\n className={`oui-group oui-flex oui-h-[42px] oui-w-6 oui-shrink-0 oui-items-center oui-justify-center oui-rounded-lg oui-transition-colors hover:oui-bg-base-7 disabled:oui-cursor-not-allowed disabled:oui-opacity-30 disabled:hover:oui-bg-transparent ${shouldHideScrollButtons ? \"oui-hidden\" : \"\"}`}\n aria-label=\"Previous campaigns\"\n >\n <ChevronLeftIcon\n opacity={1}\n className=\"oui-text-base-contrast-54 group-hover:oui-text-base-contrast\"\n />\n </button>\n\n <div className=\"oui-min-w-0 oui-flex-1 oui-overflow-hidden\">\n <div ref={emblaRef}>\n <div className=\"oui-flex oui-gap-2\">\n <DefaultCampaign\n key=\"general_campaign\"\n currentCampaignId={currentCampaignId}\n onCampaignChange={onCampaignChange}\n style={slideStyle}\n className=\"oui-w-full oui-shrink-0\"\n />\n {campaigns?.map((campaign) => (\n <div\n key={campaign.campaign_id}\n className=\"oui-shrink-0\"\n style={slideStyle}\n >\n <CampaignItemUI\n backgroundSrc={backgroundSrc}\n campaign={campaign}\n tag={getCampaignTag(campaign)}\n active={currentCampaignId == campaign.campaign_id}\n onCampaignChange={onCampaignChange}\n classNames={{\n container: \"!oui-h-[42px]\",\n title: \"!oui-text-[10px]\",\n content: \"!oui-gap-[2px]\",\n tag: {\n container: \"!oui-h-[14px] !oui-px-1 !oui-py-[2px]\",\n text: \"!oui-text-[10px]\",\n },\n }}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n <button\n onClick={scrollNext}\n disabled={!canScrollNext}\n className={`oui-group oui-flex oui-h-[42px] oui-w-6 oui-shrink-0 oui-items-center oui-justify-center oui-rounded-lg oui-transition-colors hover:oui-bg-base-7 disabled:oui-cursor-not-allowed disabled:oui-opacity-30 disabled:hover:oui-bg-transparent ${shouldHideScrollButtons ? \"oui-hidden\" : \"\"}`}\n aria-label=\"Next campaigns\"\n >\n <ChevronRightIcon\n opacity={1}\n className=\"oui-text-base-contrast-54 group-hover:oui-text-base-contrast\"\n />\n </button>\n </div>\n );\n});\n","import { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { CampaignConfig } from \"../type\";\nimport { CampaignsHeaderUI } from \"./campaigns.header.desktop.ui\";\nimport { CampaignsHeaderMobileUI } from \"./campaigns.header.mobile.ui\";\n\nexport const CampaignsHeaderWidget = (props: {\n campaigns: CampaignConfig[];\n currentCampaignId: string;\n onCampaignChange: (campaignId: string) => void;\n backgroundSrc?: string;\n totalPrizePool?: { amount: number; currency: string };\n}) => {\n const { isMobile } = useScreen();\n return isMobile ? (\n <CampaignsHeaderMobileUI {...props} />\n ) : (\n <CampaignsHeaderUI {...props} />\n );\n};\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 parseTimeRange,\n} from \"../../../utils\";\n\nexport type GeneralLeaderboardIScriptReturn = ReturnType<\n typeof useGeneralLeaderboardIScript\n>;\n\nexport const FilterDays = [7, 14, 30, 90] as const;\nexport type TFilterDays = (typeof FilterDays)[number];\n\nexport type GeneralLeaderboardIScriptOptions = {\n campaignDateRange?: {\n start_time: Date | string;\n end_time: Date | string;\n };\n weekOneAddresses?: string[];\n timeRange?: {\n from?: string | Date;\n to?: string | Date | \"now\";\n };\n};\n\nexport function useGeneralLeaderboardIScript(\n options?: GeneralLeaderboardIScriptOptions,\n) {\n const { campaignDateRange, timeRange } = 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 parsedTimeRange = useMemo(() => {\n return parseTimeRange(timeRange);\n }, [timeRange]);\n\n const [activeTab, setActiveTab] = useState<LeaderboardTab>(\n LeaderboardTab.Volume,\n );\n const filterState = useFilter({\n defaultRange: currentOrAllTimeRange,\n customTimeRange: parsedTimeRange,\n });\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 weekOneAddresses: options?.weekOneAddresses,\n };\n}\n\nfunction useFilter({\n defaultRange,\n customTimeRange,\n}: {\n defaultRange?: DateRange;\n customTimeRange?: DateRange | null;\n}) {\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 // Use customTimeRange if provided, otherwise fall back to defaultRange or 90 days\n const rangeToUse = customTimeRange || defaultRange || getDateRange(90);\n setDateRange(rangeToUse);\n\n if (customTimeRange && rangeToUse?.from && rangeToUse?.to) {\n const offsetDay =\n Math.abs(differenceInDays(rangeToUse.from, rangeToUse.to)) + 1;\n if (FilterDays.includes(offsetDay as TFilterDays)) {\n setFilterDay(offsetDay as TFilterDays);\n } else {\n setFilterDay(null);\n }\n }\n }, [defaultRange, customTimeRange]);\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 { FC, useMemo } from \"react\";\nimport { cn, Box, useScreen, Divider } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTab } from \"../../../type\";\nimport { GeneralRankingWidget } from \"../../ranking128/generalRanking\";\nimport { RankingColumnFields } from \"../../ranking128/shared/column\";\nimport { LeaderboardFilter } from \"../shared/LeaderboardFilter\";\nimport { LeaderboardTabs } from \"../shared/LeaderboardTabs\";\nimport { GeneralLeaderboardIScriptReturn } from \"./generalLeaderboard.script\";\n\nexport type GeneralLeaderboardIProps = {\n style?: React.CSSProperties;\n className?: string;\n campaignDateRange?: {\n start_time: Date | string;\n end_time: Date | string;\n };\n weekOneAddresses?: string[];\n timeRange?: {\n from?: string | Date;\n to?: string | Date | \"now\";\n };\n} & GeneralLeaderboardIScriptReturn;\n\nexport const GeneralLeaderboardI: FC<GeneralLeaderboardIProps> = (props) => {\n const { isMobile } = useScreen();\n\n const fields = useMemo<RankingColumnFields[]>(() => {\n if (isMobile) {\n return [\n \"rank\",\n \"address\",\n props.activeTab === LeaderboardTab.Volume ? \"volume\" : \"pnl\",\n ];\n }\n return [\"rank\", \"address\", \"volume\", \"pnl\"];\n }, [isMobile, props.activeTab]);\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 <LeaderboardFilter {...props} />\n <LeaderboardTabs\n isMobile={isMobile}\n className=\"oui-pt-0\"\n activeTab={props.activeTab}\n onTabChange={props.onTabChange}\n />\n\n <GeneralRankingWidget\n weekOneAddresses={props.weekOneAddresses}\n dateRange={props.dateRange}\n address={props.searchValue}\n sortKey={\n props.activeTab === LeaderboardTab.Volume\n ? \"perp_volume\"\n : \"realized_pnl\"\n }\n fields={fields}\n />\n </Box>\n );\n }\n\n return (\n <Box\n pt={2}\n pb={6}\n px={6}\n r=\"2xl\"\n intensity={900}\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 <LeaderboardFilter {...props} />\n <Divider intensity={8} />\n\n <GeneralRankingWidget\n weekOneAddresses={props.weekOneAddresses}\n dateRange={props.dateRange}\n address={props.searchValue}\n fields={fields}\n />\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 \"@kodiak-finance/orderly-ui\";\nimport { type CampaignRankingData } from \"../campaignRanking/campaignRanking.script\";\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 | CampaignRankingData;\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 typeof props.onSort === \"function\",\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 (\n column: TanstackColumn<RankingData>,\n record: RankingData,\n index: number,\n ) => {\n const isFirstColumn = column.getIsFirstColumn();\n const isLastColumn = column.getIsLastColumn();\n const isRank = [1, 2, 3].includes(record.rank as number);\n if (record.key === getCurrentAddressRowKey(props.address!)) {\n return {\n className: cn(\n \"after:oui-absolute after:oui-h-[40px] after:oui-w-full md:after:oui-h-[48px]\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \"after:oui-left-0 after:oui-top-[2px] after:oui-z-[-1]\",\n \"after:oui-border-y\",\n isFirstColumn && \"after:oui-rounded-l-lg after:oui-border-l\",\n isLastColumn && \"after:oui-rounded-r-lg after:oui-border-r\",\n ),\n };\n }\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 // style: isRank\n // ? {\n // position: \"unset\",\n // }\n // : undefined,\n };\n },\n [props.address],\n );\n\n if (isMobile) {\n return (\n <>\n <DataTable\n classNames={{\n root: \"oui-trading-leaderboard-ranking-table\",\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 initialSort={props.initialSort}\n onSort={props.onSort}\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 initialSort={props.initialSort}\n onSort={props.onSort}\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-h-[calc(100%_-_53px_-_8px)]\",\n ),\n scroll: \"oui-min-h-[600px] oui-max-h-[1250px]\",\n }}\n onRow={onRow}\n onCell={onCell}\n />\n );\n};\n","import { ReactNode, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Text,\n Column,\n Box,\n useScreen,\n cn,\n toast,\n} from \"@kodiak-finance/orderly-ui\";\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 =\n | \"rank\"\n | \"address\"\n | \"volume\"\n | \"pnl\"\n | \"rewards\";\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 let linearGradientText;\n\n if (!isYou) {\n if (record.rank === 1) {\n linearGradientText =\n \"linear-gradient(169deg, #FBE67B 2.09%, #FCFBE7 15.8%, #F7D14E 40.73%, #D4A041 58.8%)\";\n } else if (record.rank === 2) {\n linearGradientText =\n \"linear-gradient(201.05deg, #D9D9D9 38.79%, #F7F6F4 53.85%, #D9D9D9 71.71%, #7F7F7F 91.87%), rgba(255, 255, 255, 0.8)\";\n } else if (record.rank === 3) {\n linearGradientText =\n \"linear-gradient(149.05deg, #B6947E 15.63%, #F8DAC8 31.37%, #B6947E 44.29%, #F8DCCB 56.6%), rgba(255, 255, 255, 0.8)\";\n }\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 copyable\n onCopy={(e) => {\n e.preventDefault();\n e.stopPropagation();\n navigator.clipboard.writeText(value);\n toast.success(t(\"common.copy.copied\"));\n }}\n // style={\n // linearGradientText\n // ? {\n // background: linearGradientText,\n // WebkitBackgroundClip: \"text\",\n // WebkitTextFillColor: \"transparent\",\n // backgroundClip: \"text\",\n // }\n // : {}\n // }\n className=\"oui-cursor-pointer oui-underline oui-decoration-line-16 oui-decoration-dashed oui-underline-offset-4\"\n >\n {value}\n </Text.formatted>\n {isYou && <Text> (You)</Text>}\n </a>\n </>\n );\n },\n width: 90,\n },\n {\n title: t(\"tradingLeaderboard.tradingVolume\"),\n dataIndex: \"volume\",\n onSort: enableSort,\n align: isMobile ? \"right\" : \"left\",\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2}>\n {value}\n </Text.numeral>\n );\n },\n width: 105,\n },\n {\n title: t(\"common.pnl\"),\n dataIndex: \"pnl\",\n onSort: enableSort,\n align: isMobile ? \"right\" : \"left\",\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2} coloring>\n {value}\n </Text.numeral>\n );\n },\n width: 90,\n },\n {\n title: t(\"tradingLeaderboard.estimatedRewards\"),\n dataIndex: \"rewards\",\n align: isMobile ? \"right\" : \"left\",\n render: (value: { amount: number; currency: string }) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral\n suffix={` ${value?.currency || \"\"}`}\n rule=\"price\"\n dp={0}\n >\n {value?.amount}\n </Text.numeral>\n );\n },\n width: 90,\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, useState } from \"react\";\nimport { useAccount, useQuery } from \"@kodiak-finance/orderly-hooks\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { TableSort, usePagination, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useEndReached } from \"../../../hooks/useEndReached\";\nimport { DateRange } from \"../../../type\";\nimport { getDateRange } from \"../../../utils\";\nimport { CampaignStatistics } from \"../../campaigns/type\";\nimport { useTradingLeaderboardContext } from \"../../provider\";\nimport { getCurrentAddressRowKey, isSameAddress } from \"../shared/util\";\n\nconst CAMPAIGN_IDS = [\"129\", \"136\", \"131\", \"132\", \"133\", \"134\"];\n\nexport type GeneralRankingData = {\n account_id: string;\n address: string;\n broker_fee: number;\n date: string;\n perp_maker_volume: number;\n perp_taker_volume: number;\n perp_volume: number;\n realized_pnl: number;\n total_fee: number;\n\n // custom field\n key?: string;\n rank?: number | string;\n volume?: number;\n pnl?: number;\n};\n\nexport type GeneralRankingResponse = {\n meta: API.RecordsMeta;\n rows: GeneralRankingData[];\n};\nexport type GeneralRankingScriptReturn = ReturnType<\n typeof useGeneralRankingScript\n>;\n\nexport type GeneralRankingScriptOptions = {\n dateRange?: DateRange | null;\n address?: string;\n sortKey?: \"perp_volume\" | \"realized_pnl\";\n weekOneAddresses?: string[];\n};\n\nexport function useGeneralRankingScript(options?: GeneralRankingScriptOptions) {\n const {\n dateRange = getDateRange(90),\n address: searchValue,\n sortKey = \"perp_volume\",\n weekOneAddresses,\n } = options || {};\n\n const [initialSort] = useState<TableSort>({\n sortKey,\n sort: \"desc\",\n });\n\n const [sort, setSort] = useState<TableSort | undefined>(initialSort);\n\n const { state } = useAccount();\n\n const { setStatistics } = useTradingLeaderboardContext();\n\n const { isMobile } = useScreen();\n\n const { page, pageSize, setPage, parsePagination } = usePagination({\n pageSize: 500,\n });\n\n const { campaignRankingList, filteredCampaignData, isLoading } =\n useCampaignRankingList({\n dateRange,\n sort,\n searchValue,\n weekOneAddresses,\n setStatistics,\n });\n\n const getAddressRank = useCallback(\n (address: string) => {\n const index = filteredCampaignData?.findIndex((item) =>\n isSameAddress(item.address, address!),\n );\n return index !== -1 ? index! + 1 : \"-\";\n },\n [filteredCampaignData],\n );\n\n const userDataList = useMemo(() => {\n if (!state.address) {\n return [];\n }\n\n const targetAddress = filteredCampaignData?.find((item) =>\n isSameAddress(item.address, state.address!),\n );\n\n if (!targetAddress) {\n return [];\n }\n\n return [\n {\n ...targetAddress,\n rank: getAddressRank(targetAddress!.address!),\n key: getCurrentAddressRowKey(targetAddress!.address!),\n },\n ];\n }, [state.address, getAddressRank, filteredCampaignData]);\n\n const addRankForList = useCallback(\n (list: GeneralRankingData[], total: number) => {\n return list?.map((item, index) => {\n let rank: string | number = index + 1;\n\n if (searchValue) {\n rank = getAddressRank(item.address);\n } else {\n if (sort?.sort === \"asc\") {\n rank = total - index;\n } else if (sort?.sort === \"desc\") {\n rank = index + 1;\n }\n }\n\n return {\n ...item,\n rank,\n };\n });\n },\n [page, pageSize, sort, searchValue, getAddressRank],\n );\n\n const dataSource = useMemo(() => {\n let list: GeneralRankingData[] =\n filteredCampaignData as GeneralRankingData[];\n // hardcode for 128 campaign\n\n if (page === 1) {\n list = list.slice(0, pageSize);\n }\n const total = list.length;\n\n const rankList = addRankForList(list, total);\n\n if (page === 1 && !searchValue) {\n return formatData([...userDataList, ...rankList]);\n }\n return formatData(rankList);\n }, [\n page,\n pageSize,\n userDataList,\n searchValue,\n addRankForList,\n campaignRankingList,\n filteredCampaignData,\n ]);\n\n const dataList = useMemo(() => {\n let total = filteredCampaignData?.length || 0;\n let flatList = filteredCampaignData as GeneralRankingData[];\n if (campaignRankingList && campaignRankingList.length > 0) {\n if (filteredCampaignData) {\n flatList = filteredCampaignData as GeneralRankingData[];\n total = filteredCampaignData.length;\n } else {\n flatList = flatList.filter((item) =>\n campaignRankingList.includes(item.address),\n );\n total = flatList.length;\n }\n }\n const rankList = addRankForList(flatList, total);\n\n if (!searchValue) {\n return formatData([...userDataList, ...rankList]);\n }\n return formatData(rankList);\n }, [\n userDataList,\n searchValue,\n addRankForList,\n campaignRankingList,\n filteredCampaignData,\n ]);\n\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n const pagination = useMemo(\n () =>\n parsePagination({\n total: dataSource?.length,\n current_page: 1,\n records_per_page: pageSize,\n }),\n [pageSize, dataSource],\n );\n\n useEndReached(sentinelRef, () => {\n if (isMobile) {\n setPage(page + 1);\n }\n });\n\n const onSort = useCallback(\n (sort?: TableSort) => {\n // befause table column dataIndex is not the same as the api sort, so we need to map the sortKey\n if (sort?.sortKey === \"volume\") {\n sort.sortKey = \"perp_volume\";\n } else if (sort?.sortKey === \"pnl\") {\n sort.sortKey = \"realized_pnl\";\n }\n // fix for mobile sort\n setSort((_sort) => {\n if (sort) return sort;\n return isMobile\n ? { sortKey: _sort?.sortKey || \"\", sort: \"desc\" }\n : initialSort;\n });\n },\n [initialSort, isMobile],\n );\n\n useEffect(() => {\n if (searchValue) {\n setPage(1);\n }\n }, [searchValue]);\n\n useEffect(() => {\n setPage(1);\n }, [state.address]);\n\n useEffect(() => {\n if (dateRange?.to && dateRange?.from) {\n setPage(1);\n }\n }, [dateRange]);\n\n useEffect(() => {\n setSort({ sortKey, sort: \"desc\" });\n }, [sortKey]);\n\n return {\n pagination,\n initialSort,\n onSort,\n dataSource,\n isLoading,\n isMobile,\n sentinelRef,\n dataList,\n address: state.address,\n };\n}\n\nfunction formatData(data: any[]) {\n return data.map((item) => ({\n ...item,\n volume: item.perp_volume,\n pnl: item.realized_pnl,\n }));\n}\n\n// for 128 campaign hardcode\nconst useCampaignRankingList = ({\n dateRange,\n sort,\n searchValue,\n weekOneAddresses,\n setStatistics,\n}: {\n dateRange: DateRange | null;\n sort?: TableSort;\n searchValue?: string;\n weekOneAddresses?: string[];\n setStatistics: any;\n}) => {\n const [allCampaignData, setAllCampaignData] = useState<any[]>([]);\n const getUrl = (campaignId: string) => {\n const searchParams = new URLSearchParams();\n searchParams.set(\"campaign_id\", campaignId);\n searchParams.set(\"page\", \"1\");\n searchParams.set(\"size\", \"2000\");\n searchParams.set(\"aggregate_by\", \"address\");\n\n return `https://api.orderly.org/v1/public/campaign/ranking?${searchParams.toString()}`;\n };\n\n useEffect(() => {\n const urls = CAMPAIGN_IDS.map((campaignId) => getUrl(campaignId));\n Promise.all(urls.map((url) => fetch(url).then((res) => res.json()))).then(\n (res) => {\n setAllCampaignData(res.map(formatCampaignData));\n },\n );\n }, []);\n\n const { data: campaignData, isLoading: isCampaignDataLoading } = useQuery<\n GeneralRankingResponse[\"rows\"]\n >(getUrl(\"128\"), {\n revalidateOnFocus: false,\n });\n\n const { data, isLoading: isDataLoading } = useQuery<\n GeneralRankingResponse[\"rows\"]\n >(\n dateRange?.label\n ? getUrl(CAMPAIGN_IDS[Number(dateRange.label?.split(\" \")[1]) - 1])\n : null,\n {\n revalidateOnFocus: false,\n },\n );\n\n const campaignRankingList = useMemo(() => {\n if (!dateRange?.label) {\n return undefined;\n }\n return campaignData?.map((item) => item.address) || [];\n }, [campaignData, dateRange]);\n\n useEffect(() => {\n if (allCampaignData.length > 0 && campaignRankingList) {\n const list = weekOneAddresses ? weekOneAddresses : campaignRankingList;\n let totalVolume = 0;\n\n allCampaignData.forEach((item, index) => {\n if (index === 0) {\n const filteredList = item.filter((item: any) =>\n list.includes(item.address),\n );\n totalVolume += filteredList.reduce(\n (acc: number, curr: any) => acc + curr.perp_volume,\n 0,\n );\n } else {\n totalVolume += item.reduce(\n (acc: number, curr: any) => acc + curr.perp_volume,\n 0,\n );\n }\n });\n\n setStatistics((stas: CampaignStatistics) => ({\n ...stas,\n total_volume: totalVolume,\n }));\n }\n }, [allCampaignData, weekOneAddresses, campaignRankingList]);\n\n const isLoading = isCampaignDataLoading || isDataLoading;\n\n const filteredCampaignData = useMemo(() => {\n const list =\n data?.filter((item) => {\n if (dateRange?.label === \"Week 1\") {\n return (\n (weekOneAddresses\n ? weekOneAddresses?.includes(item.address)\n : campaignRankingList?.includes(item.address)) &&\n (searchValue ? isSameAddress(item.address, searchValue) : true)\n );\n }\n return searchValue ? isSameAddress(item.address, searchValue) : true;\n }) || [];\n const newList = list.map((item) => ({\n address: item.address,\n perp_volume: item.volume,\n realized_pnl: item.pnl,\n }));\n\n if (sort) {\n newList.sort((a: any, b: any) => {\n if (sort?.sort === \"asc\") {\n return a?.[sort?.sortKey] - b?.[sort?.sortKey];\n } else if (sort?.sort === \"desc\") {\n return b?.[sort?.sortKey] - a?.[sort?.sortKey];\n }\n return 0;\n });\n }\n return newList;\n }, [\n data,\n campaignRankingList,\n sort,\n dateRange,\n searchValue,\n weekOneAddresses,\n ]);\n\n return { campaignRankingList, filteredCampaignData, isLoading };\n};\n\nconst formatCampaignData = (result: any) => {\n const data = result?.data?.rows || [];\n return data.map((item: any) => ({\n address: item.address,\n perp_volume: item.volume,\n realized_pnl: item.pnl,\n }));\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 { dateRange, address, fields, sortKey, weekOneAddresses, ...rest } =\n props;\n const state = useGeneralRankingScript({\n dateRange,\n address,\n sortKey,\n weekOneAddresses,\n });\n\n return <Ranking {...state} {...rest} fields={fields} />;\n};\n","import { FC, SVGProps } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n CloseCircleFillIcon,\n cn,\n DataFilter,\n Flex,\n Input,\n Text,\n useScreen,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ScrollIndicator } from \"@kodiak-finance/orderly-ui\";\nimport {\n FilterDays,\n GeneralLeaderboardIScriptReturn,\n} from \"../generalLeaderboard/generalLeaderboard.script\";\n\nexport type LeaderboardFilterProps = GeneralLeaderboardIScriptReturn;\n\nexport const LeaderboardFilter: FC<LeaderboardFilterProps> = (props) => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const { useCampaignDateRange, weeklyRanges, setDateRange } = props;\n\n const weeklyView = (\n <Flex gap={3} className={cn(isMobile ? \"oui-h-[24px]\" : \"oui-h-[53px]\")}>\n {weeklyRanges.map((range) => (\n <button\n className=\"oui-relative oui-w-fit oui-whitespace-nowrap oui-px-2 oui-py-[2px] oui-text-sm\"\n key={range.label}\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={\n props.dateRange?.label === range.label ? \"brand\" : undefined\n }\n className={\n props.dateRange?.label !== range.label\n ? \"oui-text-base-contrast-54\"\n : \"\"\n }\n >\n {`${range.label}`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-absolute oui-inset-0 oui-rounded oui-opacity-[.12] oui-gradient-primary\"\n onClick={() => {\n setDateRange(range);\n }}\n ></div>\n </button>\n ))}\n </Flex>\n );\n\n const input = (\n <Input\n value={props.searchValue}\n onValueChange={props.onSearchValueChange}\n placeholder={t(\"common.address.search.placeholder\")}\n className={cn(\n \"oui-trading-leaderboard-trading-search-input\",\n \"oui-w-full\",\n )}\n size=\"sm\"\n prefix={\n <Box pl={3} pr={1}>\n <SearchIcon className=\"oui-text-base-contrast-36\" />\n </Box>\n }\n suffix={\n props.searchValue && (\n <Box mr={2}>\n <CloseCircleFillIcon\n size={14}\n className=\"oui-cursor-pointer oui-text-base-contrast-36\"\n onClick={props.clearSearchValue}\n />\n </Box>\n )\n }\n autoComplete=\"off\"\n />\n );\n\n const dateRangeView = props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[53px] oui-border-none\"\n />\n );\n\n const filterDayView = FilterDays.map((value) => {\n return (\n <button\n className=\"oui-relative oui-px-2 oui-py-[2px] oui-text-sm\"\n key={value}\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={props.filterDay === value ? \"brand\" : undefined}\n className={\n props.filterDay !== value ? \"oui-text-base-contrast-54\" : \"\"\n }\n >\n {`${value}D`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-absolute oui-inset-0 oui-rounded oui-opacity-[.12] oui-gradient-primary\"\n onClick={() => {\n props.updateFilterDay(value as any);\n }}\n ></div>\n </button>\n );\n });\n\n if (isMobile) {\n return (\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n direction=\"column\"\n mt={3}\n className={cn(\"oui-mobile-trading-leaderboard-ranking-filter\")}\n >\n {input}\n\n {useCampaignDateRange ? (\n <Flex gap={3} className=\"oui-w-full oui-py-3\">\n <ScrollIndicator className=\"oui-w-full\">\n {weeklyView}\n </ScrollIndicator>\n </Flex>\n ) : (\n <Flex gap={3} className=\"oui-w-full\">\n {dateRangeView}\n <ScrollIndicator className=\"oui-w-full\">\n <Flex gap={3}>{filterDayView}</Flex>\n </ScrollIndicator>\n </Flex>\n )}\n </Flex>\n );\n }\n\n return (\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n className={cn(\"oui-trading-leaderboard-ranking-filter\")}\n >\n <Flex gap={3}>\n {useCampaignDateRange && weeklyView}\n {!useCampaignDateRange && dateRangeView}\n {!useCampaignDateRange && filterDayView}\n </Flex>\n <Box width={240}>{input}</Box>\n </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { FC, useEffect, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Flex, TabPanel, Tabs } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTab } from \"../../../type\";\nimport { formatUpdateDate } from \"../../../utils\";\nimport { useTradingLeaderboardContext } from \"../../provider\";\n\ntype LeaderboardTabsProps = {\n isMobile?: boolean;\n className?: string;\n activeTab: LeaderboardTab;\n onTabChange: (tab: LeaderboardTab) => void;\n};\n\nexport const LeaderboardTabs: FC<LeaderboardTabsProps> = (props) => {\n const { t } = useTranslation();\n const { updatedTime, currentCampaign } = useTradingLeaderboardContext();\n\n const updateTime = useMemo(() => {\n if (updatedTime && currentCampaign) {\n return formatUpdateDate(updatedTime);\n }\n return \"\";\n }, [props.isMobile, updatedTime, currentCampaign]);\n\n const { showVolume, showPnl } = useMemo(() => {\n const metrics = currentCampaign?.prize_pools?.map((item) => item.metric);\n const isMobileGeneral = props.isMobile && !currentCampaign;\n const showVolume = isMobileGeneral\n ? true\n : metrics?.includes(LeaderboardTab.Volume);\n const showPnl = isMobileGeneral\n ? true\n : metrics?.includes(LeaderboardTab.Pnl);\n\n return {\n showVolume,\n showPnl,\n };\n }, [currentCampaign, props.activeTab, props.isMobile]);\n\n useEffect(() => {\n // set default tab\n if (showVolume && showPnl) {\n props.onTabChange(LeaderboardTab.Volume);\n } else if (showVolume) {\n props.onTabChange(LeaderboardTab.Volume);\n } else if (showPnl) {\n props.onTabChange(LeaderboardTab.Pnl);\n }\n }, [currentCampaign, showVolume, showPnl]);\n\n const renderTabs = () => {\n if (showVolume && showPnl) {\n return (\n <Tabs\n value={props.activeTab}\n onValueChange={props.onTabChange as (tab: string) => void}\n variant=\"contained\"\n size=\"lg\"\n key={currentCampaign?.campaign_id}\n >\n <TabPanel\n title={t(\"tradingLeaderboard.tradingVolume\")}\n value={LeaderboardTab.Volume}\n ></TabPanel>\n <TabPanel\n title={t(\"common.realizedPnl\")}\n value={LeaderboardTab.Pnl}\n ></TabPanel>\n </Tabs>\n );\n }\n\n if (showVolume) {\n return (\n <Tabs\n value={props.activeTab}\n onValueChange={props.onTabChange as (tab: string) => void}\n variant=\"contained\"\n size=\"lg\"\n key={currentCampaign?.campaign_id}\n >\n <TabPanel\n title={t(\"tradingLeaderboard.tradingVolume\")}\n value={LeaderboardTab.Volume}\n ></TabPanel>\n </Tabs>\n );\n }\n\n if (showPnl) {\n return (\n <Tabs\n value={props.activeTab}\n onValueChange={props.onTabChange as (tab: string) => void}\n variant=\"contained\"\n size=\"lg\"\n key={currentCampaign?.campaign_id}\n >\n <TabPanel\n title={t(\"common.realizedPnl\")}\n value={LeaderboardTab.Pnl}\n ></TabPanel>\n </Tabs>\n );\n }\n return <div></div>;\n };\n\n return (\n <Flex\n width=\"100%\"\n py={3}\n justify=\"between\"\n className={cn(\n \"oui-trading-leaderboard-ranking-tabs\",\n \"oui-border-b oui-border-line\",\n props.className,\n )}\n >\n {renderTabs()}\n {/* <Tabs\n value={props.activeTab}\n onValueChange={props.onTabChange as (tab: string) => void}\n variant=\"contained\"\n size=\"lg\"\n >\n <TabPanel\n title=\"Trading volume\"\n value={LeaderboardTab.Volume}\n ></TabPanel>\n <TabPanel title=\"Realized PnL\" value={LeaderboardTab.Pnl}></TabPanel>\n </Tabs> */}\n {updateTime && (\n <Flex\n itemAlign=\"start\"\n direction={props.isMobile ? \"column\" : \"row\"}\n gap={1}\n className={cn(\n props.isMobile ? \"oui-text-3xs\" : \"oui-text-sm\",\n \"oui-text-base-contrast-36\",\n )}\n >\n <span>{t(\"tradingLeaderboard.lastUpdate\")}:</span>\n <span>{updateTime}</span>\n </Flex>\n )}\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport { useGeneralLeaderboardIScript } from \"./generalLeaderboard.script\";\nimport {\n GeneralLeaderboardI,\n GeneralLeaderboardIProps,\n} from \"./generalLeaderboard.ui\";\n\nexport type GeneralLeaderboardIWidgetProps = Pick<\n GeneralLeaderboardIProps,\n \"style\" | \"className\" | \"campaignDateRange\" | \"weekOneAddresses\" | \"timeRange\"\n>;\n\nexport const GeneralLeaderboardIWidget: FC<GeneralLeaderboardIWidgetProps> = (\n props,\n) => {\n const state = useGeneralLeaderboardIScript({\n campaignDateRange: props.campaignDateRange,\n weekOneAddresses: props.weekOneAddresses,\n timeRange: props.timeRange,\n });\n\n return (\n <GeneralLeaderboardI\n {...state}\n className={props.className}\n style={props.style}\n timeRange={props.timeRange}\n />\n );\n};\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTitle } from \"../../pages/leaderboard/page\";\nimport { useCampaignsScript } from \"../campaigns/campaigns.script\";\nimport { RewardsDesktopUI } from \"./rewards.desktop.ui\";\n\nexport const RewardsWidget = () => {\n const state = useCampaignsScript();\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const hideConfig = useMemo(() => {\n return {\n estimatedRewards: state.currentCampaign?.hide_estimated_rewards,\n };\n }, [state.currentCampaign]);\n\n if (\n state.currentCampaignId === \"general\" ||\n state.currentCampaign?.hide_rewards\n ) {\n return null;\n }\n\n return (\n <>\n <LeaderboardTitle\n title={t(\"tradingRewards.rewards\")}\n isMobile={isMobile}\n />\n <RewardsDesktopUI\n campaign={state.currentCampaign}\n userdata={state.userData}\n onLearnMore={state.onLearnMore}\n onTradeNow={state.onTradeNow}\n isMobile={isMobile}\n shouldShowJoinButton={state.shouldShowJoinButton}\n joinCampaign={state.joinCampaign}\n hideConfig={hideConfig}\n />\n </>\n );\n};\n","import { FC, useMemo, useState } from \"react\";\nimport { useTranslation, Trans } from \"@kodiak-finance/orderly-i18n\";\nimport { InfoCircleIcon, Tooltip, Text, Button, cn } from \"@kodiak-finance/orderly-ui\";\nimport { commify } from \"@kodiak-finance/orderly-utils\";\nimport { CampaignConfig, UserData } from \"../campaigns/type\";\nimport {\n calculateEstimatedRewards,\n calculateEstimatedTickets,\n calculateUserPoolReward,\n formatRewardAmount,\n formatTicketCount,\n calculateTicketProgress,\n} from \"./utils\";\n\ninterface RewardsDesktopUIProps {\n campaign?: CampaignConfig;\n userdata?: UserData;\n onLearnMore: () => void;\n onTradeNow: () => void;\n isMobile?: boolean;\n shouldShowJoinButton?: boolean;\n joinCampaign?: (data: { campaign_id: string | number }) => Promise<any>;\n isJoining?: boolean;\n hideConfig?: {\n estimatedRewards?: boolean;\n estimatedTickets?: boolean;\n };\n}\n\nexport const RewardsDesktopUI: FC<RewardsDesktopUIProps> = ({\n campaign,\n userdata,\n onLearnMore,\n onTradeNow,\n isMobile,\n shouldShowJoinButton,\n joinCampaign,\n isJoining,\n hideConfig,\n}) => {\n const { t } = useTranslation();\n // Use mock data for userdata if not provided\n const currentUserData = userdata;\n\n // Calculate estimated rewards\n const estimatedRewards =\n campaign && currentUserData\n ? calculateEstimatedRewards(currentUserData, campaign)\n : null;\n\n // Calculate estimated tickets\n const estimatedTickets =\n campaign?.ticket_rules && currentUserData\n ? calculateEstimatedTickets(currentUserData, campaign.ticket_rules)\n : 0;\n\n const rewardText = estimatedRewards\n ? formatRewardAmount(estimatedRewards.amount, estimatedRewards.currency)\n : \"0 USDC\";\n\n const ticketText = formatTicketCount(estimatedTickets);\n\n const canTrade = useMemo(() => {\n return (\n campaign?.start_time &&\n campaign?.end_time &&\n campaign.start_time < new Date().toISOString() &&\n campaign.end_time > new Date().toISOString()\n );\n }, [campaign]);\n\n const tooltipContent = useMemo(() => {\n // if (!campaign?.prize_pools || !currentUserData) {\n // return null;\n // }\n\n return (\n <div className=\"oui-flex oui-min-w-[240px] oui-flex-col oui-gap-1\">\n {campaign?.prize_pools?.map((pool) => {\n if (pool.tiers.length == 0) {\n return null;\n }\n const userPoolReward = currentUserData\n ? calculateUserPoolReward(currentUserData, pool)\n : 0;\n\n return (\n <div\n key={pool.pool_id}\n className=\"oui-flex oui-h-[18px] oui-items-center oui-justify-between\"\n >\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast-54\"\n >\n {pool.label}\n </Text>\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <Text.numeral\n dp={2}\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast\"\n >\n {userPoolReward}\n </Text.numeral>\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast\"\n >\n {pool.currency}\n </Text>\n </div>\n </div>\n );\n })}\n </div>\n );\n }, [campaign, currentUserData]);\n\n const ticketTooltipContent = useMemo(() => {\n const ticketRules = campaign?.ticket_rules;\n\n if (!ticketRules) {\n return null;\n }\n\n if (ticketRules.mode === \"linear\") {\n return (\n <div>\n {t(\"tradingLeaderboard.earnTickets\", {\n ticket: ticketRules?.linear?.tickets,\n amount: commify(ticketRules?.linear?.every || 0),\n })}\n </div>\n );\n }\n\n return (\n <div className=\"oui-flex oui-min-w-[240px] oui-flex-col oui-gap-1\">\n {ticketRules?.tiers?.map((tier) => {\n return (\n <div\n key={tier.value}\n className=\"h-[18px] oui-flex oui-items-center oui-justify-between oui-text-2xs oui-font-semibold\"\n >\n <Text.numeral\n currency=\"$\"\n suffix=\" volume\"\n dp={0}\n className=\"oui-text-base-contrast-54\"\n >\n {tier.value}\n </Text.numeral>\n <div className=\"oui-text-base-contrast\">\n {tier.tickets} tickets\n </div>\n </div>\n );\n })}\n </div>\n );\n }, [campaign]);\n\n const extraProps = useMemo(() => {\n if (\n !userdata ||\n !campaign?.ticket_rules ||\n campaign.end_time < new Date().toISOString() ||\n campaign.start_time > new Date().toISOString()\n ) {\n return {\n showExtraInfo: false,\n extraInfo: null,\n };\n }\n\n const progress = calculateTicketProgress(userdata, campaign.ticket_rules);\n\n if (!progress) {\n return {\n showExtraInfo: false,\n extraInfo: null,\n };\n }\n\n return {\n showExtraInfo: true,\n extraInfo: progress,\n };\n }, [campaign, userdata]);\n\n return (\n <div\n className={cn([\n \"oui-mx-auto oui-mb-10 oui-flex oui-max-w-[992px] oui-flex-col oui-pb-10\",\n isMobile ? \"oui-gap-3\" : \"oui-gap-6\",\n ])}\n >\n <div\n className={cn([\n \"oui-flex oui-w-full oui-items-stretch oui-gap-3\",\n isMobile ? \"oui-px-3\" : \"\",\n ])}\n >\n {!hideConfig?.estimatedRewards && (\n <RewardItem\n title={t(\"tradingLeaderboard.estimatedRewards\")}\n value={rewardText}\n showTooltip\n tooltip={tooltipContent}\n isMobile={isMobile}\n />\n )}\n <RewardItem\n showTooltip={!!campaign?.ticket_rules}\n title={t(\"tradingLeaderboard.estimatedTicketsEarned\")}\n value={ticketText}\n tooltip={ticketTooltipContent}\n {...extraProps}\n isMobile={isMobile}\n />\n </div>\n <div\n className={cn([\n \"oui-flex oui-justify-center oui-gap-3\",\n isMobile ? \"oui-px-3\" : \"\",\n ])}\n >\n {campaign?.rule_url && (\n <Button\n size={isMobile ? \"md\" : \"lg\"}\n variant=\"outlined\"\n className={cn([\n \"oui-border-[rgb(var(--oui-gradient-brand-start))] oui-text-[rgb(var(--oui-gradient-brand-start))] hover:oui-bg-[rgb(var(--oui-gradient-brand-start))]/[0.08] active:oui-bg-[rgb(var(--oui-gradient-brand-start))]/[0.08]\",\n isMobile ? \"oui-flex-1\" : \"oui-w-[140px]\",\n ])}\n onClick={onLearnMore}\n >\n {t(\"tradingLeaderboard.viewRules\")}\n </Button>\n )}\n {shouldShowJoinButton && (\n <Button\n size={isMobile ? \"md\" : \"lg\"}\n variant=\"gradient\"\n color=\"primary\"\n loading={isJoining}\n disabled={isJoining}\n className={cn([isMobile ? \"oui-flex-1\" : \"oui-w-[140px]\"])}\n onClick={() =>\n joinCampaign?.({ campaign_id: Number(campaign?.campaign_id) })\n }\n >\n {t(\"tradingLeaderboard.joinNow\")}\n </Button>\n )}\n {!shouldShowJoinButton && canTrade && (\n <Button\n size={isMobile ? \"md\" : \"lg\"}\n variant=\"gradient\"\n color=\"primary\"\n className={cn([isMobile ? \"oui-flex-1\" : \"oui-w-[140px]\"])}\n onClick={onTradeNow}\n >\n {t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n )}\n </div>\n </div>\n );\n};\n\nconst RewardItem: FC<{\n title: string;\n value: string;\n showTooltip?: boolean;\n tooltip?: any;\n showExtraInfo?: boolean;\n extraInfo?: {\n percent: number;\n value: number;\n } | null;\n isMobile?: boolean;\n}> = (props) => {\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n const tooltipProps = useMemo(() => {\n if (!props.isMobile) {\n return {};\n }\n return {\n open: tooltipOpen,\n onOpenChange: setTooltipOpen,\n };\n }, [tooltipOpen, props.isMobile, setTooltipOpen]);\n\n return (\n <div className=\"oui-flex oui-flex-1 oui-flex-col oui-items-center oui-justify-center oui-rounded-2xl oui-bg-base-9 oui-px-5 oui-py-4\">\n <div\n className={cn([\n \"oui-text-base-contrast-54\",\n props.isMobile\n ? \"oui-h-[15px] oui-text-2xs oui-leading-[15px]\"\n : \"oui-text-sm oui-font-semibold\",\n ])}\n >\n {props.title}\n </div>\n <div className=\"oui-flex oui-items-center oui-gap-2\">\n <Text.gradient\n weight=\"bold\"\n color=\"brand\"\n className={cn([\n \"oui-trading-leaderboard-title\",\n props.isMobile\n ? \"oui-h-[16px] oui-text-base oui-leading-[16px]\"\n : \"oui-h-10 oui-text-[32px] oui-leading-10\",\n ])}\n >\n {props.value}\n </Text.gradient>\n {props.showTooltip && (\n <Tooltip content={props.tooltip} {...tooltipProps}>\n <div\n className=\"oui-flex oui-size-4 oui-items-center oui-justify-center\"\n onClick={() => setTooltipOpen(true)}\n >\n <InfoCircleIcon className=\"oui-cursor-pointer\" />\n </div>\n </Tooltip>\n )}\n </div>\n {props.showExtraInfo && (\n <div\n className={cn([\n \"oui-flex oui-flex-col oui-items-center oui-justify-end\",\n props.isMobile ? \"oui-mt-2\" : \"\",\n ])}\n >\n <div className=\"oui-flex oui-flex-col oui-items-center oui-gap-1 oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n <div\n className={cn([\n \"oui-flex oui-h-[18px] oui-w-[225px] oui-items-center oui-rounded-[100px] oui-bg-base-5 oui-p-[2px]\",\n props.isMobile ? \"oui-w-full\" : \"oui-w-[225px]\",\n ])}\n >\n <div\n className={cn([\n \"oui-h-[14px] oui-rounded-[100px]\",\n \"oui-bg-[linear-gradient(270deg,rgb(var(--oui-gradient-brand-start))_0%,rgb(var(--oui-gradient-brand-end))_100%)]\",\n ])}\n style={{ width: `${props?.extraInfo?.percent}%` }}\n />\n </div>\n <div\n className={cn([\n \"oui-text-center oui-font-semibold\",\n props.isMobile ? \"oui-text-2xs oui-leading-[15px]\" : \"\",\n ])}\n >\n {/* @ts-ignore */}\n {props.extraInfo.atMax ? (\n <Trans i18nKey=\"tradingLeaderboard.maxTicketsAchieved\" />\n ) : (\n <Trans\n i18nKey=\"tradingLeaderboard.tradeForMoreTickets\"\n components={[\n <span key=\"0\" className=\"oui-text-base-contrast\">\n ${props?.extraInfo?.value?.toFixed(2)}\n </span>,\n ]}\n />\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n","import { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useCampaignsScript } from \"../campaigns/campaigns.script\";\nimport { CampaignRuleUI } from \"./rule\";\nimport { CampaignTermsUI } from \"./terms\";\n\nexport const RuleWidget = () => {\n const state = useCampaignsScript();\n const { isMobile } = useScreen();\n\n const rulesAndTerms = state.currentCampaign?.rule;\n\n if (\n state.currentCampaignId === \"general\" ||\n !state.currentCampaign?.rule_config\n ) {\n return null;\n }\n\n return (\n <>\n <CampaignRuleUI\n id={state.currentCampaign.rule_url || \"\"}\n className={isMobile ? \"oui-px-3\" : \"\"}\n rules={rulesAndTerms?.rule}\n ruleConfig={rulesAndTerms?.ruleConfig}\n isMobile={isMobile}\n />\n <CampaignTermsUI\n className={isMobile ? \"oui-px-3\" : \"\"}\n termsConfig={rulesAndTerms?.terms}\n isMobile={isMobile}\n />\n </>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTitle } from \"../../pages/leaderboard/page\";\nimport {\n DescriptionContent,\n DescriptionItem,\n DescriptionConfig,\n} from \"./description\";\n\ntype RuleUIProps = {\n id: string;\n className?: string;\n isMobile?: boolean;\n rules?: DescriptionItem[];\n ruleConfig?: DescriptionConfig;\n};\n\nexport const CampaignRuleUI: FC<RuleUIProps> = ({\n id,\n className,\n isMobile,\n rules,\n ruleConfig,\n}) => {\n const { t } = useTranslation();\n return (\n <div\n className={cn(\"oui-mx-auto oui-max-w-[992px] oui-py-10\", className)}\n id={id}\n >\n <LeaderboardTitle\n isMobile={isMobile}\n title={t(\"tradingLeaderboard.rules\")}\n />\n <DescriptionContent description={rules || []} config={ruleConfig} />\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\n\n// import ReactMarkdown from \"react-markdown\";\n// import remarkGfm from \"remark-gfm\";\n\n// Enhanced type definition supporting multiple content formats\ntype ListStyle =\n | \"disc\"\n | \"decimal\"\n | \"none\"\n | \"circle\"\n | \"square\"\n | \"decimal-leading-zero\"\n | \"lower-alpha\"\n | \"upper-alpha\"\n | \"lower-roman\"\n | \"upper-roman\";\n\nexport type DescriptionItem = {\n content: string; // Support markdown syntax, plain text, or image URL\n type: \"markdown\" | \"text\" | \"image\";\n alt?: string; // For images\n className?: string; // Custom styling\n listStyle?: ListStyle; // List style for ul/ol elements\n listClassName?: string; // Custom list container class\n children?: DescriptionItem[];\n};\n\nexport type DescriptionConfig = {\n listStyle?: ListStyle; // Global list style\n listClassName?: string; // Global list container class\n};\n\n// Utility function to get list style classes\nconst getListStyleClass = (style: ListStyle): string => {\n const styleMap: Record<ListStyle, string> = {\n disc: \"oui-list-disc\",\n decimal: \"oui-list-decimal\",\n none: \"oui-list-none\",\n circle: \"oui-list-disc\", // Tailwind doesn't have circle, fallback to disc\n square: \"oui-list-disc\", // Tailwind doesn't have square, fallback to disc\n \"decimal-leading-zero\": \"oui-list-decimal\",\n \"lower-alpha\": \"oui-list-decimal\", // Fallback\n \"upper-alpha\": \"oui-list-decimal\", // Fallback\n \"lower-roman\": \"oui-list-decimal\", // Fallback\n \"upper-roman\": \"oui-list-decimal\", // Fallback\n };\n return styleMap[style] || \"oui-list-disc\";\n};\n\n// Custom rich text parser (no external dependencies)\nconst parseRichText = (text: string): JSX.Element[] => {\n const parts: JSX.Element[] = [];\n let currentIndex = 0;\n let key = 0;\n\n // Parse **bold** syntax\n const boldRegex = /\\*\\*(.*?)\\*\\*/g;\n // Parse [link text](url) syntax\n const linkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n // Parse ![alt text](image url) syntax\n const imageRegex = /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g;\n\n const allMatches: Array<{\n type: \"bold\" | \"link\" | \"image\";\n match: RegExpMatchArray;\n index: number;\n }> = [];\n\n // Find all matches\n let match;\n while ((match = boldRegex.exec(text)) !== null) {\n allMatches.push({ type: \"bold\", match, index: match.index });\n }\n while ((match = linkRegex.exec(text)) !== null) {\n allMatches.push({ type: \"link\", match, index: match.index });\n }\n while ((match = imageRegex.exec(text)) !== null) {\n allMatches.push({ type: \"image\", match, index: match.index });\n }\n\n // Sort by index\n allMatches.sort((a, b) => a.index - b.index);\n\n for (const { type, match } of allMatches) {\n // Add text before match\n if (match.index !== undefined && match.index > currentIndex) {\n const beforeText = text.slice(currentIndex, match.index);\n if (beforeText) {\n parts.push(<span key={key++}>{beforeText}</span>);\n }\n }\n\n // Add formatted element\n switch (type) {\n case \"bold\":\n parts.push(\n <strong\n key={key++}\n className=\"oui-font-bold oui-text-base-contrast-54\"\n >\n {match[1]}\n </strong>,\n );\n break;\n case \"link\":\n parts.push(\n <a\n key={key++}\n href={match[2]}\n className=\"oui-text-base-contrast-54 oui-underline hover:oui-text-base-contrast-54\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {match[1]}\n </a>,\n );\n break;\n case \"image\":\n parts.push(\n <img\n key={key++}\n src={match[2]}\n alt={match[1]}\n className=\"oui-my-2 oui-block oui-h-auto oui-max-w-full\"\n />,\n );\n break;\n }\n\n currentIndex = (match.index ?? 0) + match[0].length;\n }\n\n // Add remaining text\n if (currentIndex < text.length) {\n const remainingText = text.slice(currentIndex);\n if (remainingText) {\n parts.push(<span key={key++}>{remainingText}</span>);\n }\n }\n\n return parts.length > 0 ? parts : [<span key={0}>{text}</span>];\n};\n\n// Custom rich text implementation (recommended for lightweight needs)\nexport const DescriptionContent: FC<{\n description: DescriptionItem[] | ReadonlyArray<DescriptionItem>;\n config?: DescriptionConfig;\n}> = ({ description, config }) => {\n const renderContent = (\n contents: DescriptionItem[] | ReadonlyArray<DescriptionItem>,\n level: number = 0,\n ) => {\n // Determine list style - item level overrides global config\n const defaultListStyle = config?.listStyle || \"disc\";\n const hasListItems = contents.some((item) => item.children?.length);\n\n if (!hasListItems && contents.length === 1) {\n // Single item without children - render without list wrapper\n const content = contents[0];\n return (\n <div className={cn(\"oui-mb-2\", content.className)}>\n {renderContentItem(content)}\n </div>\n );\n }\n\n return (\n <ul\n className={cn(\n // Use list-outside for proper alignment\n \"oui-list-outside\",\n // Add left padding for proper spacing\n level === 0 ? \"oui-pl-5\" : \"oui-pl-4\",\n // Get list style class\n getListStyleClass(defaultListStyle),\n // Custom list container class\n config?.listClassName,\n )}\n >\n {contents.map((content, index) => {\n const itemListStyle = content.listStyle || defaultListStyle;\n\n return (\n <li\n key={`${content.content}-${index}`}\n className={cn(\n \"oui-mb-1 oui-leading-relaxed\",\n // Override list style if specified on item\n content.listStyle && getListStyleClass(itemListStyle),\n content.className,\n )}\n >\n {renderContentItem(content)}\n {content?.children?.length && (\n <div className=\"oui-mt-2 oui-text-sm oui-text-base-contrast-36\">\n {renderContent(content.children, level + 1)}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n );\n };\n\n const renderContentItem = (content: DescriptionItem) => {\n if (content.type === \"image\") {\n return (\n <img\n src={content.content}\n alt={content.alt || \"\"}\n className=\"oui-my-2 oui-h-auto oui-max-w-full\"\n />\n );\n }\n\n // Both markdown and text use the rich text parser\n return (\n <div className=\"rich-text-content inline\">\n {parseRichText(content.content)}\n </div>\n );\n };\n\n return (\n <div\n className={cn(\n \"oui-text-sm oui-font-semibold oui-leading-[28px] oui-text-base-contrast-54\",\n )}\n >\n {renderContent(description)}\n </div>\n );\n};\n\n// Alternative: React-markdown implementation (requires additional dependencies)\nexport const MarkdownDescriptionContent: FC<{\n description: DescriptionItem[] | ReadonlyArray<DescriptionItem>;\n}> = ({ description }) => {\n const renderContent = (\n contents: DescriptionItem[] | ReadonlyArray<DescriptionItem>,\n ) => {\n return (\n <ul className=\"oui-list-inside oui-list-disc\">\n {contents.map((content, index) => (\n <li key={`${content.content}-${index}`} className={content.className}>\n {content.type === \"image\" ? (\n <img\n src={content.content}\n alt={content.alt || \"\"}\n className=\"oui-my-2 oui-h-auto oui-max-w-full\"\n />\n ) : (\n <div>{content.content}</div>\n )}\n {Array.isArray(content?.children) &&\n content?.children.length > 0 && (\n <div className=\"oui-ml-4\">\n {renderContent(content.children)}\n </div>\n )}\n </li>\n ))}\n </ul>\n );\n };\n\n return (\n <div\n className={cn(\n \"oui-text-sm oui-font-semibold oui-leading-[28px] oui-text-base-contrast-54\",\n )}\n >\n {renderContent(description)}\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTitle } from \"../../pages/leaderboard/page\";\nimport { DescriptionContent, DescriptionItem } from \"./description\";\n\ntype TermsUIProps = {\n className?: string;\n isMobile?: boolean;\n termsConfig?: DescriptionItem[];\n};\n\nexport const CampaignTermsUI: FC<TermsUIProps> = ({\n className,\n isMobile,\n termsConfig,\n}) => {\n const { t } = useTranslation();\n return (\n <div className={cn(\"oui-mx-auto oui-max-w-[992px] oui-py-10\", className)}>\n <LeaderboardTitle\n isMobile={isMobile}\n title={t(\"tradingLeaderboard.termsAndConditions\")}\n />\n <DescriptionContent description={termsConfig || EMPTY_LIST} />\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/hooks/useEndReached.ts","../src/components/ranking/shared/util.ts","../src/components/ranking/shared/column.tsx","../src/components/ranking/shared/ranking.ui.tsx","../src/components/ranking/generalRanking/generalRanking.script.ts","../src/components/ranking/generalRanking/generalRanking.widget.tsx","../src/components/ranking/generalRanking/index.ts","../src/deprecated/components/provider/index.tsx","../src/deprecated/pages/leaderboard/leaderboard.mobile.ui.tsx","../src/components/brokerStats/brokerStats.ui.tsx","../src/deprecated/components/campaigns/campaigns.widget.tsx","../src/deprecated/components/campaigns/campaigns.mobile.ui.tsx","../src/deprecated/components/campaigns/campaigns.script.ts","../src/deprecated/components/campaigns/campaigns.ui.tsx","../src/deprecated/components/tradingList/tradingList.mobile.ui.tsx","../src/deprecated/components/tradingList/column.tsx","../src/deprecated/components/tradingList/tradingList.script.ts","../src/deprecated/components/tradingList/tradingList.ui.tsx","../src/deprecated/components/tradingList/tradingList.widget.tsx","../src/deprecated/pages/leaderboard/leaderboard.script.ts","../src/deprecated/pages/leaderboard/leaderboard.ui.tsx","../src/deprecated/pages/leaderboard/leaderboard.widget.tsx","../src/components/provider/index.tsx","../src/components/campaigns/pricePool/utils.ts","../src/index.ts","../src/components/ranking/campaignRanking/campaignRanking.widget.tsx","../src/components/ranking/campaignRanking/campaignRanking.script.ts","../src/components/rewards/utils.ts","../src/components/leaderboard/generalLeaderboard/generalLeaderboard.script.ts","../src/type.ts","../src/components/leaderboard/generalLeaderboard/generalLeaderboard.ui.tsx","../src/components/leaderboard/shared/LeaderboardFilter.tsx","../src/components/leaderboard/shared/LeaderboardTabs.tsx","../src/components/leaderboard/generalLeaderboard/generalLeaderboard.widget.tsx","../src/components/leaderboard/campaignLeaderboard/campaignLeaderboard.script.ts","../src/components/leaderboard/campaignLeaderboard/campaignLeaderboard.ui.tsx","../src/components/leaderboard/campaignLeaderboard/campaignLeaderboard.widget.tsx","../src/pages/leaderboard/page.tsx","../src/components/background/index.tsx","../src/components/campaigns/campaigns.widget.tsx","../src/hooks/useCanTrade.ts","../src/components/campaigns/campaigns.content.desktop.ui.tsx","../src/components/campaigns/pricePool/normalPricePool.ui.tsx","../src/components/campaigns/utils.ts","../src/components/campaigns/type.ts","../src/components/campaigns/pricePool/pricePool.widget.tsx","../src/components/campaigns/pricePool/pricePool.desktop.ui.tsx","../src/components/campaigns/pricePool/pricePool.script.ts","../src/components/campaigns/campaigns.script.ts","../src/components/campaigns/components/time.desktop.ui.tsx","../src/components/campaigns/components/axis.tsx","../src/components/campaigns/components/countdown.tsx","../src/components/campaigns/header/campaigns.header.desktop.ui.tsx","../src/components/campaigns/DefaultCampaign.tsx","../src/components/campaigns/campaign.item.ui.tsx","../src/components/campaigns/header/campaigns.header.mobile.ui.tsx","../src/components/campaigns/header/campaigns.header.widget.tsx","../src/components/leaderboard128/generalLeaderboard/generalLeaderboard.script.ts","../src/components/leaderboard128/generalLeaderboard/generalLeaderboard.ui.tsx","../src/components/ranking128/shared/ranking.ui.tsx","../src/components/ranking128/shared/column.tsx","../src/components/ranking128/shared/util.ts","../src/components/ranking128/generalRanking/generalRanking.script.ts","../src/components/ranking128/generalRanking/generalRanking.widget.tsx","../src/components/leaderboard128/shared/LeaderboardFilter.tsx","../src/components/leaderboard128/shared/LeaderboardTabs.tsx","../src/components/leaderboard128/generalLeaderboard/generalLeaderboard.widget.tsx","../src/components/rewards/rewards.widget.tsx","../src/components/rewards/rewards.desktop.ui.tsx","../src/components/rule/rule.widget.tsx","../src/components/rule/rule.tsx","../src/components/rule/description.tsx","../src/components/rule/terms.tsx"],"names":["useEffect","isSameAddress","useMemo","useTranslation","Text","Box","cn","Flex","useScreen","Fragment","jsx","jsxs","useCallback","DataTable","Spinner","column","useRef","useState","useAccount","useConfig","useInfiniteQuery","useQuery","usePagination","sort","startDate","endDate","Button","Select","Header","CampaignItem","dateRange","DataFilter","createContext","useContext","parseISO","usePrivateQuery","TradingLeaderboardContext","TradingLeaderboardProvider","useTradingLeaderboardContext","progress","differenceInDays","LeaderboardTab","FilterDays","useFilter","CloseCircleFillIcon","Input","ScrollIndicator","SearchIcon","showVolume","showPnl","showPoints","GeneralRankingWidget","isVideoSrc","format","CampaignTagEnum","AuthGuard","ChevronRightIcon","AccountStatusEnum","toast","useCampaignsScript","currentTime","endTime","difference","useEmblaCarousel","ChevronLeftIcon","CampaignsWidget","useSearch","Divider","getCurrentAddressRowKey","useRankingColumns","FirstRankIcon","SecondRankIcon","ThirdRankIcon","Ranking","useGeneralRankingScript","useCampaignRankingList","formatData","item","LeaderboardFilter","TabPanel","Tabs","LeaderboardTabs","InfoCircleIcon","Tooltip","match"],"mappings":"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","sourcesContent":["import {\n format,\n subDays,\n addDays,\n isBefore,\n isAfter,\n isWithinInterval,\n parseISO,\n} from \"date-fns\";\nimport { DateRange } from \"./type\";\n\nexport const getDateRange = (offsetDay: number) => {\n return {\n from: subDays(new Date(), offsetDay - 1)!,\n to: new Date()!,\n };\n};\n\n/**\n * Parse timeRange prop which can accept string dates or 'now'\n * Supports:\n * - { from: '2025-01-01' } - from date, to defaults to today\n * - { from: '2025-01-01', to: '2025-11-15' } - both dates\n * - { from: '2025-01-01', to: 'now' } - to is current date\n *\n * @param timeRange Raw timeRange input with optional string dates and 'now' support\n * @returns Parsed DateRange with Date objects, or null if no dates are specified\n */\nexport const parseTimeRange = (\n timeRange:\n | {\n from?: string | Date;\n to?: string | Date | \"now\";\n }\n | null\n | undefined,\n): DateRange | null => {\n if (!timeRange) {\n return null;\n }\n\n const { from, to } = timeRange;\n\n // If neither from nor to is specified, return null to use defaults\n if (!from && !to) {\n return null;\n }\n\n // Must specify 'from' if you want to use custom timeRange\n if (!from) {\n console.warn(\n \"timeRange.from must be specified when using custom timeRange. Ignoring timeRange.\",\n );\n return null;\n }\n\n const fromDate = typeof from === \"string\" ? parseISO(from) : from;\n\n // Default to today if 'to' is not specified\n const toDate = to\n ? to === \"now\"\n ? new Date()\n : typeof to === \"string\"\n ? parseISO(to)\n : to\n : new Date(); // Default to today\n\n // Validate that from is not after to\n if (fromDate > toDate) {\n console.warn(\n `timeRange.from (${formatDateRange(fromDate)}) is after timeRange.to (${formatDateRange(toDate)}). Ignoring timeRange.`,\n );\n return null;\n }\n\n return {\n from: fromDate,\n to: toDate,\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 { 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","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 { ReactNode, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Text,\n Column,\n Box,\n cn,\n toast,\n Flex,\n useScreen,\n} from \"@kodiak-finance/orderly-ui\";\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 =\n | \"rank\"\n | \"address\"\n | \"volume\"\n | \"pnl\"\n | \"rewards\"\n | \"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 let linearGradientText;\n\n if (!isYou) {\n if (record.rank === 1) {\n linearGradientText =\n \"linear-gradient(169deg, #FBE67B 2.09%, #FCFBE7 15.8%, #F7D14E 40.73%, #D4A041 58.8%)\";\n } else if (record.rank === 2) {\n linearGradientText =\n \"linear-gradient(201.05deg, #D9D9D9 38.79%, #F7F6F4 53.85%, #D9D9D9 71.71%, #7F7F7F 91.87%), rgba(255, 255, 255, 0.8)\";\n } else if (record.rank === 3) {\n linearGradientText =\n \"linear-gradient(149.05deg, #B6947E 15.63%, #F8DAC8 31.37%, #B6947E 44.29%, #F8DCCB 56.6%), rgba(255, 255, 255, 0.8)\";\n }\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 copyable\n onCopy={(e) => {\n e.preventDefault();\n e.stopPropagation();\n navigator.clipboard.writeText(value);\n toast.success(t(\"common.copy.copied\"));\n }}\n // style={\n // linearGradientText\n // ? {\n // background: linearGradientText,\n // WebkitBackgroundClip: \"text\",\n // WebkitTextFillColor: \"transparent\",\n // backgroundClip: \"text\",\n // }\n // : {}\n // }\n className=\"oui-cursor-pointer oui-underline oui-decoration-line-16 oui-decoration-dashed oui-underline-offset-4\"\n >\n {value}\n </Text.formatted>\n {isYou && <Text> (You)</Text>}\n </a>\n </>\n );\n },\n width: 90,\n },\n {\n title: <VolumeColumnTitle />,\n dataIndex: \"volume\",\n onSort: enableSort,\n align: isMobile ? \"right\" : \"left\",\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2}>\n {value}\n </Text.numeral>\n );\n },\n width: 105,\n },\n {\n title: <PnLColumnTitle type={type} />,\n dataIndex: \"pnl\",\n onSort: enableSort,\n align: isMobile ? \"right\" : \"left\",\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.pnl prefix=\"$\" rule=\"price\" dp={2} coloring>\n {value}\n </Text.pnl>\n );\n },\n width: 90,\n },\n {\n title: t(\"tradingLeaderboard.estimatedRewards\"),\n dataIndex: \"rewards\",\n align: isMobile ? \"right\" : \"left\",\n render: (value: { amount: number; currency: string }) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral\n suffix={` ${value?.currency || \"\"}`}\n rule=\"price\"\n dp={0}\n >\n {value?.amount}\n </Text.numeral>\n );\n },\n width: 90,\n },\n {\n title: <PointsColumnTitle />,\n dataIndex: \"points\",\n onSort: enableSort,\n align: isMobile ? \"right\" : \"left\",\n render: (value: number) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral rule=\"price\" dp={0}>\n {value}\n </Text.numeral>\n );\n },\n width: 90,\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\nconst PnLColumnTitle = ({ type }: { type?: \"general\" | \"campaign\" }) => {\n const { t } = useTranslation();\n\n const view = (\n <Flex gap={1}>\n <div>\n {type === \"general\" ? t(\"common.realizedPnl\") : t(\"common.pnl\")}\n </div>\n </Flex>\n );\n return view;\n};\n\nconst VolumeColumnTitle = () => {\n const { t } = useTranslation();\n\n const view = (\n <Flex gap={1}>\n <div>{t(\"tradingLeaderboard.tradingVolume\")}</div>\n </Flex>\n );\n return view;\n};\n\nconst PointsColumnTitle = () => {\n const { t } = useTranslation();\n\n const view = (\n <Flex gap={1}>\n <div>{t(\"tradingLeaderboard.points\")}</div>\n </Flex>\n );\n return view;\n};\n","import { FC, useCallback } from \"react\";\nimport {\n cn,\n DataTable,\n Flex,\n Spinner,\n TanstackColumn,\n useScreen,\n} from \"@kodiak-finance/orderly-ui\";\nimport { type CampaignRankingData } from \"../campaignRanking/campaignRanking.script\";\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 | CampaignRankingData;\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 typeof props.onSort === \"function\",\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 (\n column: TanstackColumn<RankingData>,\n record: RankingData,\n index: number,\n ) => {\n const isFirstColumn = column.getIsFirstColumn();\n const isLastColumn = column.getIsLastColumn();\n const isRank = [1, 2, 3].includes(record.rank as number);\n if (record.key === getCurrentAddressRowKey(props.address!)) {\n return {\n className: cn(\n \"after:oui-absolute after:oui-h-[40px] after:oui-w-full md:after:oui-h-[48px]\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \"after:oui-left-0 after:oui-top-[2px] after:oui-z-[-1]\",\n \"after:oui-border-y\",\n isFirstColumn && \"after:oui-rounded-l-lg after:oui-border-l\",\n isLastColumn && \"after:oui-rounded-r-lg after:oui-border-r\",\n ),\n };\n }\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 // style: isRank\n // ? {\n // position: \"unset\",\n // }\n // : undefined,\n };\n },\n [props.address],\n );\n\n if (isMobile) {\n return (\n <>\n <DataTable\n classNames={{\n root: \"oui-trading-leaderboard-ranking-table\",\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 initialSort={props.initialSort}\n onSort={props.onSort}\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 initialSort={props.initialSort}\n onSort={props.onSort}\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-h-[calc(100%_-_53px_-_8px)]\",\n ),\n scroll: \"oui-min-h-[600px] oui-max-h-[1250px]\",\n }}\n onRow={onRow}\n onCell={onCell}\n />\n );\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useAccount,\n useConfig,\n useInfiniteQuery,\n useQuery,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport {\n TableSort,\n usePagination,\n useScreen,\n} from \"@kodiak-finance/orderly-ui\";\nimport { useEndReached } from \"../../../hooks/useEndReached\";\nimport { DateRange } from \"../../../type\";\nimport { formatDateRange, getDateRange } from \"../../../utils\";\nimport { getCurrentAddressRowKey, isSameAddress } from \"../shared/util\";\n\n/**\n * Normalize API field names to UI field names\n * Maps perp_volume → volume, realized_pnl → pnl, and ensures points is passed through\n */\nconst normalizeRankingData = (items: GeneralRankingData[]) =>\n items.map((item) => ({\n ...item,\n volume: item.perp_volume,\n pnl: item.realized_pnl,\n points: item.points ?? 0,\n }));\n\nexport type GeneralRankingData = {\n account_id: string;\n address: string;\n broker_fee: number;\n date: string;\n perp_maker_volume: number;\n perp_taker_volume: number;\n perp_volume: number;\n realized_pnl: number;\n total_fee: number;\n\n key?: string;\n rank?: number | string;\n volume?: number;\n pnl?: number;\n points?: number;\n};\n\nexport type GeneralRankingResponse = {\n meta: API.RecordsMeta;\n rows: GeneralRankingData[];\n};\nexport type GeneralRankingScriptReturn = ReturnType<\n typeof useGeneralRankingScript\n>;\n\nexport type GeneralRankingScriptOptions = {\n dateRange?: DateRange | null;\n address?: string;\n sortKey?: \"perp_volume\" | \"realized_pnl\";\n leaderboardEndpoint?: string;\n};\n\nexport function useGeneralRankingScript(options?: GeneralRankingScriptOptions) {\n const {\n dateRange = getDateRange(90),\n address: searchValue,\n sortKey = \"perp_volume\",\n leaderboardEndpoint,\n } = options || {};\n\n const [initialSort] = useState<TableSort>({\n sortKey,\n sort: \"desc\",\n });\n\n const [sort, setSort] = useState<TableSort | undefined>(initialSort);\n\n const { state } = useAccount();\n const brokerId = useConfig(\"brokerId\");\n\n const { isMobile } = useScreen();\n\n const { page, pageSize, setPage, parsePagination } = usePagination({\n pageSize: 100,\n });\n\n const { campaignRankingList, filteredCampaignData } = useCampaignRankingList({\n dateRange,\n sort,\n searchValue,\n });\n\n const getUrl = (args: {\n page: number;\n pageSize: number;\n address?: string;\n sort?: string | null;\n }) => {\n const searchParams = new URLSearchParams();\n\n searchParams.set(\"page\", args.page.toString());\n searchParams.set(\n \"size\",\n // if page is 1, we need to set page size to 100 to get the top 100 data to judge user rank\n args.page === 1 ? \"100\" : args.pageSize.toString(),\n );\n\n // Only add aggregateBy and broker_id for default Orderly endpoint\n const isDefaultEndpoint = !leaderboardEndpoint;\n if (isDefaultEndpoint) {\n searchParams.set(\"aggregateBy\", \"address_per_builder\");\n if (brokerId) {\n searchParams.set(\"broker_id\", brokerId);\n }\n }\n\n if (args.sort) {\n searchParams.set(\"sort\", args.sort);\n } else if (args.sort !== null && sort) {\n const prefix = sort.sort === \"asc\" ? \"ascending\" : \"descending\";\n searchParams.set(\"sort\", `${prefix}_${sort.sortKey}`);\n }\n\n if (dateRange?.from) {\n searchParams.set(\"start_date\", formatDateRange(dateRange.from!));\n }\n\n if (dateRange?.to) {\n searchParams.set(\"end_date\", formatDateRange(dateRange.to!));\n }\n\n if (args.address) {\n searchParams.set(\"address\", args.address);\n }\n\n // Use custom leaderboard endpoint if provided, otherwise use default Orderly endpoint\n const baseUrl = leaderboardEndpoint || `/v1/broker/leaderboard/daily`;\n return `${baseUrl}?${searchParams.toString()}`;\n };\n\n const { data, isLoading } = useQuery<GeneralRankingResponse>(\n getUrl({ page, pageSize, address: searchValue }),\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\n if (!isMobile) {\n return null;\n }\n\n return getUrl({\n page: pageIndex + 1,\n pageSize,\n address: searchValue,\n });\n },\n {\n initialSize: 1,\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const { data: top100Data } = useQuery<GeneralRankingResponse>(\n getUrl({\n page: 1,\n pageSize: 100,\n sort: `descending_${sort?.sortKey || \"perp_volume\"}`,\n }),\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const { data: userDataRes = [] } = useQuery<GeneralRankingData[]>(\n state.address\n ? getUrl({ page: 1, pageSize: 1, address: state.address, sort: null })\n : null,\n {\n revalidateOnFocus: false,\n },\n );\n\n const getAddressRank = useCallback(\n (address: string) => {\n const index = top100Data?.rows.findIndex((item) =>\n isSameAddress(item.address, address!),\n );\n return index !== -1 ? index! + 1 : \"100+\";\n },\n [top100Data],\n );\n\n const userDataList = useMemo(() => {\n if (!state.address || isLoading) {\n return [];\n }\n\n if (!userDataRes.length) {\n return [\n {\n key: getCurrentAddressRowKey(state.address!),\n address: state.address,\n rank: \"-\",\n } as unknown as GeneralRankingData,\n ];\n }\n\n const withRank = userDataRes?.map((item) => ({\n ...item,\n rank: getAddressRank(item.address!),\n key: getCurrentAddressRowKey(item.address!),\n }));\n\n return normalizeRankingData(withRank);\n }, [state.address, userDataRes, isLoading, getAddressRank]);\n\n const addRankForList = useCallback(\n (list: GeneralRankingData[], total: number) => {\n return list?.map((item, index) => {\n let rank: string | number = index + 1;\n\n if (searchValue) {\n rank = getAddressRank(item.address);\n } else {\n if (sort?.sort === \"asc\") {\n rank = total - (page - 1) * pageSize - index;\n } else if (sort?.sort === \"desc\") {\n rank = (page - 1) * pageSize + index + 1;\n }\n }\n\n return {\n ...item,\n rank,\n };\n });\n },\n [page, pageSize, sort, searchValue, getAddressRank],\n );\n\n const dataSource = useMemo(() => {\n let list = data?.rows || [];\n // hardcode for 128 campaign\n if (campaignRankingList && campaignRankingList.length >= 0) {\n if (filteredCampaignData) {\n list = filteredCampaignData as GeneralRankingData[];\n } else {\n list = list.filter((item) =>\n campaignRankingList.includes(item.address),\n );\n }\n }\n\n if (page === 1) {\n list = list.slice(0, pageSize);\n }\n let total = data?.meta.total || 0;\n if (campaignRankingList) {\n total = list.length;\n }\n const rankList = addRankForList(list, total);\n const normalized = normalizeRankingData(rankList);\n\n if (page === 1 && !searchValue) {\n return [...userDataList, ...normalized];\n }\n return normalized;\n }, [\n data,\n page,\n pageSize,\n userDataList,\n searchValue,\n addRankForList,\n campaignRankingList,\n filteredCampaignData,\n ]);\n\n const dataList = useMemo(() => {\n if (!infiniteData?.length) {\n return [];\n }\n\n let total = infiniteData[0]?.meta.total || 0;\n let flatList = infiniteData?.map((item) => item.rows)?.flat();\n if (campaignRankingList && campaignRankingList.length > 0) {\n if (filteredCampaignData) {\n flatList = filteredCampaignData as GeneralRankingData[];\n total = filteredCampaignData.length;\n } else {\n flatList = flatList.filter((item) =>\n campaignRankingList.includes(item.address),\n );\n total = flatList.length;\n }\n }\n const rankList = addRankForList(flatList, total);\n const normalized = normalizeRankingData(rankList);\n\n if (!searchValue) {\n return [...userDataList, ...normalized];\n }\n return normalized;\n }, [\n infiniteData,\n userDataList,\n searchValue,\n addRankForList,\n campaignRankingList,\n filteredCampaignData,\n ]);\n\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n const pagination = useMemo(\n () =>\n parsePagination({\n total: campaignRankingList\n ? dataSource?.length\n : data?.meta?.total || 0,\n current_page: data?.meta?.current_page || 1,\n records_per_page: pageSize,\n }),\n [\n data?.meta?.total,\n data?.meta?.current_page,\n pageSize,\n campaignRankingList,\n dataSource,\n ],\n );\n\n useEndReached(sentinelRef, () => {\n if (!isValidating && isMobile) {\n setSize(size + 1);\n }\n });\n\n const onSort = useCallback(\n (sort?: TableSort) => {\n if (sort) {\n // Fallback points sort to volume if using default Orderly endpoint (doesn't support points)\n if (sort.sortKey === \"points\" && !leaderboardEndpoint) {\n sort.sortKey = \"perp_volume\";\n } else if (sort.sortKey === \"volume\") {\n // Map column field names to query field names\n sort.sortKey = \"perp_volume\";\n } else if (sort.sortKey === \"pnl\") {\n sort.sortKey = \"realized_pnl\";\n }\n }\n\n // fix for mobile sort\n setSort((_sort) => {\n if (sort) return sort;\n return isMobile\n ? { sortKey: _sort?.sortKey || \"\", sort: \"desc\" }\n : initialSort;\n });\n },\n [initialSort, isMobile, leaderboardEndpoint],\n );\n\n useEffect(() => {\n if (searchValue) {\n setPage(1);\n }\n }, [searchValue]);\n\n useEffect(() => {\n setPage(1);\n }, [state.address]);\n\n useEffect(() => {\n if (dateRange?.to && dateRange?.from) {\n setPage(1);\n }\n }, [dateRange]);\n\n useEffect(() => {\n setSort({ sortKey, sort: \"desc\" });\n }, [sortKey]);\n\n return {\n pagination,\n initialSort,\n onSort,\n dataSource,\n isLoading: isLoading || isValidating,\n isMobile,\n sentinelRef,\n dataList,\n address: state.address,\n };\n}\n\n// for 128 campaign hardcode\nconst useCampaignRankingList = ({\n dateRange,\n sort,\n searchValue,\n}: {\n dateRange: DateRange | null;\n sort?: TableSort;\n searchValue?: string;\n}) => {\n const getUrl = (label?: string) => {\n if (!label) {\n return null;\n }\n const campaignId = label === \"Week 1\" ? \"129\" : \"128\";\n\n const searchParams = new URLSearchParams();\n searchParams.set(\"campaign_id\", campaignId);\n searchParams.set(\"page\", \"1\");\n searchParams.set(\"size\", \"2000\");\n searchParams.set(\"aggregate_by\", \"address\");\n\n return `https://api.orderly.org/v1/public/campaign/ranking?${searchParams.toString()}`;\n };\n\n const { data: campaignData } = useQuery<GeneralRankingResponse[\"rows\"]>(\n getUrl(\"Week 2\"),\n {\n revalidateOnFocus: false,\n },\n );\n\n const { data } = useQuery<GeneralRankingResponse[\"rows\"]>(\n getUrl(dateRange?.label),\n {\n revalidateOnFocus: false,\n },\n );\n\n const campaignRankingList = useMemo(() => {\n if (!dateRange?.label) {\n return undefined;\n }\n return campaignData?.map((item) => item.address) || [];\n }, [campaignData, dateRange]);\n\n const filteredCampaignData = useMemo(() => {\n if (campaignRankingList && dateRange?.label === \"Week 1\") {\n const list =\n data?.filter(\n (item) =>\n campaignRankingList.includes(item.address) &&\n (searchValue ? isSameAddress(item.address, searchValue) : true),\n ) || [];\n const newList = list.map((item) => ({\n address: item.address,\n perp_volume: item.volume,\n realized_pnl: item.pnl,\n }));\n\n if (sort) {\n newList.sort((a: any, b: any) => {\n if (sort?.sort === \"asc\") {\n return a?.[sort?.sortKey] - b?.[sort?.sortKey];\n } else if (sort?.sort === \"desc\") {\n return b?.[sort?.sortKey] - a?.[sort?.sortKey];\n }\n return 0;\n });\n }\n return newList;\n }\n return undefined;\n }, [data, campaignRankingList, sort, dateRange, searchValue]);\n\n return { campaignRankingList, filteredCampaignData };\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 { dateRange, address, fields, sortKey, leaderboardEndpoint, ...rest } =\n props;\n const state = useGeneralRankingScript({\n dateRange,\n address,\n sortKey,\n leaderboardEndpoint,\n });\n\n return <Ranking {...state} {...rest} fields={fields} type=\"general\" />;\n};\n","export {\n GeneralRankingWidget,\n type GeneralRankingWidgetProps,\n} from \"./generalRanking.widget\";\nexport { useGeneralRankingScript } from \"./generalRanking.script\";\n","import React, { createContext, useContext, useMemo } from \"react\";\n\nexport type Campaign = {\n title: string;\n description: string;\n image: string;\n startTime: Date | string;\n endTime: Date | string;\n href:\n | string\n | {\n /** learn more url */\n learnMore: string;\n /** trading url, if provided, will override default trading now button url */\n trading: string;\n };\n};\n\n/**\n * Trading leaderboard provider state\n */\nexport type TradingLeaderboardState = {\n /** campaigns config, if not provided, will not show campaigns section */\n campaigns?: Campaign[];\n /** background src, it can be a image resource or video resource */\n backgroundSrc?: string;\n href?: {\n /** default trading now button url */\n trading: string;\n };\n};\n\n/**\n * Trading leaderboard context\n */\nexport const TradingLeaderboardContext = createContext<TradingLeaderboardState>(\n {},\n);\n\nexport type TradingLeaderboardProviderProps =\n React.PropsWithChildren<TradingLeaderboardState>;\n\nexport const TradingLeaderboardProvider: React.FC<\n Readonly<TradingLeaderboardProviderProps>\n> = (props) => {\n const { href, campaigns, backgroundSrc, children } = props;\n const memoizedValue = useMemo<TradingLeaderboardState>(() => {\n return {\n href: href,\n campaigns: campaigns,\n backgroundSrc: backgroundSrc,\n };\n }, [href, campaigns, backgroundSrc]);\n return (\n <TradingLeaderboardContext.Provider value={memoizedValue}>\n {children}\n </TradingLeaderboardContext.Provider>\n );\n};\n\nexport const useTradingLeaderboardContext = () => {\n return useContext(TradingLeaderboardContext);\n};\n","import { FC } from \"react\";\nimport { cn, Flex } from \"@kodiak-finance/orderly-ui\";\nimport { BrokerStatsWidget } from \"../../../components/brokerStats/brokerStats.ui\";\nimport { CampaignsWidget } from \"../../components/campaigns\";\nimport { TradingListWidget } from \"../../components/tradingList\";\nimport { LeaderboardScriptReturn } from \"./leaderboard.script\";\n\nexport type LeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n} & LeaderboardScriptReturn;\n\nexport const MobileLeaderboardWidget: FC<LeaderboardProps> = (props) => {\n // const renderBackground = () => {\n // const linearGradient =\n // \"linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)\";\n\n // if (props.isVideo) {\n // return (\n // <div\n // className={cn(\"oui-absolute oui-left-0 oui-top-0\", \"oui-size-full\")}\n // >\n // <div\n // style={{\n // backgroundImage: linearGradient,\n // backgroundSize: \"cover\",\n // backgroundRepeat: \"no-repeat\",\n // }}\n // className={cn(\"oui-absolute oui-left-0 oui-top-0\", \"oui-size-full\")}\n // />\n // <video\n // playsInline\n // // eslint-disable-next-line react/no-unknown-property\n // webkit-playsinline // need to use this prop to ban full screen in iphone\n // autoPlay\n // loop\n // muted\n // className={cn(\n // // rest style\n // \"oui-pointer-events-none oui-border-none oui-bg-transparent oui-outline-none\",\n // \"oui-size-full\",\n // // \"oui-absolute oui-top-0 oui-left-0\",\n // \"oui-object-cover\",\n // \"oui-opacity-50\",\n // )}\n // // ref={(video) => {\n // // if (video) {\n // // video.setAttribute(\"playsinline\", \"true\");\n // // video.setAttribute(\"webkit-playsinline\", \"true\");\n // // }\n // // }}\n // >\n // <source src={props.backgroundSrc} type=\"video/mp4\" />\n // <source src={props.backgroundSrc} type=\"video/webm\" />\n // <source src={props.backgroundSrc} type=\"video/ogg\" />\n // <source src={props.backgroundSrc} type=\"video/avi\" />\n // Your browser does not support the video tag.\n // </video>\n // </div>\n // );\n // }\n\n // if (props.backgroundSrc) {\n // return (\n // <div\n // style={{\n // backgroundImage: `${linearGradient}, url(${props.backgroundSrc}) `,\n // backgroundSize: \"cover\",\n // backgroundRepeat: \"no-repeat\",\n // }}\n // className={cn(\n // \"oui-absolute oui-left-0 oui-top-0\",\n // \"oui-size-full\",\n // \"oui-opacity-50\",\n // )}\n // />\n // );\n // }\n // };\n return (\n <div\n style={{\n paddingBottom: \"calc(64px + env(safe-area-inset-bottom))\",\n }}\n className={cn(\n \"oui-relative oui-grid oui-h-[calc(100vh-44px)] oui-gap-1 oui-bg-base-10\",\n \"oui-mix-blend-screen\",\n props.className,\n )}\n >\n {/* {renderBackground()} */}\n <Flex\n direction=\"column\"\n gapY={3}\n height=\"100%\"\n px={3}\n pt={3}\n pb={3}\n className={cn(\n \"oui-trading-leaderboard-mobile oui-custom-scrollbar oui-overflow-y-auto\",\n \"oui-relative oui-h-[calc(100vh_-_64px)]\",\n )}\n >\n {props.showCampaigns && <CampaignsWidget />}\n <BrokerStatsWidget />\n <TradingListWidget />\n </Flex>\n </div>\n );\n};\n","import { useMemo } from \"react\";\nimport {\n TrendingUp,\n TrendingDown,\n DollarSign,\n Wallet,\n BarChart3,\n} from \"lucide-react\";\nimport { useSWR } from \"@kodiak-finance/orderly-hooks\";\nimport { useScreen, Spinner } from \"@kodiak-finance/orderly-ui\";\nimport { DateRange } from \"../../type\";\n\ninterface BrokerStatsRaw {\n volume: number;\n fees: number;\n revenue: number;\n pnl: number;\n}\n\ninterface KodiakStatsProps {\n dateRange?: DateRange;\n}\n\ninterface StatCard {\n key: string;\n label: string;\n value: number;\n icon: \"volume\" | \"fees\" | \"revenue\" | \"pnl\";\n}\n\nconst API_BASE = \"https://backend.kodiak.finance/orderly/stats\";\n\n/**\n * Format date to YYYY-MM-DD in local timezone (not UTC)\n * Prevents timezone offset issues when converting to ISO string\n */\nconst formatDateLocal = (date: Date): string => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n};\n\nconst getApiUrl = (dateRange?: DateRange): string => {\n if (!dateRange?.from || !dateRange?.to) {\n // Fallback: if no date range provided, use today\n const today = new Date();\n const startDate = formatDateLocal(today);\n const endDate = formatDateLocal(today);\n return `${API_BASE}?start_date=${startDate}&end_date=${endDate}`;\n }\n\n // Use the actual date range from the leaderboard picker\n const startDate = formatDateLocal(dateRange.from);\n const endDate = formatDateLocal(dateRange.to);\n\n return `${API_BASE}?start_date=${startDate}&end_date=${endDate}`;\n};\n\nconst customFetcher = async (url: string) => {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch: ${response.statusText}`);\n }\n return response.json();\n};\n\nconst formatCurrency = (num: number, showSign: boolean = false): string => {\n if (isNaN(num)) return \"$0\";\n\n const isNegative = num < 0;\n const absNum = Math.abs(num);\n let formatted = \"\";\n\n if (absNum >= 1_000_000) {\n formatted = `$${(absNum / 1_000_000).toFixed(2)}M`;\n } else if (absNum >= 1_000) {\n formatted = `$${(absNum / 1_000).toFixed(2)}K`;\n } else {\n formatted = `$${absNum.toFixed(2)}`;\n }\n\n if (showSign) {\n return isNegative ? `-${formatted}` : `+${formatted}`;\n }\n\n return formatted;\n};\n\nexport const BrokerStatsWidget = ({ dateRange }: KodiakStatsProps) => {\n const { isMobile } = useScreen();\n\n const url = useMemo(\n () => getApiUrl(dateRange),\n [dateRange?.from, dateRange?.to],\n );\n\n const {\n data: apiData,\n isLoading: loading,\n error,\n } = useSWR<any>(url, customFetcher, {\n revalidateOnFocus: false,\n });\n\n const stats = useMemo((): BrokerStatsRaw | null => {\n if (!apiData) return null;\n\n // Handle array response from new endpoint\n const dataArray = Array.isArray(apiData.data) ? apiData.data : [];\n if (dataArray.length === 0) return null;\n\n const firstEntry = dataArray[0];\n return {\n volume: firstEntry.perp_volume || 0,\n fees: firstEntry.total_fee || 0,\n revenue: firstEntry.broker_fee || 0,\n pnl: firstEntry.realized_pnl || 0,\n };\n }, [apiData]);\n\n const allStats = useMemo((): StatCard[] => {\n return [\n {\n key: \"volume\",\n label: \"Volume\",\n value: stats?.volume || 0,\n icon: \"volume\",\n },\n { key: \"fees\", label: \"Fees\", value: stats?.fees || 0, icon: \"fees\" },\n {\n key: \"revenue\",\n label: \"Revenue\",\n value: stats?.revenue || 0,\n icon: \"revenue\",\n },\n { key: \"pnl\", label: \"PnL\", value: stats?.pnl || 0, icon: \"pnl\" },\n ];\n }, [stats]);\n\n const statsToDisplay = allStats;\n\n if (error) {\n return (\n <div className=\"w-full oui-mx-auto oui-mb-6 oui-max-w-[992px]\">\n <div className=\"oui-text-center oui-text-sm oui-text-red-500\">\n Failed to load statistics\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"w-full oui-mx-auto oui-mb-6 oui-max-w-[992px] oui-gap-6\">\n <h3 className=\"oui-mb-2 oui-text-base oui-font-semibold oui-text-base-contrast\">\n Kodiak Perps Stats\n </h3>\n <div\n className={`mb-6 oui-grid oui-gap-3 md:oui-gap-4 ${\n isMobile ? \"oui-grid-cols-2\" : \"oui-grid-cols-2 md:oui-grid-cols-4\"\n }`}\n >\n {statsToDisplay.map((stat) => (\n <StatCardComponent\n key={stat.key}\n stat={stat}\n dateRange={dateRange}\n loading={loading}\n />\n ))}\n </div>\n </div>\n );\n};\n\nconst STAT_ICON_MAP: Record<string, React.ReactNode> = {\n volume: <BarChart3 className=\"oui-size-5\" />,\n fees: <DollarSign className=\"oui-size-5\" />,\n revenue: <Wallet className=\"oui-size-5\" />,\n};\n\nconst getPnLIcon = (isPositive: boolean) =>\n isPositive ? (\n <TrendingUp className=\"oui-size-5\" />\n ) : (\n <TrendingDown className=\"oui-size-5\" />\n );\n\nconst getDateRangeLabel = (dateRange?: DateRange): string => {\n if (!dateRange?.from || !dateRange?.to) {\n return \"Today\";\n }\n\n const fromDate = new Date(dateRange.from);\n const toDate = new Date(dateRange.to);\n\n // Reset time to compare dates only\n fromDate.setHours(0, 0, 0, 0);\n toDate.setHours(0, 0, 0, 0);\n\n // Check if it's the same day\n if (fromDate.getTime() === toDate.getTime()) {\n return \"Today\";\n }\n\n // Calculate days difference (inclusive - add 1 to include both start and end dates)\n const diffTime = toDate.getTime() - fromDate.getTime();\n const diffDays = Math.round(diffTime / (1000 * 60 * 60 * 24)) + 1;\n\n // Return the actual number of days or common periods\n if (diffDays === 1) return \"1D\";\n if (diffDays === 2) return \"1D\";\n if (diffDays === 7) return \"7D\";\n if (diffDays === 30) return \"30D\";\n if (diffDays === 90) return \"90D\";\n return `${diffDays}D`;\n};\n\nconst StatCardComponent = ({\n stat,\n dateRange,\n loading,\n}: {\n stat: StatCard;\n dateRange?: DateRange;\n loading?: boolean;\n}) => {\n const isPnL = stat.key === \"pnl\";\n const isPositive = stat.value >= 0;\n\n const getIconStyles = () => {\n const baseStyles = {\n backgroundColor: \"#1a1a1a\",\n color: \"#ffffff\",\n };\n\n if (isPnL) {\n return {\n ...baseStyles,\n backgroundColor: isPositive\n ? \"rgba(34, 197, 94, 0.2)\"\n : \"rgba(239, 68, 68, 0.2)\",\n color: isPositive ? \"#22c55e\" : \"#ef4444\",\n };\n }\n\n switch (stat.icon) {\n case \"volume\":\n return {\n ...baseStyles,\n backgroundColor: \"rgba(59, 130, 246, 0.2)\",\n color: \"#3b82f6\",\n };\n case \"fees\":\n return {\n ...baseStyles,\n backgroundColor: \"rgba(168, 85, 247, 0.2)\",\n color: \"#a855f7\",\n };\n case \"revenue\":\n return {\n ...baseStyles,\n backgroundColor: \"rgba(34, 197, 94, 0.2)\",\n color: \"#22c55e\",\n };\n default:\n return baseStyles;\n }\n };\n\n const iconStyles = getIconStyles();\n\n const valueColor = isPnL ? (isPositive ? \"#22c55e\" : \"#ef4444\") : \"inherit\";\n\n return (\n <div className=\"oui-rounded-lg oui-border oui-border-base-4 oui-bg-base-8 oui-p-3 md:oui-p-4 oui-transition-all\">\n <div className=\"oui-mb-2 md:oui-mb-3 oui-flex oui-items-start oui-gap-2 md:oui-gap-3\">\n <div\n className=\"oui-flex oui-shrink-0 oui-items-center oui-justify-center oui-rounded-md oui-p-1.5 md:oui-p-2\"\n style={iconStyles}\n >\n {isPnL ? getPnLIcon(isPositive) : STAT_ICON_MAP[stat.icon]}\n </div>\n <div className=\"oui-flex oui-flex-col\">\n <span className=\"oui-text-xs md:oui-text-sm oui-font-medium oui-text-base-contrast\">\n {stat.label}\n </span>\n <span className=\"oui-text-base-contrast-60 oui-text-2xs md:oui-text-xs\">\n ({getDateRangeLabel(dateRange)})\n </span>\n </div>\n </div>\n\n <div\n className=\"oui-text-lg md:oui-text-xl oui-font-bold\"\n style={{ color: valueColor, minHeight: \"28px\" }}\n >\n {loading ? (\n <Spinner size=\"sm\" color=\"primary\" />\n ) : (\n formatCurrency(stat.value, isPnL)\n )}\n </div>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { MobileCampaigns } from \"./campaigns.mobile.ui\";\nimport { useCampaignsScript } from \"./campaigns.script\";\nimport { Campaigns } from \"./campaigns.ui\";\n\nexport type CampaignsWidgetProps = {\n className?: string;\n style?: React.CSSProperties;\n};\n\nexport const CampaignsWidget: FC<CampaignsWidgetProps> = (props) => {\n const state = useCampaignsScript();\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return (\n <MobileCampaigns\n {...state}\n className={props.className}\n style={props.style}\n />\n );\n }\n return (\n <Campaigns {...state} className={props.className} style={props.style} />\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Box, Text, Flex, Button, Select } from \"@kodiak-finance/orderly-ui\";\nimport { CampaignsScriptReturn, CurrentCampaigns } from \"./campaigns.script\";\n\nexport type CampaignsProps = {\n className?: string;\n style?: React.CSSProperties;\n} & CampaignsScriptReturn;\n\nconst scrollIndicatorWidth = 25;\nconst scrollIndicatorHeight = 6;\n\nexport const MobileCampaigns: FC<CampaignsProps> = (props) => {\n if (props.currentCampaigns.length === 0) {\n return null;\n }\n\n return (\n <Box\n width=\"100%\"\n intensity={900}\n p={3}\n className={cn(\n \"oui-mobile-trading-leaderboard-campaigns oui-rounded-[20px]\",\n props.className,\n )}\n style={props.style}\n >\n <Header {...props} />\n <Box\n r=\"xl\"\n mt={3}\n ref={props.enableScroll ? props.emblaRef : undefined}\n className={cn(\n \"oui-w-full oui-min-w-0 oui-overflow-hidden\",\n \"oui-select-none oui-cursor-pointer\",\n )}\n >\n <Flex>\n {props.currentCampaigns.map((campaign) => {\n return <CampaignItem key={campaign.title} campaign={campaign} />;\n })}\n </Flex>\n </Box>\n {props.enableScroll && (\n <ScrollIndicator\n style={{\n width: scrollIndicatorWidth * props.currentCampaigns.length,\n }}\n list={props.currentCampaigns}\n scrollIndex={props.scrollIndex}\n scrollTo={props.emblaApi?.scrollTo}\n />\n )}\n </Box>\n );\n};\n\nconst Header: FC<CampaignsScriptReturn> = (props) => {\n const { t } = useTranslation();\n\n return (\n <Flex justify=\"between\" itemAlign=\"center\">\n <Text size=\"base\" intensity={80}>\n {t(\"tradingLeaderboard.campaigns\")}\n </Text>\n <Select.options\n size={\"xs\"}\n value={props.category}\n onValueChange={props.onCategoryChange}\n options={props.options}\n classNames={{\n // set the width of the trigger to the width of the content\n trigger: \"oui-w-[--radix-select-content-available-width]\",\n }}\n />\n </Flex>\n );\n};\n\nconst CampaignItem: FC<{ campaign: CurrentCampaigns }> = ({ campaign }) => {\n const { title, description, image, displayTime, learnMoreUrl, tradingUrl } =\n campaign;\n const { t } = useTranslation();\n\n return (\n <Box intensity={800} r=\"xl\" className=\"oui-flex-[0_0_100%]\">\n <img\n className=\"oui-w-full oui-h-[calc((100vw-48px)/2)] oui-rounded-t-xl oui-object-fill\"\n src={image}\n alt={title}\n />\n\n <Flex\n itemAlign=\"start\"\n justify=\"between\"\n direction=\"column\"\n height=\"100%\"\n p={4}\n gapY={3}\n className=\"oui-font-semibold\"\n >\n <Flex direction=\"column\" itemAlign=\"start\" gapY={1}>\n <Text size=\"sm\">{title}</Text>\n <Text size=\"2xs\" intensity={54}>\n {displayTime}\n </Text>\n <Text size=\"2xs\" intensity={36}>\n {description}\n </Text>\n </Flex>\n <Flex justify=\"between\" width=\"100%\" gapX={3}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n fullWidth\n size=\"md\"\n onClick={() => {\n window.open(learnMoreUrl, \"_blank\");\n }}\n >\n {t(\"tradingLeaderboard.learnMore\")}\n </Button>\n <Button\n size=\"md\"\n fullWidth\n onClick={() => {\n window.open(tradingUrl, \"_self\");\n }}\n >\n {t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n </Flex>\n </Flex>\n </Box>\n );\n};\n\ninterface ScrollIndicatorProps {\n style?: React.CSSProperties;\n list: CurrentCampaigns[];\n scrollIndex: number;\n scrollTo?: (index: number) => void;\n}\n\nconst ScrollIndicator: React.FC<ScrollIndicatorProps> = (props) => {\n const { style, scrollIndex, list } = props;\n\n return (\n <Flex\n mt={3}\n r=\"full\"\n height={scrollIndicatorHeight}\n className={cn(\"oui-bg-line oui-mx-auto oui-relative\")}\n style={props.style}\n >\n {list.map((item, index) => {\n return (\n <Box\n key={index}\n width={scrollIndicatorWidth}\n height={scrollIndicatorHeight}\n onClick={() => {\n props.scrollTo?.(index);\n }}\n r=\"full\"\n className=\"oui-cursor-pointer\"\n />\n );\n })}\n <Box\n width={scrollIndicatorWidth}\n height={scrollIndicatorHeight}\n r=\"full\"\n className={cn(\n \"oui-absolute oui-left-0 oui-top-0\",\n \"oui-transition-all oui-duration-300\",\n \"oui-bg-primary\",\n )}\n style={{\n transform: `translateX(${scrollIndex * scrollIndicatorWidth}px)`,\n }}\n />\n </Flex>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useTrack } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { TrackerEventName } from \"@kodiak-finance/orderly-types\";\nimport { useEmblaCarousel } from \"@kodiak-finance/orderly-ui\";\nimport { formatCampaignDate } from \"../../../utils\";\nimport { useTradingLeaderboardContext, Campaign } from \"../provider\";\n\nexport type CampaignsScriptReturn = ReturnType<typeof useCampaignsScript>;\n\n// Define the type for our categorized campaigns\ntype CategorizedCampaigns = {\n ongoing: Campaign[];\n past: Campaign[];\n future: Campaign[];\n};\n\nexport type CurrentCampaigns = Campaign & {\n displayTime: string;\n learnMoreUrl: string;\n tradingUrl: string;\n};\n\nexport type TEmblaApi = {\n scrollTo?: (index: number) => void;\n};\n\ntype CategoryKey = keyof CategorizedCampaigns;\n\nexport function useCampaignsScript() {\n const { t } = useTranslation();\n const { campaigns = [], href } = useTradingLeaderboardContext();\n const [category, setCategory] = useState<CategoryKey>(\"ongoing\");\n\n const { track, tracking } = useTrack();\n\n const filterCampaigns = useMemo(() => {\n const now = new Date();\n\n return campaigns.reduce<CategorizedCampaigns>(\n (acc, campaign) => {\n const startTime = new Date(campaign.startTime);\n const endTime = new Date(campaign.endTime);\n\n if (now >= startTime && now <= endTime) {\n acc.ongoing.push(campaign);\n } else if (now > endTime) {\n acc.past.push(campaign);\n } else {\n acc.future.push(campaign);\n }\n\n return acc;\n },\n { ongoing: [], past: [], future: [] },\n );\n }, [campaigns]);\n\n const options = useMemo(() => {\n const opts: { label: string; value: CategoryKey }[] = [\n { label: t(\"tradingLeaderboard.ongoing\"), value: \"ongoing\" },\n { label: t(\"tradingLeaderboard.future\"), value: \"future\" },\n { label: t(\"tradingLeaderboard.past\"), value: \"past\" },\n ];\n\n // Filter out categories with no campaigns and map to the required format\n return opts.filter((item) => filterCampaigns[item.value].length > 0);\n }, [filterCampaigns, t]);\n\n const currentCampaigns = useMemo(() => {\n const list = filterCampaigns[category];\n return list.map((campaign) => {\n const { startTime, endTime } = campaign;\n\n let learnMoreUrl: string;\n let tradingUrl = href?.trading!;\n\n if (typeof campaign.href === \"object\") {\n learnMoreUrl = campaign.href.learnMore;\n tradingUrl = campaign.href.trading;\n } else {\n learnMoreUrl = campaign.href;\n }\n\n return {\n ...campaign,\n displayTime: `${formatCampaignDate(startTime)} - ${formatCampaignDate(\n endTime,\n )} UTC`,\n learnMoreUrl,\n tradingUrl,\n };\n });\n }, [filterCampaigns, category, href]);\n\n useEffect(() => {\n // Find the first non-empty category\n const categoryKeys: CategoryKey[] = [\"ongoing\", \"future\", \"past\"];\n\n const firstAvailableCategory = categoryKeys.find(\n (item) => filterCampaigns[item].length > 0,\n );\n\n if (firstAvailableCategory) {\n setCategory(firstAvailableCategory);\n }\n }, [filterCampaigns]);\n\n const onCategoryChange = (value: string) => {\n setCategory(value as CategoryKey);\n };\n const [scrollIndex, setScrollIndex] = useState(0);\n\n const [emblaRef, emblaApi] = useEmblaCarousel({\n loop: false,\n slidesToScroll: \"auto\",\n });\n\n useEffect(() => {\n emblaApi?.on(\"select\", () => {\n setScrollIndex(emblaApi?.selectedScrollSnap());\n });\n }, [emblaApi]);\n\n const onLearnMore = (campaign: CurrentCampaigns) => {\n track(TrackerEventName.leaderboardCampaignClickLearnMore, {\n campaign_title: campaign.title,\n });\n window.open(campaign.learnMoreUrl, \"_blank\");\n };\n\n const onTradeNow = (campaign: CurrentCampaigns) => {\n tracking(TrackerEventName.leaderboardCampaignClickTradeNow, {\n campaign_title: campaign.title,\n });\n window.open(campaign.tradingUrl, \"_self\");\n };\n\n return {\n options,\n currentCampaigns,\n category,\n onCategoryChange,\n tradingUrl: href?.trading,\n emblaRef,\n emblaApi: emblaApi as TEmblaApi,\n scrollIndex,\n enableScroll: currentCampaigns?.length > 1,\n onLearnMore,\n onTradeNow,\n };\n}\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Box, Text, Flex, Button, Select } from \"@kodiak-finance/orderly-ui\";\nimport { CampaignsScriptReturn, CurrentCampaigns } from \"./campaigns.script\";\n\nexport type CampaignsProps = {\n className?: string;\n style?: React.CSSProperties;\n} & CampaignsScriptReturn;\n\nexport const Campaigns: FC<CampaignsProps> = (props) => {\n if (props.currentCampaigns.length === 0) {\n return null;\n }\n\n return (\n <Box\n width=\"100%\"\n intensity={900}\n p={5}\n pr={2}\n height={288}\n className={cn(\n \"oui-trading-leaderboard-campaigns oui-rounded-[20px]\",\n props.className,\n )}\n style={props.style}\n >\n <Header {...props} />\n <Box\n mt={5}\n r=\"xl\"\n className={cn(\"oui-overflow-y-auto\", \"oui-custom-scrollbar\")}\n >\n <Flex\n gapY={5}\n height={200}\n direction=\"column\"\n r=\"xl\"\n className=\"oui-pr-1.5\"\n >\n {props.currentCampaigns.map((campaign) => {\n return (\n <CampaignItem\n key={campaign.title}\n campaign={campaign}\n onLearnMore={props.onLearnMore}\n onTradeNow={props.onTradeNow}\n />\n );\n })}\n </Flex>\n </Box>\n </Box>\n );\n};\n\nconst Header: FC<CampaignsScriptReturn> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex justify=\"between\" itemAlign=\"center\" pr={3}>\n <Text size=\"xl\">{t(\"tradingLeaderboard.campaigns\")}</Text>\n <Select.options\n size={\"xs\"}\n value={props.category}\n onValueChange={props.onCategoryChange}\n options={props.options}\n classNames={{\n // set the width of the trigger to the width of the content\n trigger: \"oui-w-[--radix-select-content-available-width]\",\n }}\n />\n </Flex>\n );\n};\n\ntype CampaignItemProps = {\n campaign: CurrentCampaigns;\n onLearnMore: (campaign: CurrentCampaigns) => void;\n onTradeNow: (campaign: CurrentCampaigns) => void;\n};\n\nconst CampaignItem: FC<CampaignItemProps> = ({\n campaign,\n onLearnMore,\n onTradeNow,\n}) => {\n const { title, description, image, displayTime } = campaign;\n const { t } = useTranslation();\n\n return (\n <Flex intensity={800} r=\"xl\" width=\"100%\">\n <img\n className=\"oui-h-[200px] oui-w-[400px] oui-rounded-l-xl oui-object-fill\"\n src={image}\n alt={title}\n />\n\n <Flex\n itemAlign=\"start\"\n justify=\"between\"\n direction=\"column\"\n height=\"100%\"\n p={5}\n className=\"oui-flex-1 oui-font-semibold\"\n >\n <Flex gap={1} direction=\"column\" itemAlign=\"start\">\n <Text size=\"xl\">{title}</Text>\n <Text size=\"sm\" intensity={36}>\n {description}\n </Text>\n </Flex>\n <Flex justify=\"between\" width=\"100%\">\n <Text size=\"xs\" intensity={54}>\n {displayTime}\n </Text>\n <Flex gap={3}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n size=\"md\"\n onClick={() => {\n onLearnMore(campaign);\n }}\n >\n {t(\"tradingLeaderboard.learnMore\")}\n </Button>\n <Button\n size=\"md\"\n onClick={() => {\n onTradeNow(campaign);\n }}\n >\n {t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n );\n};\n","import { FC, SVGProps } from \"react\";\nimport { cn, DataFilter, DataTable, Flex, Spinner } from \"@kodiak-finance/orderly-ui\";\nimport { useTradingListColumns } from \"./column\";\nimport {\n getRowKey,\n TradingData,\n TradingListScriptReturn,\n} from \"./tradingList.script\";\n\nexport type TradingListProps = {\n style?: React.CSSProperties;\n className?: string;\n} & TradingListScriptReturn;\n\nexport const MobileTradingList: FC<TradingListProps> = (props) => {\n const column = useTradingListColumns(props.address);\n\n return (\n <Flex\n direction=\"column\"\n width=\"100%\"\n itemAlign=\"start\"\n intensity={900}\n r=\"2xl\"\n px={4}\n style={props.style}\n className={cn(\n \"oui-mobile-trading-leaderboard-trading-list\",\n props.className,\n )}\n >\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n className={cn(\"oui-mobile-trading-leaderboard-trading-filter\")}\n >\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[40px] oui-border-none\"\n />\n )}\n </Flex>\n\n <DataTable\n classNames={{\n root: \"oui-pb-4\",\n body: \"oui-text-2xs\",\n scroll: \"oui-overflow-y-hidden oui-h-full\",\n }}\n loading={props.isLoading}\n id=\"oui-trading-leaderboard-trading-table\"\n columns={column}\n initialSort={props.initialSort}\n onSort={props.onSort}\n dataSource={props.dataList}\n generatedRowKey={(record: TradingData) => record.key || record.address}\n manualPagination\n manualSorting\n onRow={(record, index) => {\n return {\n className: cn(\"oui-h-[30px]\"),\n };\n }}\n onCell={(column, record, index) => {\n if (record.key === getRowKey(props.address!)) {\n const isFirst = column.getIsFirstColumn();\n const isLast = column.getIsLastColumn();\n\n return {\n className: cn(\n \"after:oui-absolute after:oui-h-[30px] after:oui-w-full\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \" after:oui-left-0 after:oui-top-0 after:oui-z-[-1]\",\n \"after:oui-border-y\",\n isFirst && \"after:oui-rounded-l-lg after:oui-border-l\",\n isLast && \"after:oui-rounded-r-lg after:oui-border-r\",\n ),\n };\n }\n return {};\n }}\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 </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Text, Column, Box, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { getRowKey } from \"./tradingList.script\";\n\nexport const useTradingListColumns = (address?: string) => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n return useMemo(() => {\n return [\n {\n title: t(\"tradingLeaderboard.rank\"),\n dataIndex: \"rank\",\n width: 40,\n render: (value: number) => {\n return (\n <Box width={20} className=\"oui-text-center\">\n {value}\n </Box>\n );\n },\n },\n {\n title: t(\"common.address\"),\n dataIndex: \"address\",\n render: (value: string, record: any) => {\n const isYou = record.key === getRowKey(address!);\n if (isMobile && isYou) {\n return <Text>You</Text>;\n }\n\n return (\n <>\n <Text.formatted rule=\"address\">{value}</Text.formatted>\n {isYou && <Text> (You)</Text>}\n </>\n );\n },\n width: 90,\n },\n {\n title: t(\"tradingLeaderboard.tradingVolume\"),\n dataIndex: \"perp_volume\",\n onSort: true,\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2}>\n {value}\n </Text.numeral>\n );\n },\n width: 105,\n },\n {\n title: t(\"common.realizedPnl\"),\n dataIndex: \"realized_pnl\",\n onSort: true,\n align: isMobile ? \"right\" : \"left\",\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2} coloring>\n {value}\n </Text.numeral>\n );\n },\n width: 90,\n },\n ] as Column[];\n }, [t, isMobile, address]);\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { differenceInDays } from \"date-fns\";\nimport {\n useAccount,\n useConfig,\n useInfiniteQuery,\n useQuery,\n usePrivateQuery,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { TableSort, usePagination, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useEndReached } from \"../../../hooks/useEndReached\";\nimport { getDateRange, formatDateRange } from \"../../../utils\";\n\nexport type TradingListScriptOptions = {};\n\nexport type TradingData = {\n account_id: string;\n address: string;\n broker_fee: number;\n date: string;\n perp_maker_volume: number;\n perp_taker_volume: number;\n perp_volume: number;\n total_fee: number;\n // custom field\n key?: string;\n};\n\nexport type TradingResponse = {\n meta: API.RecordsMeta;\n rows: TradingData[];\n};\nexport type TradingListScriptReturn = ReturnType<typeof useTradingListScript>;\n\nexport const FilterDays = [7, 14, 30, 90] as const;\nexport type TFilterDays = (typeof FilterDays)[number];\nexport type DateRange = {\n from?: Date;\n to?: Date;\n};\n\nexport function useTradingListScript() {\n const [searchValue, setSearchValue] = useState(\"\");\n const [initialSort] = useState<TableSort>({\n sortKey: \"perp_volume\",\n sort: \"desc\",\n });\n const [sort, setSort] = useState<TableSort | undefined>(initialSort);\n\n const { state } = useAccount();\n const brokerId = useConfig(\"brokerId\");\n\n const { isMobile } = useScreen();\n\n const { dateRange, filterDay, updateFilterDay, filterItems, onFilter } =\n useFilter();\n\n const { page, pageSize, setPage, parsePagination } = usePagination({\n pageSize: 100,\n });\n\n const getUrl = (args: {\n page: number;\n pageSize: number;\n address?: string;\n sort?: string | null;\n }) => {\n const searchParams = new URLSearchParams();\n\n searchParams.set(\"page\", args.page.toString());\n searchParams.set(\"size\", args.pageSize.toString());\n\n searchParams.set(\"aggregateBy\", \"address_per_builder\");\n\n if (brokerId) {\n searchParams.set(\"broker_id\", brokerId);\n }\n\n if (args.sort) {\n searchParams.set(\"sort\", args.sort);\n } else if (args.sort !== null && sort) {\n const prefix = sort.sort === \"asc\" ? \"ascending\" : \"descending\";\n searchParams.set(\"sort\", `${prefix}_${sort.sortKey}`);\n }\n\n if (dateRange.from) {\n searchParams.set(\"start_date\", formatDateRange(dateRange.from!));\n }\n\n if (dateRange.to) {\n searchParams.set(\"end_date\", formatDateRange(dateRange.to!));\n }\n\n if (args.address) {\n searchParams.set(\"address\", args.address);\n }\n\n return `/v1/broker/leaderboard/daily?${searchParams.toString()}`;\n };\n\n const { data, isLoading } = useQuery<TradingResponse>(\n getUrl({ page, pageSize, address: searchValue }),\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const {\n data: infiniteData,\n size,\n setSize,\n isValidating,\n } = useInfiniteQuery<TradingResponse>(\n (pageIndex: number, previousPageData: any): string | null => {\n // reached the end\n if (previousPageData && !previousPageData.rows?.length) return null;\n\n if (!isMobile) {\n return null;\n }\n\n return getUrl({\n page: pageIndex + 1,\n pageSize,\n address: searchValue,\n });\n },\n {\n initialSize: 1,\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n // it will use first page data cache\n const { data: top100Data } = useQuery<TradingResponse>(\n state.address\n ? getUrl({\n page: 1,\n pageSize: 100,\n sort: `descending_${sort?.sortKey || \"perp_volume\"}`,\n })\n : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const { data: userDataRes = [] } = usePrivateQuery<TradingData[]>(\n state.address\n ? getUrl({ page: 1, pageSize: 1, address: state.address, sort: null })\n : null,\n {\n revalidateOnFocus: false,\n },\n );\n\n const getAddressRank = useCallback(\n (address: string) => {\n const index = top100Data?.rows.findIndex((item) =>\n isSameAddress(item.address, address!),\n );\n return index !== -1 ? index! + 1 : \"100+\";\n },\n [top100Data],\n );\n\n const userDataList = useMemo(() => {\n if (!state.address || isLoading) {\n return [];\n }\n\n if (!userDataRes.length) {\n return [\n {\n key: getRowKey(state.address!),\n address: state.address,\n rank: \"-\",\n } as unknown as TradingData,\n ];\n }\n\n return userDataRes?.map((item) => ({\n ...item,\n rank: getAddressRank(item.address!),\n key: getRowKey(item.address!),\n }));\n }, [state.address, userDataRes, isLoading, getAddressRank]);\n\n const addRankForList = useCallback(\n (list: TradingData[], total: number) => {\n return list?.map((item, index) => {\n let rank: string | number = index + 1;\n\n if (searchValue) {\n rank = getAddressRank(item.address);\n } else {\n if (sort?.sort === \"asc\") {\n rank = total - (page - 1) * pageSize - index;\n } else if (sort?.sort === \"desc\") {\n rank = (page - 1) * pageSize + index + 1;\n }\n }\n\n return {\n ...item,\n rank,\n };\n });\n },\n [page, pageSize, sort, searchValue, getAddressRank],\n );\n\n const dataSource = useMemo(() => {\n const list = data?.rows || [];\n const total = data?.meta.total || 0;\n const rankList = addRankForList(list, total);\n if (page === 1 && !searchValue) {\n return [...userDataList, ...rankList];\n }\n return rankList;\n }, [data, page, userDataList, searchValue, addRankForList]);\n\n const dataList = useMemo(() => {\n if (!infiniteData?.length) {\n return [];\n }\n\n const total = infiniteData[0]?.meta.total || 0;\n const flatList = infiniteData?.map((item) => item.rows)?.flat();\n const rankList = addRankForList(flatList, total);\n\n if (!searchValue) {\n return [...userDataList, ...rankList];\n }\n\n return rankList;\n }, [infiniteData, userDataList, searchValue, addRankForList]);\n\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n const pagination = useMemo(\n () => parsePagination(data?.meta),\n [parsePagination, data],\n );\n\n useEndReached(sentinelRef, () => {\n if (!isValidating && isMobile) {\n setSize(size + 1);\n }\n });\n\n const onSearchValueChange = (value: string) => {\n setSearchValue(value);\n };\n\n const clearSearchValue = useCallback(() => {\n setSearchValue(\"\");\n }, []);\n\n const onSort = useCallback(\n (sort?: TableSort) => {\n setSort(sort || initialSort);\n },\n [initialSort],\n );\n\n useEffect(() => {\n if (searchValue) {\n setPage(1);\n }\n }, [searchValue]);\n\n useEffect(() => {\n setPage(1);\n }, [state.address]);\n\n useEffect(() => {\n if (dateRange.to && dateRange.from) {\n setPage(1);\n }\n }, [dateRange]);\n\n return {\n pagination,\n dateRange,\n filterDay,\n updateFilterDay,\n filterItems,\n onFilter,\n initialSort,\n onSort,\n dataSource,\n isLoading: isLoading || isValidating,\n searchValue,\n onSearchValueChange,\n clearSearchValue,\n isMobile,\n sentinelRef,\n dataList,\n address: state.address,\n };\n}\n\nconst useFilter = () => {\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 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 };\n};\n\nexport function isSameAddress(address1: string, address2: string) {\n return address1.toLowerCase() === address2.toLowerCase();\n}\n\nexport function getRowKey(address: string) {\n return `current-address-${address?.toLowerCase()}`;\n}\n","import { FC, SVGProps } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n CloseCircleFillIcon,\n cn,\n DataFilter,\n DataTable,\n Flex,\n Input,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { useTradingListColumns } from \"./column\";\nimport {\n FilterDays,\n getRowKey,\n TradingData,\n TradingListScriptReturn,\n} from \"./tradingList.script\";\n\nexport type TradingListProps = {\n style?: React.CSSProperties;\n className?: string;\n} & TradingListScriptReturn;\n\nexport const TradingList: FC<TradingListProps> = (props) => {\n const column = useTradingListColumns(props.address);\n const { t } = useTranslation();\n\n return (\n <Flex\n direction=\"column\"\n width=\"100%\"\n itemAlign=\"start\"\n intensity={900}\n r=\"2xl\"\n px={4}\n style={props.style}\n className={cn(\"oui-trading-leaderboard-trading-list\", props.className)}\n >\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n mt={2}\n className={cn(\n \"oui-trading-leaderboard-trading-filter\",\n \"oui-border-b oui-border-line\",\n )}\n >\n <Flex gap={3}>\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[53px] oui-border-none\"\n />\n )}\n {FilterDays.map((value) => {\n return (\n <button\n className=\"oui-relative oui-px-2 oui-py-[2px] oui-text-sm\"\n key={value}\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={props.filterDay === value ? \"brand\" : undefined}\n className={\n props.filterDay !== value\n ? \"oui-text-base-contrast-54\"\n : \"\"\n }\n >\n {`${value}D`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-absolute oui-inset-0 oui-rounded oui-opacity-[.12] oui-gradient-primary\"\n onClick={() => {\n props.updateFilterDay(value as any);\n }}\n ></div>\n </button>\n );\n })}\n </Flex>\n <Input\n value={props.searchValue}\n onValueChange={props.onSearchValueChange}\n placeholder={t(\"common.address.search.placeholder\")}\n className={cn(\n \"oui-trading-leaderboard-trading-search-input\",\n \"oui-w-[240px]\",\n )}\n size=\"sm\"\n prefix={\n <Box pl={3} pr={1}>\n <SearchIcon className=\"oui-text-base-contrast-36\" />\n </Box>\n }\n suffix={\n props.searchValue && (\n <Box mr={2}>\n <CloseCircleFillIcon\n size={14}\n className=\"oui-cursor-pointer oui-text-base-contrast-36\"\n onClick={props.clearSearchValue}\n />\n </Box>\n )\n }\n autoComplete=\"off\"\n />\n </Flex>\n\n <DataTable\n loading={props.isLoading}\n id=\"oui-trading-leaderboard-trading-table\"\n columns={column}\n initialSort={props.initialSort}\n onSort={props.onSort}\n bordered\n dataSource={props.dataSource}\n generatedRowKey={(record: TradingData) => record.key || record.address}\n manualPagination\n manualSorting\n pagination={props.pagination}\n classNames={{\n root: \"!oui-h-[calc(100%_-_53px_-_8px)]\",\n }}\n onRow={(record, index) => {\n return {\n className: cn(\"oui-h-[48px]\"),\n };\n }}\n onCell={(column, record, index) => {\n if (record.key === getRowKey(props.address!)) {\n const isFirst = column.getIsFirstColumn();\n const isLast = column.getIsLastColumn();\n\n return {\n className: cn(\n \"after:oui-absolute after:oui-h-[48px] after:oui-w-full\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \"after:oui-left-0 after:oui-top-0 after:oui-z-[-1]\",\n \"after:oui-border-y\",\n isFirst && \"after:oui-rounded-l-lg after:oui-border-l\",\n isLast && \"after:oui-rounded-r-lg after:oui-border-r\",\n ),\n };\n }\n return {};\n }}\n />\n </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { FC } from \"react\";\nimport { MobileTradingList } from \"./tradingList.mobile.ui\";\nimport { useTradingListScript } from \"./tradingList.script\";\nimport { TradingList, TradingListProps } from \"./tradingList.ui\";\n\nexport type TradingListWidgetProps = Pick<\n TradingListProps,\n \"style\" | \"className\"\n>;\n\n/**\n * @deprecated use TradingListPage instead\n * it will be removed in next version\n */\nexport const TradingListWidget: FC<TradingListWidgetProps> = (props) => {\n const state = useTradingListScript();\n if (state.isMobile) {\n return <MobileTradingList {...state} {...props} />;\n }\n return <TradingList {...state} {...props} />;\n};\n","import { useMemo } from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { Campaign } from \"../../components/provider\";\n\nexport type LeaderboardScriptReturn = ReturnType<typeof useLeaderboardScript>;\n\nexport type LeaderboardScriptOptions = {\n backgroundSrc?: string;\n campaigns?: Campaign[];\n};\n\nfunction isVideoSrc(src?: string) {\n const extension = src?.split(\".\").pop();\n return [\"mp4\", \"webm\", \"avi\", \"ogg\"].includes(extension ?? \"\");\n}\n\nexport function useLeaderboardScript(options: LeaderboardScriptOptions) {\n const { backgroundSrc, campaigns = [] } = options;\n const { isMobile } = useScreen();\n\n const showCampaigns = useMemo(() => campaigns?.length > 0, [campaigns]);\n\n const isVideo = useMemo(() => {\n return isVideoSrc(backgroundSrc);\n }, [backgroundSrc]);\n\n return {\n backgroundSrc,\n isVideo,\n showCampaigns,\n isMobile,\n };\n}\n","import { FC } from \"react\";\nimport { cn, Flex } from \"@kodiak-finance/orderly-ui\";\nimport { BrokerStatsWidget } from \"../../../components/brokerStats/brokerStats.ui\";\nimport { CampaignsWidget } from \"../../components/campaigns\";\nimport { TradingListWidget } from \"../../components/tradingList\";\nimport { LeaderboardScriptReturn } from \"./leaderboard.script\";\n\nexport type LeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n} & LeaderboardScriptReturn;\n\nexport const Leaderboard: FC<LeaderboardProps> = (props) => {\n const renderBackground = () => {\n const linearGradient =\n \"linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)\";\n\n if (props.isVideo) {\n return (\n <div\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\",\n )}\n >\n <div\n style={{\n backgroundImage: linearGradient,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\",\n )}\n />\n <video\n autoPlay\n loop\n muted\n className={cn(\n // rest style\n \"oui-border-none oui-outline-none oui-bg-transparent\",\n \"oui-w-full oui-h-full\",\n // \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-object-cover\",\n \"oui-opacity-50\",\n )}\n >\n <source src={props.backgroundSrc} type=\"video/mp4\" />\n <source src={props.backgroundSrc} type=\"video/webm\" />\n <source src={props.backgroundSrc} type=\"video/ogg\" />\n <source src={props.backgroundSrc} type=\"video/avi\" />\n Your browser does not support the video tag.\n </video>\n </div>\n );\n }\n\n if (props.backgroundSrc) {\n return (\n <div\n style={{\n backgroundImage: `${linearGradient}, url(${props.backgroundSrc}) `,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-w-full oui-h-full\",\n \"oui-opacity-50\",\n )}\n />\n );\n }\n };\n\n return (\n <div\n style={props.style}\n className={cn(\"oui-h-full oui-mix-blend-screen\", props.className)}\n >\n {renderBackground()}\n <Flex\n direction=\"column\"\n gapY={5}\n height=\"100%\"\n className={cn(\n \"oui-trading-leaderboard oui-relative\",\n \"oui-max-w-[1040px] oui-px-3 oui-mx-auto \",\n )}\n >\n {props.showCampaigns && <CampaignsWidget />}\n <BrokerStatsWidget />\n <TradingListWidget\n className={cn(\n props.showCampaigns\n ? \"oui-h-[calc(100%_-_288px_-_20px)]\"\n : \"oui-h-full\",\n )}\n />\n </Flex>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport {\n TradingLeaderboardProvider,\n TradingLeaderboardProviderProps,\n} from \"../../components/provider\";\nimport { MobileLeaderboardWidget } from \"./leaderboard.mobile.ui\";\nimport { useLeaderboardScript } from \"./leaderboard.script\";\nimport { Leaderboard, LeaderboardProps } from \"./leaderboard.ui\";\n\nexport type LeaderboardWidgetProps = TradingLeaderboardProviderProps &\n Pick<LeaderboardProps, \"style\" | \"className\">;\n\n/**\n * @deprecated use LeaderboardPage instead\n * it will be removed in next version\n */\nexport const LeaderboardWidget: FC<LeaderboardWidgetProps> = (props) => {\n const state = useLeaderboardScript({\n backgroundSrc: props.backgroundSrc,\n campaigns: props.campaigns,\n });\n\n return (\n <TradingLeaderboardProvider campaigns={props.campaigns} href={props.href}>\n {state.isMobile ? (\n <MobileLeaderboardWidget {...state} />\n ) : (\n <Leaderboard\n {...state}\n className={props.className}\n style={props.style}\n />\n )}\n </TradingLeaderboardProvider>\n );\n};\n","import React, {\n createContext,\n useContext,\n useMemo,\n useState,\n useEffect,\n} from \"react\";\nimport { parseISO } from \"date-fns\";\nimport { sortWith, descend } from \"ramda\";\nimport {\n usePrivateQuery,\n RefferalAPI,\n useMemoizedFn,\n noCacheConfig,\n useConfig,\n useQuery,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { getCurrentTierIndex } from \"../campaigns/pricePool/utils\";\nimport {\n CampaignConfig,\n UserData,\n CampaignStatsResponse,\n CampaignStatistics,\n} from \"../campaigns/type\";\n\n/**\n * Trading leaderboard provider state\n */\nexport type TradingLeaderboardState = {\n /** campaigns config, if not provided, will not show campaigns section */\n campaigns?: CampaignConfig[];\n /** background src, it can be a image resource or video resource */\n backgroundSrc?: string;\n href?: {\n /** default trading now button url */\n trading: string;\n };\n currentCampaignId: string | number;\n currentCampaign?: CampaignConfig;\n onCampaignChange: (campaignId: string | number) => void;\n /** leaderboard user data, it will be used to calculate the rewards */\n userData?: UserData;\n /** set leaderboard user data */\n setUserData?: (userdata: UserData) => void;\n /** campaign ranking list updated time */\n updatedTime?: number;\n /** set snapshot time */\n setUpdatedTime?: (updatedTime?: number) => void;\n /** custom data, if use this, you can full control the data */\n dataAdapter?: (info: { page: number; pageSize: number }) => {\n loading: boolean;\n dataSource?: any[];\n dataList?: any[];\n userData?: any;\n updatedTime?: number;\n meta?: {\n total: number;\n current_page: number;\n records_per_page: number;\n };\n };\n campaignDateRange?: {\n start_time: Date | string;\n end_time: Date | string;\n };\n /** custom time range for leaderboard (supports 'now' for current date) */\n timeRange?: {\n from?: string | Date;\n to?: string | Date | \"now\";\n };\n statistics?: CampaignStatistics;\n setStatistics?: (statistics: CampaignStatistics) => void;\n};\n\n/**\n * Trading leaderboard context\n */\nexport const TradingLeaderboardContext = createContext<TradingLeaderboardState>(\n {} as TradingLeaderboardState,\n);\n\nexport type TradingLeaderboardProviderProps = Pick<\n TradingLeaderboardState,\n \"campaigns\" | \"href\" | \"backgroundSrc\" | \"dataAdapter\" | \"timeRange\"\n> & {\n campaignId?: string | number;\n onCampaignChange?: (campaignId: string | number) => void;\n};\n\nexport const TradingLeaderboardProvider: React.FC<\n React.PropsWithChildren<TradingLeaderboardProviderProps>\n> = (props) => {\n const {\n campaignId,\n campaigns,\n backgroundSrc,\n href,\n children,\n dataAdapter,\n onCampaignChange,\n timeRange,\n } = props;\n\n const [userData, setUserData] = useState<UserData>();\n const [updatedTime, setUpdatedTime] = useState<number>();\n const [statistics, setStatistics] = useState<CampaignStatistics>({\n total_participants: 0,\n total_volume: 0,\n });\n\n const { data: generateCode, mutate: generateCodeMutate } =\n usePrivateQuery<RefferalAPI.ReferralInfo>(\"/v1/referral/info\", {\n revalidateOnFocus: true,\n errorRetryCount: 3,\n ...noCacheConfig,\n });\n\n const refererCode = generateCode?.referee_info?.referer_code ?? \"\";\n\n useEffect(() => {\n if (refererCode && userData?.referral_code != refererCode) {\n setUserData({ ...userData!, referral_code: refererCode });\n generateCodeMutate();\n }\n }, [userData, refererCode, generateCodeMutate]);\n\n const currentCampaign = useMemo(() => {\n return campaigns?.find((campaign) => campaign.campaign_id == campaignId);\n }, [campaigns, campaignId]);\n\n const filteredCampaigns = useMemo(() => {\n // Using date-fns to parse date strings and sort by end_time in descending order\n return campaigns\n ? sortWith(\n [descend((campaign: CampaignConfig) => parseISO(campaign.end_time))],\n campaigns,\n )\n : campaigns;\n }, [campaigns]);\n\n const memoCampaignChange = useMemoizedFn((id: string | number) => {\n onCampaignChange?.(id);\n });\n\n const symbols = Array.isArray(currentCampaign?.volume_scope)\n ? currentCampaign?.volume_scope.join(\",\")\n : currentCampaign?.volume_scope;\n\n const brokerId = useConfig(\"brokerId\");\n\n const searchParams = useMemo(() => {\n return {\n campaign_id: campaignId?.toString() || \"\",\n symbols: symbols || \"\",\n broker_id: brokerId,\n group_by: \"BROKER\",\n };\n }, [campaignId, symbols, brokerId]);\n\n const { data: stats } = useQuery<CampaignStatsResponse>(\n campaignId !== \"general\"\n ? `https://api.orderly.org/v1/public/campaign/stats?${new URLSearchParams(searchParams).toString()}`\n : null,\n { revalidateOnFocus: false },\n );\n\n useEffect(() => {\n setStatistics({\n total_participants: stats?.user_count,\n total_volume: stats?.volume,\n });\n }, [stats?.user_count, stats?.volume]);\n\n const tieredIndex = useMemo(() => {\n if (!currentCampaign?.tiered_prize_pools) return 0;\n return getCurrentTierIndex(\n statistics?.total_volume || 0,\n currentCampaign?.tiered_prize_pools,\n );\n }, [statistics?.total_volume, currentCampaign?.tiered_prize_pools]);\n\n const _currentCampaign = useMemo(() => {\n if (currentCampaign?.tiered_prize_pools) {\n return {\n ...currentCampaign,\n prize_pools: currentCampaign?.tiered_prize_pools[tieredIndex],\n };\n }\n return currentCampaign;\n }, [currentCampaign, tieredIndex]);\n\n const campaignDateRange = useMemo(() => {\n return currentCampaign?.start_time && currentCampaign?.end_time\n ? {\n start_time: currentCampaign.start_time,\n end_time: currentCampaign.end_time,\n }\n : undefined;\n }, [currentCampaign]);\n\n const memoizedValue = useMemo<TradingLeaderboardState>(() => {\n return {\n campaigns: filteredCampaigns,\n href: href,\n backgroundSrc: backgroundSrc,\n currentCampaignId: campaignId || \"general\",\n currentCampaign: _currentCampaign,\n updatedTime,\n userData,\n setUserData,\n onCampaignChange: memoCampaignChange,\n setUpdatedTime: setUpdatedTime,\n dataAdapter: dataAdapter,\n campaignDateRange,\n timeRange,\n statistics,\n setStatistics,\n };\n }, [\n backgroundSrc,\n currentCampaign,\n campaignId,\n filteredCampaigns,\n href,\n updatedTime,\n userData,\n dataAdapter,\n memoCampaignChange,\n campaignDateRange,\n timeRange,\n statistics,\n setStatistics,\n ]);\n\n return (\n <TradingLeaderboardContext.Provider value={memoizedValue}>\n {children}\n </TradingLeaderboardContext.Provider>\n );\n};\n\nexport const useTradingLeaderboardContext = () => {\n const ctx = useContext<TradingLeaderboardState>(TradingLeaderboardContext);\n return ctx;\n};\n","export const isReachedVolumeLimit = (volume: number, volumeLimit: number) => {\n return volume >= volumeLimit;\n};\n\n/**\n * Get the highest tier index that the user has reached based on trading volume\n * @param tradingVolume Current trading volume\n * @param tieredPrizePools Array of prize pool tiers with volume limits\n * @returns Highest reached tier index (0-based), or -1 if invalid data or no tiers reached\n */\nexport const getCurrentTierIndex = (\n tradingVolume: number,\n tieredPrizePools: Array<Array<{ volume_limit?: number }>>,\n): number => {\n if (!tieredPrizePools || tieredPrizePools.length === 0) {\n return -1;\n }\n\n // Extract volume limits and sort them in ascending order\n const volumeLimits = tieredPrizePools\n .map((tier) => tier[0]?.volume_limit || 0)\n .filter((limit) => limit >= 0)\n .sort((a, b) => a - b);\n\n if (volumeLimits.length === 0) {\n return -1;\n }\n\n // If trading volume is 0 or negative, no tiers reached\n // if (tradingVolume <= 0) {\n // return -1;\n // }\n\n // Find the highest tier that the user has reached\n let highestReachedTier = -1;\n for (let i = 0; i < volumeLimits.length; i++) {\n if (tradingVolume >= volumeLimits[i]) {\n highestReachedTier = i;\n } else {\n break;\n }\n }\n\n return highestReachedTier;\n};\n\n/**\n * Calculate progress bar width percentage based on current trading volume and tiered volume limits\n * @param tradingVolume Current trading volume\n * @param tieredPrizePools Array of prize pool tiers with volume limits\n * @returns Width percentage (0-100)\n */\nexport const calculateProgressWidth = (\n tradingVolume: number,\n tieredPrizePools: Array<Array<{ volume_limit?: number }>>,\n offset: number = 0,\n): number => {\n if (!tieredPrizePools || tieredPrizePools.length === 0) {\n return 0;\n }\n\n // Extract volume limits and sort them in ascending order\n const volumeLimits = tieredPrizePools\n .map((tier) => tier[0]?.volume_limit || 0)\n .filter((limit) => limit >= 0)\n .sort((a, b) => a - b);\n\n if (volumeLimits.length === 0) {\n return 0;\n }\n\n const firstSegmentWidth = getFirstSegmentWidth(volumeLimits.length);\n\n const segmentWidth = (100 - firstSegmentWidth) / (volumeLimits.length - 1);\n\n // Calculate the width of each segment (equally distributed)\n // const segmentWidth = 100 / volumeLimits.length;\n\n // If trading volume exceeds the highest limit, return 100%\n const maxLimit = volumeLimits[volumeLimits.length - 1];\n if (tradingVolume >= maxLimit) {\n return 100;\n }\n\n // Find which segment the current volume falls into (not necessarily reached)\n let segmentIndex = 0;\n for (let i = 0; i < volumeLimits.length; i++) {\n if (tradingVolume < volumeLimits[i]) {\n segmentIndex = i;\n break;\n }\n }\n\n // Calculate progress within the segment\n const segmentStart = segmentIndex === 0 ? 0 : volumeLimits[segmentIndex - 1];\n const segmentEnd = volumeLimits[segmentIndex];\n const segmentRange = segmentEnd - segmentStart;\n const volumeInSegment = tradingVolume - segmentStart;\n\n // Calculate progress percentage within current segment\n const progressInSegment =\n segmentRange > 0 ? volumeInSegment / segmentRange : 0;\n\n let totalWidth = firstSegmentWidth;\n for (let i = 1; i <= segmentIndex; i++) {\n if (i === segmentIndex) {\n const limitWidth = totalWidth + segmentWidth;\n const progressWidth = totalWidth + progressInSegment * segmentWidth;\n\n if (limitWidth - progressWidth < offset) {\n totalWidth = limitWidth - offset;\n } else {\n totalWidth = progressWidth;\n }\n } else {\n totalWidth += segmentWidth;\n }\n }\n\n return Math.min(Math.max(totalWidth, 0), 100);\n};\n\nconst getFirstSegmentWidth = (totalTiers: number) => {\n return Math.floor(100 / (totalTiers * 2));\n};\n\nexport const getProgressLeft = (totalTiers: number, index: number) => {\n const firstSegmentWidth = getFirstSegmentWidth(totalTiers);\n\n if (totalTiers === 1) {\n return `${firstSegmentWidth}%`;\n }\n\n const left =\n firstSegmentWidth + (index * (100 - firstSegmentWidth)) / (totalTiers - 1);\n return `${Math.min(left, 100)}%`;\n};\n","// deprecated, it will be removed in future version\nexport * from \"./deprecated/pages/leaderboard\";\nexport * from \"./deprecated/components/campaigns\";\nexport * from \"./deprecated/components/tradingList\";\nexport { type Campaign } from \"./deprecated/components/provider\";\n\nexport * from \"./components/provider\";\nexport * from \"./components/ranking/generalRanking\";\nexport * from \"./components/ranking/campaignRanking\";\nexport * from \"./components/ranking/shared/ranking.ui\";\n\nexport * from \"./components/leaderboard/generalLeaderboard\";\nexport * from \"./components/leaderboard/campaignLeaderboard\";\nexport * from \"./components/brokerStats/brokerStats.ui\";\nexport * from \"./pages/leaderboard/page\";\n\nexport * from \"./components/campaigns/type\";\nexport * from \"./type\";\nexport { getDateRange } from \"./utils\";\nexport { CampaignsHeaderWidget } from \"./components/campaigns/header\";\nexport { LeaderboardBackground } from \"./components/background\";\n","import { FC } from \"react\";\nimport { Ranking, RankingProps } from \"../shared/ranking.ui\";\nimport {\n CampaignRankingScriptOptions,\n useCampaignRankingScript,\n} from \"./campaignRanking.script\";\n\nexport type CampaignRankingWidgetProps = Pick<\n RankingProps,\n \"style\" | \"className\" | \"fields\"\n> &\n CampaignRankingScriptOptions;\n\nexport const CampaignRankingWidget: FC<CampaignRankingWidgetProps> = (\n props,\n) => {\n const { campaignId, fields, sortKey, ...rest } = props;\n const state = useCampaignRankingScript({\n campaignId,\n sortKey,\n });\n\n // @ts-ignore\n return <Ranking {...state} {...rest} fields={fields} type=\"campaign\" />;\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useAccount,\n useConfig,\n useInfiniteQuery,\n useQuery,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { TableSort, usePagination, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useEndReached } from \"../../../hooks/useEndReached\";\nimport { CampaignConfig, UserData } from \"../../campaigns/type\";\nimport { useTradingLeaderboardContext } from \"../../provider\";\nimport { calculateUserPoolReward } from \"../../rewards/utils\";\nimport { getCurrentAddressRowKey, isSameAddress } from \"../shared/util\";\n\nexport type CampaignRankingData = {\n broker_id: string;\n account_id: string;\n address: string;\n volume: number;\n pnl: number;\n total_deposit_amount: number;\n total_withdrawal_amount: number;\n start_account_value: number;\n end_account_value: number;\n\n // custom field\n key?: string;\n rank?: number | string;\n rewards?: {\n amount: number;\n currency: string;\n };\n};\n\ntype CampaignRankingResponse = {\n meta: API.RecordsMeta;\n rows: CampaignRankingData[];\n updated_time: number;\n};\nexport type CampaignRankingScriptReturn = ReturnType<\n typeof useCampaignRankingScript\n>;\n\nexport type CampaignRankingScriptOptions = {\n campaignId: number | string;\n sortKey?: \"volume\" | \"pnl\";\n};\n\nexport function useCampaignRankingScript(\n options: CampaignRankingScriptOptions,\n) {\n const { campaignId, sortKey = \"volume\" } = options;\n const [initialSort] = useState<TableSort>({\n sortKey,\n sort: \"desc\",\n });\n const [sort, setSort] = useState<TableSort | undefined>(initialSort);\n\n const { currentCampaign, setUserData, setUpdatedTime, dataAdapter } =\n useTradingLeaderboardContext();\n\n const { state } = useAccount();\n const brokerId = useConfig(\"brokerId\");\n\n const { isMobile } = useScreen();\n\n const { page, pageSize, setPage, parsePagination } = usePagination({\n pageSize: isMobile ? 100 : 20,\n });\n\n const isCustomData = typeof dataAdapter === \"function\";\n\n const customData = useMemo(() => {\n if (typeof dataAdapter === \"function\") {\n return dataAdapter({ page, pageSize });\n }\n }, [dataAdapter, page, pageSize]);\n\n const getUrl = (args: {\n page: number;\n pageSize: number;\n sort?: string | null;\n }) => {\n if (isCustomData) {\n return null;\n }\n const searchParams = new URLSearchParams();\n\n searchParams.set(\"page\", args.page.toString());\n searchParams.set(\n \"size\",\n // if page is 1, we need to set page size to 100 to get the top 100 data to judge user rank\n args.page === 1 ? \"100\" : args.pageSize.toString(),\n );\n\n if (campaignId) {\n searchParams.set(\"campaign_id\", campaignId.toString());\n }\n\n if (brokerId) {\n searchParams.set(\"broker_id\", brokerId);\n }\n\n if (args.sort) {\n searchParams.set(\"sort_by\", args.sort);\n } else if (args.sort !== null && sort) {\n searchParams.set(\"sort_by\", sort.sortKey);\n }\n\n // https://orderly.network/docs/build-on-omnichain/evm-api/restful-api/public/get-campaign-ranking\n // only get prod ranking data\n return `https://api.orderly.org/v1/public/campaign/ranking?${searchParams.toString()}`;\n };\n\n const { data, isLoading } = useQuery<CampaignRankingResponse>(\n getUrl({ page, pageSize }),\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const {\n data: infiniteData,\n size,\n setSize,\n isValidating,\n } = useInfiniteQuery<CampaignRankingResponse>(\n (pageIndex: number, previousPageData: any): string | null => {\n // reached the end\n if (previousPageData && !previousPageData.rows?.length) return null;\n\n if (!isMobile) {\n return null;\n }\n\n return getUrl({\n page: pageIndex + 1,\n pageSize,\n });\n },\n {\n initialSize: 1,\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n // it will use first page data cache\n const { data: top100Data } = useQuery<CampaignRankingResponse>(\n state.address\n ? getUrl({\n page: 1,\n pageSize: 100,\n // sort: \"desc\",\n })\n : null,\n {\n formatter: (res) => res,\n revalidateOnFocus: false,\n },\n );\n\n const getUserUrl = () => {\n if (!state.address || !campaignId || isCustomData) {\n return null;\n }\n\n const searchParams = new URLSearchParams();\n\n if (brokerId) {\n searchParams.set(\"broker_id\", brokerId);\n }\n\n searchParams.set(\"campaign_id\", campaignId.toString());\n searchParams.set(\"address\", state.address!);\n\n // https://orderly.network/docs/build-on-omnichain/evm-api/restful-api/public/get-campaign-user-info\n // only get prod user data\n return `https://api.orderly.org/v1/public/campaign/user?${searchParams.toString()}`;\n };\n\n const { data: userDataRes } = useQuery<CampaignRankingData[]>(getUserUrl(), {\n revalidateOnFocus: false,\n });\n\n const getAddressRank = useCallback(\n (address: string) => {\n if (top100Data?.rows?.length === 0) {\n return \"-\";\n }\n\n const index = top100Data?.rows.findIndex((item) =>\n isSameAddress(item.address, address!),\n );\n return index !== -1 ? index! + 1 : \"100+\";\n },\n [top100Data],\n );\n\n const userData = useMemo(() => {\n if (customData) {\n return customData?.userData;\n }\n\n if (!state.address || isLoading) {\n return undefined;\n }\n\n if (!userDataRes) {\n return {\n key: getCurrentAddressRowKey(state.address!),\n address: state.address,\n rank: \"-\",\n } as unknown as CampaignRankingData;\n }\n\n return {\n ...userDataRes,\n address: state.address,\n rank: getAddressRank(state.address!),\n key: getCurrentAddressRowKey(state.address!),\n };\n }, [state.address, userDataRes, isLoading, getAddressRank, customData]);\n\n const addRankForList = useCallback(\n (list: CampaignRankingData[], total: number) => {\n return list?.map((item, index) => {\n let rank: string | number = index + 1;\n\n if (sort?.sort === \"asc\") {\n rank = total - (page - 1) * pageSize - index;\n } else if (sort?.sort === \"desc\") {\n rank = (page - 1) * pageSize + index + 1;\n }\n\n return {\n ...item,\n rank,\n };\n });\n },\n [page, pageSize, sort],\n );\n\n const dataSource = useMemo(() => {\n if (customData) {\n return formatData(customData?.dataSource, currentCampaign, sortKey);\n }\n\n let list = data?.rows || [];\n if (page === 1) {\n list = list.slice(0, pageSize);\n }\n const total = data?.meta.total || 0;\n const rankList = addRankForList(list, total);\n\n const _data =\n page === 1 ? (userData ? [userData, ...rankList] : rankList) : rankList;\n\n return formatData(_data, currentCampaign, sortKey);\n }, [\n data,\n page,\n pageSize,\n userData,\n addRankForList,\n currentCampaign,\n sortKey,\n customData,\n ]);\n\n const dataList = useMemo(() => {\n if (customData) {\n return formatData(customData?.dataList, currentCampaign, sortKey);\n }\n\n if (!infiniteData?.length) {\n return [];\n }\n\n const total = infiniteData[0]?.meta.total || 0;\n const flatList = infiniteData?.map((item) => item.rows)?.flat();\n const rankList = addRankForList(flatList, total);\n\n const _data = userData ? [userData, ...rankList] : rankList;\n\n return formatData(_data, currentCampaign, sortKey);\n }, [\n infiniteData,\n userData,\n addRankForList,\n currentCampaign,\n sortKey,\n customData,\n ]);\n\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n const pagination = useMemo(\n () =>\n parsePagination({\n total: customData?.meta?.total || data?.meta?.total || 0,\n current_page:\n customData?.meta?.current_page || data?.meta?.current_page || 1,\n records_per_page: pageSize,\n }),\n [\n data?.meta?.total,\n data?.meta?.current_page,\n pageSize,\n parsePagination,\n customData,\n ],\n );\n\n useEndReached(sentinelRef, () => {\n if (!isValidating && isMobile) {\n setSize(size + 1);\n }\n });\n\n useEffect(() => {\n setPage(1);\n }, [state.address]);\n\n useEffect(() => {\n if (userData) {\n setUserData?.(userData as any);\n }\n }, [userData]);\n\n useEffect(() => {\n const time = customData?.updatedTime || data?.updated_time || 0;\n setUpdatedTime?.(time);\n // when currentCampaign changed, we need to reset the campaign ranking list updated time\n }, [data, currentCampaign, customData]);\n\n useEffect(() => {\n setSort({ sortKey, sort: \"desc\" });\n }, [sortKey]);\n\n return {\n pagination,\n initialSort,\n dataSource,\n isLoading: isLoading || isValidating || customData?.loading,\n isMobile,\n sentinelRef,\n dataList,\n address: state.address,\n };\n}\n\nfunction formatData(\n data?: any[],\n currentCampaign?: CampaignConfig,\n metric?: \"volume\" | \"pnl\",\n) {\n const pool = currentCampaign?.prize_pools?.find(\n (item) => item.metric === metric,\n );\n\n return data?.map((item) => {\n const rewards = pool ? calculateUserPoolReward(item as UserData, pool!) : 0;\n\n return {\n ...item,\n rewards: {\n amount: rewards,\n currency: pool?.currency,\n },\n };\n });\n}\n","import {\n TicketTierRule,\n TicketLinearRule,\n TicketRules,\n CampaignConfig,\n UserData,\n PrizePool,\n} from \"../campaigns/type\";\n\n/**\n * Get user metric value based on pool metric type\n */\nfunction getUserMetricValue(\n userdata: UserData,\n metric: \"volume\" | \"pnl\",\n): number {\n return metric === \"volume\" ? userdata.volume : userdata.pnl;\n}\n\n/**\n * Estimate user's rank based on current performance\n */\nfunction estimateUserRank(\n userdata: UserData,\n metric: \"volume\" | \"pnl\",\n): number | null {\n // If we have actual rank data, use it\n if (userdata.rank) {\n return Number(userdata.rank);\n }\n\n // Otherwise, make a simple estimation based on performance\n const userMetricValue = getUserMetricValue(userdata, metric);\n const totalParticipants = userdata.total_participants || 1000;\n\n if (userMetricValue <= 0) return null;\n\n // Simple heuristic: assume better performance means better rank\n // In reality, you would compare against actual leaderboard data\n if (userMetricValue >= 100000) return 1;\n if (userMetricValue >= 50000) return Math.floor(totalParticipants * 0.05); // Top 5%\n if (userMetricValue >= 10000) return Math.floor(totalParticipants * 0.2); // Top 20%\n if (userMetricValue >= 1000) return Math.floor(totalParticipants * 0.5); // Top 50%\n\n return Math.floor(totalParticipants * 0.8); // Bottom 80%\n}\n\n/**\n * Find reward amount for user based on estimated rank in a specific pool\n */\nfunction findRewardInPool(userdata: UserData, pool: PrizePool): number {\n const userMetricValue = getUserMetricValue(userdata, pool.metric);\n\n // Skip if user has no relevant data\n if (userMetricValue <= 0) return 0;\n\n const estimatedRank = estimateUserRank(userdata, pool.metric);\n if (estimatedRank === null) return 0;\n\n // Find matching tier based on estimated rank\n for (const tier of pool.tiers) {\n let isInTier = false;\n\n if (tier.position && estimatedRank === tier.position) {\n isInTier = true;\n } else if (tier.position_range) {\n const [start, end] = tier.position_range;\n if (estimatedRank >= start && estimatedRank <= end) {\n isInTier = true;\n }\n }\n\n if (isInTier) {\n return tier.amount;\n }\n }\n\n return 0;\n}\n\n/**\n * Calculate estimated rewards based on user's current performance and campaign configuration\n * @param userdata User's current trading data\n * @param campaign Campaign configuration\n * @returns Estimated reward amount with currency\n */\nexport function calculateEstimatedRewards(\n userdata: UserData,\n campaign: CampaignConfig,\n): { amount: number; currency: string } | null {\n if (!campaign.prize_pools || campaign.prize_pools.length === 0) {\n return null;\n }\n\n let totalEstimatedReward = 0;\n const mainCurrency = campaign.prize_pools[0].currency;\n\n // Only sum rewards from pools with the same currency to avoid mixing different currencies\n for (const pool of campaign.prize_pools) {\n totalEstimatedReward += findRewardInPool(userdata, pool);\n }\n\n return totalEstimatedReward > 0\n ? { amount: totalEstimatedReward, currency: mainCurrency }\n : null;\n}\n\n/**\n * Calculate estimated tickets earned based on user's trading performance\n * @param userdata User's current trading data\n * @param ticketRules Ticket configuration rules\n * @returns Estimated number of tickets\n */\nexport function calculateEstimatedTickets(\n userdata: UserData,\n ticketRules: TicketRules,\n): number {\n const userMetricValue =\n ticketRules.metric === \"volume\" ? userdata.volume : userdata.pnl;\n\n if (!userMetricValue) return 0;\n\n if (userMetricValue <= 0) return 0;\n\n if (ticketRules.mode === \"tiered\") {\n return calculateTieredTickets(userMetricValue, ticketRules.tiers || []);\n } else if (ticketRules.mode === \"linear\") {\n return calculateLinearTickets(userMetricValue, ticketRules.linear);\n }\n\n return 0;\n}\n\n/**\n * Calculate tickets using tiered mode\n * ≥ 25,000 volume → 10 tickets\n * ≥ 10,000 and < 25,000 → 5 tickets\n * ≥ 5,000 and < 10,000 → 1 ticket\n * < 5,000 → 0 tickets\n */\nfunction calculateTieredTickets(\n metricValue: number,\n tiers: TicketTierRule[],\n): number {\n // Sort tiers by value in descending order\n const sortedTiers = [...tiers].sort((a, b) => b.value - a.value);\n\n for (const tier of sortedTiers) {\n if (metricValue >= tier.value) {\n return tier.tickets;\n }\n }\n\n return 0;\n}\n\n/**\n * Calculate tickets using linear mode\n * Get X ticket for every Y volume/pnl\n */\nfunction calculateLinearTickets(\n metricValue: number,\n linearRule?: TicketLinearRule,\n): number {\n if (!linearRule || linearRule.every <= 0) return 0;\n\n const multiplier = Math.floor(metricValue / linearRule.every);\n return multiplier * linearRule.tickets;\n}\n\n/**\n * Format reward amount with currency for display\n */\nexport function formatRewardAmount(amount: number, currency: string): string {\n return `${amount.toLocaleString()} ${currency}`;\n}\n\n/**\n * Format ticket count for display\n */\nexport function formatTicketCount(tickets: number): string {\n return tickets.toLocaleString();\n}\n\n/**\n * Calculate user's estimated reward for a specific prize pool\n * @param userdata User's current trading data\n * @param pool Specific prize pool\n * @returns Estimated reward amount for this pool, or 0 if not eligible\n */\nexport function calculateUserPoolReward(\n userdata: UserData,\n pool: PrizePool,\n): number {\n return findRewardInPool(userdata, pool);\n}\n\n/**\n * Calculate progress percentage and next tier requirements for tickets\n * @param userdata User's current trading data\n * @param ticketRules Ticket configuration rules\n * @returns Object containing progress percentage and next tier requirements\n */\nexport function calculateTicketProgress(\n userdata: UserData,\n ticketRules: TicketRules,\n): { percent: number; value: number; atMax?: boolean } | null {\n if (!userdata || !ticketRules) return null;\n\n const userMetricValue = getUserMetricValue(userdata, ticketRules.metric);\n\n if (!userMetricValue) {\n if (ticketRules.mode === \"linear\") {\n return {\n percent: 0,\n value: ticketRules.linear?.every || 0,\n };\n } else {\n return {\n percent: 0,\n value: ticketRules.tiers?.[0]?.value || 0,\n };\n }\n }\n\n if (ticketRules.mode === \"linear\") {\n if (!ticketRules.linear) return null;\n\n const { every, tickets } = ticketRules.linear;\n const currentTier = Math.floor(userMetricValue / every);\n const nextTier = currentTier + 1;\n const progress = ((userMetricValue % every) / every) * 100;\n const nextTierValue = nextTier * every;\n\n return {\n percent: progress,\n value: nextTierValue - userMetricValue,\n };\n }\n\n if (ticketRules.mode === \"tiered\" && ticketRules.tiers) {\n const sortedTiers = [...ticketRules.tiers].sort(\n (a, b) => a.value - b.value,\n );\n\n // Check if tiers array is empty\n if (sortedTiers.length === 0) {\n return null;\n }\n\n // Special case: if user metric value is 0 or negative, show progress to first tier\n if (userMetricValue <= 0) {\n return {\n percent: 0,\n value: sortedTiers[0].value,\n };\n }\n\n // Find current tier and next tier\n let currentTier = null;\n let nextTier = sortedTiers[0]; // Default next tier is the first one\n\n for (let i = 0; i < sortedTiers.length; i++) {\n if (userMetricValue >= sortedTiers[i].value) {\n currentTier = sortedTiers[i];\n nextTier = sortedTiers[i + 1] || null; // Next tier or null if at max\n } else {\n // User hasn't reached this tier yet, so this is the next tier\n nextTier = sortedTiers[i];\n break;\n }\n }\n\n if (!nextTier) {\n return {\n percent: 100,\n value: 0,\n atMax: true,\n };\n }\n\n // If user hasn't reached any tier yet, calculate progress to first tier\n if (!currentTier) {\n const progress = (userMetricValue / nextTier.value) * 100;\n return {\n percent: progress,\n value: nextTier.value - userMetricValue,\n };\n }\n\n const progress =\n ((userMetricValue - currentTier.value) /\n (nextTier.value - currentTier.value)) *\n 100;\n\n return {\n percent: progress,\n value: nextTier.value - userMetricValue,\n };\n }\n\n return null;\n}\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 parseTimeRange,\n} from \"../../../utils\";\n\nexport type GeneralLeaderboardScriptReturn = ReturnType<\n typeof useGeneralLeaderboardScript\n>;\n\nexport const FilterDays = [1, 7, 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 timeRange?: {\n from?: string | Date;\n to?: string | Date | \"now\";\n };\n};\n\nexport function useGeneralLeaderboardScript(\n options?: GeneralLeaderboardScriptOptions,\n) {\n const { campaignDateRange, timeRange } = 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 parsedTimeRange = useMemo(() => {\n return parseTimeRange(timeRange);\n }, [timeRange]);\n\n const [activeTab, setActiveTab] = useState<LeaderboardTab>(\n LeaderboardTab.Volume,\n );\n const filterState = useFilter({\n defaultRange: currentOrAllTimeRange,\n customTimeRange: parsedTimeRange,\n });\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({\n defaultRange,\n customTimeRange,\n}: {\n defaultRange?: DateRange;\n customTimeRange?: DateRange | null;\n}) {\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 // For 1D, we want yesterday + today, so we pass 2 to getDateRange\n const daysToFetch = day === 1 ? 2 : day;\n setDateRange(getDateRange(daysToFetch));\n };\n\n useEffect(() => {\n // Use customTimeRange if provided, otherwise fall back to defaultRange or 90 days\n const rangeToUse = customTimeRange || defaultRange || getDateRange(90);\n setDateRange(rangeToUse);\n\n // Only reset filterDay if a custom timeRange is actually provided\n if (customTimeRange && rangeToUse?.from && rangeToUse?.to) {\n const offsetDay =\n Math.abs(differenceInDays(rangeToUse.from, rangeToUse.to)) + 1;\n if (FilterDays.includes(offsetDay as TFilterDays)) {\n setFilterDay(offsetDay as TFilterDays);\n } else {\n setFilterDay(null);\n }\n }\n // If no custom timeRange, keep the current filterDay (which defaults to 90)\n }, [defaultRange, customTimeRange]);\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","export type DateRange = {\n from?: Date;\n to?: Date;\n label?: string;\n};\n\nexport enum LeaderboardTab {\n Volume = \"volume\",\n Pnl = \"pnl\",\n Points = \"points\",\n}\n","import { FC, useMemo, lazy, Suspense } from \"react\";\nimport { cn, Box, useScreen, Divider } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTab } from \"../../../type\";\nimport { BrokerStatsWidget } from \"../../brokerStats/brokerStats.ui\";\nimport { RankingColumnFields } from \"../../ranking/shared/column\";\nimport { LeaderboardFilter } from \"../shared/LeaderboardFilter\";\nimport { LeaderboardTabs } from \"../shared/LeaderboardTabs\";\nimport { GeneralLeaderboardScriptReturn } from \"./generalLeaderboard.script\";\n\n// Lazy load GeneralRankingWidget to avoid SSR issues with OrderlyProvider hooks\nconst GeneralRankingWidget = lazy(() =>\n import(\"../../ranking/generalRanking\").then((mod) => ({\n default: mod.GeneralRankingWidget,\n })),\n);\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 leaderboardEndpoint?: string;\n timeRange?: {\n from?: string | Date;\n to?: string | Date | \"now\";\n };\n} & GeneralLeaderboardScriptReturn;\n\nexport const GeneralLeaderboard: FC<GeneralLeaderboardProps> = (props) => {\n const { isMobile } = useScreen();\n\n const fields = useMemo<RankingColumnFields[]>(() => {\n if (isMobile) {\n if (props.activeTab === LeaderboardTab.Points) {\n return [\"rank\", \"address\", \"points\"];\n }\n return [\n \"rank\",\n \"address\",\n props.activeTab === LeaderboardTab.Volume ? \"volume\" : \"pnl\",\n ];\n }\n const baseFields: RankingColumnFields[] = [\n \"rank\",\n \"address\",\n \"volume\",\n \"pnl\",\n ];\n if (props.leaderboardEndpoint) {\n baseFields.push(\"points\");\n }\n return baseFields;\n }, [isMobile, props.activeTab, props.leaderboardEndpoint]);\n\n if (isMobile) {\n return (\n <>\n <BrokerStatsWidget dateRange={props.dateRange} />\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 <LeaderboardFilter {...props} />\n <LeaderboardTabs\n isMobile={isMobile}\n className=\"oui-pt-0\"\n activeTab={props.activeTab}\n onTabChange={props.onTabChange}\n leaderboardEndpoint={props.leaderboardEndpoint}\n />\n\n <Suspense fallback={null}>\n <GeneralRankingWidget\n dateRange={props.dateRange}\n address={props.searchValue}\n sortKey={\n props.activeTab === LeaderboardTab.Volume\n ? \"perp_volume\"\n : \"realized_pnl\"\n }\n fields={fields}\n leaderboardEndpoint={props.leaderboardEndpoint}\n />\n </Suspense>\n </Box>\n </>\n );\n }\n\n return (\n <>\n <BrokerStatsWidget dateRange={props.dateRange} />\n <Box\n pt={2}\n px={6}\n r=\"2xl\"\n intensity={900}\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 <LeaderboardFilter {...props} />\n <Divider intensity={8} />\n\n <Suspense fallback={null}>\n <GeneralRankingWidget\n dateRange={props.dateRange}\n address={props.searchValue}\n fields={fields}\n leaderboardEndpoint={props.leaderboardEndpoint}\n />\n </Suspense>\n </Box>\n </>\n );\n};\n","import { FC, SVGProps } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n CloseCircleFillIcon,\n cn,\n DataFilter,\n Flex,\n Input,\n Text,\n useScreen,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ScrollIndicator } from \"@kodiak-finance/orderly-ui\";\nimport {\n FilterDays,\n GeneralLeaderboardScriptReturn,\n} from \"../generalLeaderboard/generalLeaderboard.script\";\n\nexport type LeaderboardFilterProps = GeneralLeaderboardScriptReturn;\n\nexport const LeaderboardFilter: FC<LeaderboardFilterProps> = (props) => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const { useCampaignDateRange, weeklyRanges, setDateRange } = props;\n\n const weeklyView = (\n <Flex gap={3} className={cn(isMobile ? \"oui-h-[24px]\" : \"oui-h-[53px]\")}>\n {weeklyRanges.map((range) => (\n <button\n className=\"oui-relative oui-w-fit oui-whitespace-nowrap oui-px-2 oui-py-[2px] oui-text-sm oui-bg-base-4\"\n key={range.label}\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={\n props.dateRange?.label === range.label ? \"brand\" : undefined\n }\n className={\n props.dateRange?.label !== range.label\n ? \"oui-text-base-contrast-54\"\n : \"\"\n }\n >\n {`${range.label}`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-absolute oui-inset-0 oui-rounded oui-opacity-[.12] oui-gradient-primary\"\n onClick={() => {\n setDateRange(range);\n }}\n ></div>\n </button>\n ))}\n </Flex>\n );\n\n const input = (\n <Input\n value={props.searchValue}\n onValueChange={props.onSearchValueChange}\n placeholder={t(\"common.address.search.placeholder\")}\n className={cn(\n \"oui-trading-leaderboard-trading-search-input\",\n \"oui-w-full\",\n )}\n size=\"sm\"\n prefix={\n <Box pl={3} pr={1}>\n <SearchIcon className=\"oui-text-base-contrast-36\" />\n </Box>\n }\n suffix={\n props.searchValue && (\n <Box mr={2}>\n <CloseCircleFillIcon\n size={14}\n className=\"oui-cursor-pointer oui-text-base-contrast-36\"\n onClick={props.clearSearchValue}\n />\n </Box>\n )\n }\n autoComplete=\"off\"\n />\n );\n\n const dateRangeView = props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[53px] oui-border-none\"\n />\n );\n\n const filterDayView = FilterDays.map((value) => {\n return (\n <button\n className={`oui-px-3 oui-py-1 oui-rounded oui-text-xs oui-font-medium oui-transition-colors ${\n props.filterDay === value\n ? \"oui-bg-primary oui-text-white\"\n : \"oui-bg-base-6 oui-text-base-contrast-60 hover:oui-bg-base-4 hover:oui-text-base-contrast\"\n }`}\n key={value}\n onClick={() => {\n props.updateFilterDay(value as any);\n }}\n >\n {`${value}D`}\n </button>\n );\n });\n\n if (isMobile) {\n return (\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n direction=\"column\"\n mt={3}\n className={cn(\"oui-mobile-trading-leaderboard-ranking-filter\")}\n >\n {input}\n\n {useCampaignDateRange ? (\n <Flex gap={3} className=\"oui-w-full oui-py-3\">\n <ScrollIndicator className=\"oui-w-full\">\n {weeklyView}\n </ScrollIndicator>\n </Flex>\n ) : (\n <Flex gap={3} className=\"oui-w-full\">\n {dateRangeView}\n <ScrollIndicator className=\"oui-w-full\">\n <Flex gap={3}>{filterDayView}</Flex>\n </ScrollIndicator>\n </Flex>\n )}\n </Flex>\n );\n }\n\n return (\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n className={cn(\"oui-trading-leaderboard-ranking-filter\")}\n >\n <Flex gap={2}>\n {useCampaignDateRange && weeklyView}\n {!useCampaignDateRange && dateRangeView}\n {!useCampaignDateRange && filterDayView}\n </Flex>\n <Box width={240}>{input}</Box>\n </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { FC, useEffect, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Flex, TabPanel, Tabs } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTab } from \"../../../type\";\nimport { formatUpdateDate } from \"../../../utils\";\nimport { useTradingLeaderboardContext } from \"../../provider\";\n\ntype LeaderboardTabsProps = {\n isMobile?: boolean;\n className?: string;\n activeTab: LeaderboardTab;\n onTabChange: (tab: LeaderboardTab) => void;\n leaderboardEndpoint?: string;\n};\n\nexport const LeaderboardTabs: FC<LeaderboardTabsProps> = (props) => {\n const { t } = useTranslation();\n const { updatedTime, currentCampaign } = useTradingLeaderboardContext();\n\n const updateTime = useMemo(() => {\n if (updatedTime && currentCampaign) {\n return formatUpdateDate(updatedTime);\n }\n return \"\";\n }, [props.isMobile, updatedTime, currentCampaign]);\n\n const { showVolume, showPnl, showPoints } = useMemo(() => {\n const metrics = currentCampaign?.prize_pools?.map((item) => item.metric);\n const isMobileGeneral = props.isMobile && !currentCampaign;\n const showVolume = isMobileGeneral\n ? true\n : metrics?.includes(LeaderboardTab.Volume);\n const showPnl = isMobileGeneral\n ? true\n : metrics?.includes(LeaderboardTab.Pnl);\n const showPoints = !!props.leaderboardEndpoint;\n\n return {\n showVolume,\n showPnl,\n showPoints,\n };\n }, [\n currentCampaign,\n props.activeTab,\n props.isMobile,\n props.leaderboardEndpoint,\n ]);\n\n useEffect(() => {\n // set default tab\n if (showVolume && showPnl) {\n props.onTabChange(LeaderboardTab.Volume);\n } else if (showVolume) {\n props.onTabChange(LeaderboardTab.Volume);\n } else if (showPnl) {\n props.onTabChange(LeaderboardTab.Pnl);\n } else if (showPoints) {\n props.onTabChange(LeaderboardTab.Points);\n }\n }, [currentCampaign, showVolume, showPnl, showPoints]);\n\n const renderTabs = () => {\n const hasAnyTab = showVolume || showPnl || showPoints;\n\n if (!hasAnyTab) {\n return <div></div>;\n }\n\n return (\n <Tabs\n value={props.activeTab}\n onValueChange={props.onTabChange as (tab: string) => void}\n variant=\"contained\"\n size=\"lg\"\n key={currentCampaign?.campaign_id}\n >\n {showVolume && (\n <TabPanel\n title={t(\"tradingLeaderboard.tradingVolume\")}\n value={LeaderboardTab.Volume}\n ></TabPanel>\n )}\n {showPnl && (\n <TabPanel\n title={t(\"common.realizedPnl\")}\n value={LeaderboardTab.Pnl}\n ></TabPanel>\n )}\n {showPoints && (\n <TabPanel\n title={t(\"tradingLeaderboard.points\")}\n value={LeaderboardTab.Points}\n ></TabPanel>\n )}\n </Tabs>\n );\n };\n\n return (\n <Flex\n width=\"100%\"\n py={3}\n justify=\"between\"\n className={cn(\n \"oui-trading-leaderboard-ranking-tabs\",\n \"oui-border-b oui-border-line\",\n props.className,\n )}\n >\n {renderTabs()}\n {/* <Tabs\n value={props.activeTab}\n onValueChange={props.onTabChange as (tab: string) => void}\n variant=\"contained\"\n size=\"lg\"\n >\n <TabPanel\n title=\"Trading volume\"\n value={LeaderboardTab.Volume}\n ></TabPanel>\n <TabPanel title=\"Realized PnL\" value={LeaderboardTab.Pnl}></TabPanel>\n </Tabs> */}\n {updateTime && (\n <Flex\n itemAlign=\"start\"\n direction={props.isMobile ? \"column\" : \"row\"}\n gap={1}\n className={cn(\n props.isMobile ? \"oui-text-3xs\" : \"oui-text-sm\",\n \"oui-text-base-contrast-36\",\n )}\n >\n <span>{t(\"tradingLeaderboard.lastUpdate\")}:</span>\n <span>{updateTime}</span>\n </Flex>\n )}\n </Flex>\n );\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\"\n | \"className\"\n | \"campaignDateRange\"\n | \"leaderboardEndpoint\"\n | \"timeRange\"\n>;\n\nexport const GeneralLeaderboardWidget: FC<GeneralLeaderboardWidgetProps> = (\n props,\n) => {\n const state = useGeneralLeaderboardScript({\n campaignDateRange: props.campaignDateRange,\n timeRange: props.timeRange,\n });\n\n return (\n <GeneralLeaderboard\n {...state}\n className={props.className}\n style={props.style}\n leaderboardEndpoint={props.leaderboardEndpoint}\n timeRange={props.timeRange}\n />\n );\n};\n","import { useMemo, useState } from \"react\";\nimport { LeaderboardTab } from \"../../../type\";\nimport { useTradingLeaderboardContext } from \"../../provider\";\n\nexport type CampaignLeaderboardScriptReturn = ReturnType<\n typeof useCampaignLeaderboardScript\n>;\n\nexport function useCampaignLeaderboardScript() {\n const [activeTab, setActiveTab] = useState<LeaderboardTab>(\n LeaderboardTab.Volume,\n );\n const { currentCampaign } = useTradingLeaderboardContext();\n\n const excludeColumns = useMemo(() => {\n return (\n currentCampaign?.leaderboard_config?.exclude_leaderboard_columns || []\n );\n }, [currentCampaign]);\n\n return {\n activeTab,\n onTabChange: setActiveTab,\n excludeColumns,\n };\n}\n","import { FC, useMemo } from \"react\";\nimport { difference } from \"ramda\";\nimport { cn, Box, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTab } from \"../../../type\";\nimport { CampaignRankingWidget } from \"../../ranking/campaignRanking\";\nimport { RankingColumnFields } from \"../../ranking/shared/column\";\nimport { LeaderboardTabs } from \"../shared/LeaderboardTabs\";\nimport { CampaignLeaderboardScriptReturn } from \"./campaignLeaderboard.script\";\n\nexport type CampaignLeaderboardProps = {\n style?: React.CSSProperties;\n className?: string;\n campaignId: number | string;\n} & CampaignLeaderboardScriptReturn;\n\nexport const CampaignLeaderboard: FC<CampaignLeaderboardProps> = (props) => {\n const { isMobile } = useScreen();\n\n const sortKey = useMemo(() => {\n return props.activeTab === LeaderboardTab.Volume ? \"volume\" : \"pnl\";\n }, [props.activeTab]);\n\n const fields = useMemo<RankingColumnFields[]>(() => {\n const allFields: RankingColumnFields[] = [\n \"rank\",\n \"address\",\n sortKey,\n \"rewards\",\n ];\n return difference(allFields, props.excludeColumns || []);\n }, [isMobile, sortKey, props.excludeColumns]);\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-campaign-leaderboard oui-relative\",\n )}\n >\n <LeaderboardTabs\n isMobile={isMobile}\n activeTab={props.activeTab}\n onTabChange={props.onTabChange}\n />\n\n <CampaignRankingWidget\n campaignId={props.campaignId}\n fields={fields}\n sortKey={sortKey}\n />\n </Box>\n );\n }\n\n return (\n <Box\n pt={2}\n px={6}\n r=\"2xl\"\n intensity={900}\n className={cn(\n \"oui-trading-leaderboard-campaign-leaderboard oui-relative\",\n \"oui-mx-auto oui-max-w-[992px]\",\n )}\n >\n <LeaderboardTabs\n isMobile={isMobile}\n activeTab={props.activeTab}\n onTabChange={props.onTabChange}\n />\n <CampaignRankingWidget\n campaignId={props.campaignId}\n fields={fields}\n sortKey={sortKey}\n />\n </Box>\n );\n};\n","import { FC } from \"react\";\nimport { useCampaignLeaderboardScript } from \"./campaignLeaderboard.script\";\nimport {\n CampaignLeaderboard,\n CampaignLeaderboardProps,\n} from \"./campaignLeaderboard.ui\";\n\nexport type CampaignLeaderboardWidgetProps = Pick<\n CampaignLeaderboardProps,\n \"style\" | \"className\" | \"campaignId\"\n>;\n\nexport const CampaignLeaderboardWidget: FC<CampaignLeaderboardWidgetProps> = (\n props,\n) => {\n const state = useCampaignLeaderboardScript();\n\n return (\n <CampaignLeaderboard\n {...state}\n className={props.className}\n style={props.style}\n campaignId={props.campaignId}\n />\n );\n};\n","import { FC, ReactNode, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Box, cn, Flex, Text, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardBackground } from \"../../components/background\";\nimport { BrokerStatsWidget } from \"../../components/brokerStats/brokerStats.ui\";\nimport { CampaignsWidget } from \"../../components/campaigns/campaigns.widget\";\nimport { GeneralLeaderboardIWidget } from \"../../components/leaderboard128/generalLeaderboard\";\nimport { CampaignLeaderboardWidget } from \"../../components/leaderboard/campaignLeaderboard\";\nimport {\n GeneralLeaderboard,\n GeneralLeaderboardWidgetProps,\n} from \"../../components/leaderboard/generalLeaderboard\";\nimport { useGeneralLeaderboardScript } from \"../../components/leaderboard/generalLeaderboard/generalLeaderboard.script\";\nimport {\n TradingLeaderboardProvider,\n TradingLeaderboardProviderProps,\n useTradingLeaderboardContext,\n} from \"../../components/provider\";\nimport { RewardsWidget } from \"../../components/rewards/rewards.widget\";\nimport { RuleWidget } from \"../../components/rule\";\n\nexport type LeaderboardPageProps = GeneralLeaderboardWidgetProps &\n TradingLeaderboardProviderProps & {\n style?: React.CSSProperties;\n className?: string;\n hideCampaignsBanner?: boolean;\n };\n\nexport const LeaderboardPage: FC<LeaderboardPageProps> = (props) => {\n const { hideCampaignsBanner, ...rest } = props;\n return (\n <TradingLeaderboardProvider {...rest}>\n <div\n style={{\n paddingBottom: \"calc(64px + env(safe-area-inset-bottom))\",\n }}\n className={cn(\n \"oui-trading-leaderboard-page\",\n \"oui-relative oui-bg-base-10\",\n \"oui-font-semibold\",\n props.className,\n )}\n >\n <CampaignsWidget\n hideCampaignsBanner={hideCampaignsBanner}\n className=\"oui-relative oui-z-[1] oui-mx-6\"\n />\n <RewardsWidget />\n <LeaderboardSection {...props} />\n <RuleWidget />\n </div>\n </TradingLeaderboardProvider>\n );\n};\n\ntype LeaderboardSectionProps = {\n style?: React.CSSProperties;\n className?: string;\n};\n\nexport const LeaderboardSection: FC<LeaderboardSectionProps> = (props) => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const {\n currentCampaignId,\n currentCampaign,\n backgroundSrc,\n campaignDateRange,\n timeRange,\n } = useTradingLeaderboardContext();\n\n // Lift the hook to page level so both widgets share the same dateRange state\n const leaderboardScript = useGeneralLeaderboardScript({\n campaignDateRange,\n timeRange,\n });\n\n // Memoize dateRange to prevent unnecessary re-renders in BrokerStatsWidget\n const memoizedDateRange = useMemo(\n () => leaderboardScript.dateRange,\n [leaderboardScript.dateRange?.from, leaderboardScript.dateRange?.to],\n );\n\n if (currentCampaignId === \"general\") {\n return (\n <Box px={3} className={cn(\"oui-mix-blend-screen\")}>\n <LeaderboardBackground backgroundSrc={backgroundSrc} />\n <BrokerStatsWidget dateRange={memoizedDateRange} />\n <GeneralLeaderboard\n {...leaderboardScript}\n // className=\"oui-mt-10\"\n timeRange={timeRange}\n />\n </Box>\n );\n }\n\n if (currentCampaign?.leaderboard_config?.use_general_leaderboard) {\n return (\n <Box px={3}>\n <BrokerStatsWidget dateRange={memoizedDateRange} />\n <LeaderboardTitle\n title={t(\"tradingLeaderboard.arena\")}\n isMobile={isMobile}\n />\n <GeneralLeaderboardIWidget\n {...props}\n // className=\"oui-mt-10\"\n campaignDateRange={campaignDateRange}\n timeRange={timeRange}\n weekOneAddresses={\n currentCampaign?.leaderboard_config?.week_one_addresses\n }\n />\n </Box>\n );\n }\n\n if (\n currentCampaign &&\n !currentCampaign.hide_arena &&\n currentCampaignId != \"general\"\n ) {\n return (\n <Box px={3}>\n <BrokerStatsWidget dateRange={memoizedDateRange} />\n <LeaderboardTitle\n title={t(\"tradingLeaderboard.arena\")}\n isMobile={isMobile}\n />\n <CampaignLeaderboardWidget {...props} campaignId={currentCampaignId} />\n </Box>\n );\n }\n\n return null;\n};\n\nexport const LeaderboardTitle = (props: {\n title: ReactNode;\n isMobile?: boolean;\n}) => {\n return (\n <Flex\n mb={props.isMobile ? 3 : 6}\n gapY={1}\n justify=\"center\"\n direction=\"column\"\n >\n <Text\n className={cn(\n \"oui-trading-leaderboard-title oui-font-bold\",\n props.isMobile\n ? \"oui-text-[20px] oui-leading-[24px]\"\n : \"oui-text-[32px] oui-leading-[44px]\",\n )}\n >\n {props.title}\n </Text>\n <Box\n width={24}\n height={6}\n r=\"base\"\n className=\"oui-bg-[linear-gradient(270deg,rgb(var(--oui-gradient-brand-start))_0%,rgb(var(--oui-gradient-brand-end))_100%)]\"\n />\n </Flex>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { cn, useScreen } from \"@kodiak-finance/orderly-ui\";\n\ntype BackgroundProps = {\n backgroundSrc?: string;\n};\n\nexport const LeaderboardBackground: FC<BackgroundProps> = (props) => {\n const { isMobile } = useScreen();\n\n const isVideo = useMemo(() => {\n return isVideoSrc(props.backgroundSrc);\n }, [props.backgroundSrc]);\n\n if (isMobile) {\n return null;\n }\n\n const linearGradient =\n \"linear-gradient(180deg, rgba(var(--oui-color-base-10) / 0.3) 0%, rgba(var(--oui-color-base-10) / 0) 70%, rgba(var(--oui-color-base-10) / 1) 100%)\";\n\n if (isVideo) {\n return (\n <div className={cn(\"oui-absolute oui-left-0 oui-top-0\", \"oui-size-full\")}>\n <div\n style={{\n backgroundImage: linearGradient,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\"oui-absolute oui-left-0 oui-top-0\", \"oui-size-full\")}\n />\n <video\n autoPlay\n loop\n muted\n className={cn(\n // rest style\n \"oui-border-none oui-bg-transparent oui-outline-none\",\n \"oui-size-full\",\n // \"oui-absolute oui-top-0 oui-left-0\",\n \"oui-object-cover\",\n \"oui-opacity-50\",\n )}\n >\n <source src={props.backgroundSrc} type=\"video/mp4\" />\n <source src={props.backgroundSrc} type=\"video/webm\" />\n <source src={props.backgroundSrc} type=\"video/ogg\" />\n <source src={props.backgroundSrc} type=\"video/avi\" />\n Your browser does not support the video tag.\n </video>\n </div>\n );\n }\n\n if (props.backgroundSrc) {\n return (\n <div\n style={{\n backgroundImage: `${linearGradient}, url(${props.backgroundSrc}) `,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n }}\n className={cn(\n \"oui-general-leaderboard-background\",\n \"oui-absolute oui-left-0 oui-top-0 oui-z-[-1]\",\n \"oui-size-full\",\n \"oui-opacity-50\",\n )}\n />\n );\n }\n};\n\nfunction isVideoSrc(src?: string) {\n const extension = src?.split(\".\").pop();\n return [\"mp4\", \"webm\", \"avi\", \"ogg\"].includes(extension ?? \"\");\n}\n","import { FC, useMemo } from \"react\";\nimport { cn, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useCanTrade } from \"../../hooks/useCanTrade\";\nimport { CampaignsContentDesktopUI } from \"./campaigns.content.desktop.ui\";\nimport { useCampaignsScript } from \"./campaigns.script\";\nimport { CampaignsTimeDesktopUI } from \"./components/time.desktop.ui\";\nimport { CampaignsHeaderWidget } from \"./header\";\n\nexport type CampaignsWidgetProps = {\n className?: string;\n style?: React.CSSProperties;\n hideCampaignsBanner?: boolean;\n};\n\nexport const CampaignsWidget: FC<CampaignsWidgetProps> = (props) => {\n const state = useCampaignsScript();\n const { isMobile } = useScreen();\n\n const canTrade = useCanTrade();\n\n const emphasisConfig = state.currentCampaign?.emphasisConfig;\n\n const contentClassNames = useMemo(() => {\n if (emphasisConfig?.subtitle) {\n return {\n container: !canTrade\n ? \"!oui-h-[680px] lg:!oui-h-[700px]\"\n : \"!oui-h-[600px] lg:!oui-h-[700px]\",\n topContainer: \"!oui-w-[90%]\",\n };\n }\n\n if (!isMobile) return undefined;\n return {\n container: cn(\"oui-h-[400px] oui-gap-5\"),\n time: \"oui-text-sm oui-h-5\",\n title: \"oui-text-[24px] oui-leading-[32px]\",\n description: \"oui-text-2xs oui-leading-[15px]\",\n topContainer: cn(\"oui-w-[284px] oui-gap-1\"),\n };\n }, [isMobile, emphasisConfig, canTrade]);\n\n return (\n <div\n className={cn([\"oui-relative oui-z-[1] oui-overflow-hidden\"])}\n style={props.style}\n >\n {!props.hideCampaignsBanner && (\n <CampaignsHeaderWidget\n backgroundSrc={state.backgroundSrc}\n campaigns={state.campaigns}\n currentCampaignId={state.currentCampaignId.toString()}\n onCampaignChange={state.onCampaignChange}\n />\n )}\n {state.currentCampaign && (\n <CampaignsContentDesktopUI\n {...state}\n classNames={contentClassNames}\n isMobile={isMobile}\n campaign={state.currentCampaign}\n />\n )}\n {state.currentCampaign && (\n <CampaignsTimeDesktopUI\n campaign={state.currentCampaign}\n isMobile={isMobile}\n />\n )}\n </div>\n );\n};\n","import { useMemo } from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\n\nexport function useCanTrade() {\n const { state } = useAccount();\n\n const { wrongNetwork, disabledConnect } = useAppContext();\n\n const canTrade = useMemo(() => {\n return (\n !wrongNetwork &&\n !disabledConnect &&\n (state.status === AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected)\n );\n }, [state.status, wrongNetwork, disabledConnect]);\n\n return canTrade;\n}\n","import { FC, useMemo, useState } from \"react\";\nimport { cn, Flex, Text } from \"@kodiak-finance/orderly-ui\";\nimport { CampaignsScriptReturn } from \"./campaigns.script\";\nimport { NormalPricePoolUI } from \"./pricePool/normalPricePool.ui\";\nimport { PricePoolWidget } from \"./pricePool/pricePool.widget\";\nimport { CampaignConfig } from \"./type\";\nimport {\n formatCampaignDateRange,\n getTradingVolume,\n getTicketPrizePool,\n} from \"./utils\";\n\ntype CampaignsContentDesktopUIProps = Partial<CampaignsScriptReturn> & {\n classNames?: {\n container?: string;\n title?: string;\n description?: string;\n time?: string;\n topContainer?: string;\n descriptionContainer?: string;\n };\n isMobile?: boolean;\n campaign: CampaignConfig;\n};\nexport const CampaignsContentDesktopUI: FC<CampaignsContentDesktopUIProps> = ({\n campaign,\n statistics,\n onLearnMore,\n onTradeNow,\n backgroundSrc,\n classNames,\n isMobile,\n shouldShowJoinButton,\n joinCampaign,\n isJoining,\n canTrade,\n totalPrizePool,\n}) => {\n const bgSrc = campaign?.image || backgroundSrc;\n const dateRange = formatCampaignDateRange(\n campaign?.start_time || \"\",\n campaign?.end_time || \"\",\n );\n // for mobile\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n const tooltipProps = useMemo(() => {\n if (!isMobile) {\n return {};\n }\n return {\n open: tooltipOpen,\n onOpenChange: setTooltipOpen,\n };\n }, [tooltipOpen, isMobile, setTooltipOpen]);\n\n // Get campaign data using utility functions\n const tradingVolume = getTradingVolume(statistics);\n const ticketPrizePool = getTicketPrizePool(campaign);\n\n const showTradeButton = useMemo(() => {\n return (\n !shouldShowJoinButton && new Date().toISOString() < campaign.end_time\n );\n }, [shouldShowJoinButton, campaign.end_time]);\n\n const isCampaignStarted = useMemo(() => {\n return campaign.start_time < new Date().toISOString();\n }, [campaign]);\n\n const highlightPool = useMemo(() => {\n if (!campaign?.highlight_pool_id) {\n return null;\n }\n return campaign?.prize_pools?.find(\n (pool) => pool.pool_id === campaign.highlight_pool_id,\n );\n }, [campaign]);\n\n const showTieredPricePool = useMemo(() => {\n return (\n campaign?.tiered_prize_pools && campaign?.tiered_prize_pools.length > 0\n );\n }, [campaign]);\n\n const renderContent = () => {\n if (campaign?.emphasisConfig) {\n return (\n <Flex\n id=\"oui-trading-leaderboard-emphasis-campaign-content\"\n direction=\"column\"\n itemAlign=\"center\"\n className=\"oui-gap-y-1 lg:oui-gap-y-2\"\n >\n <Text\n className={cn([\n \"oui-trading-leaderboard-title oui-text-[56px]oui-font-bold oui-text-center oui-text-base-contrast\",\n \"oui-text-[32px] oui-leading-[32px] lg:oui-text-[56px] lg:oui-leading-[56px]\",\n ])}\n >\n {campaign?.title}\n </Text>\n <Text.gradient\n color=\"brand\"\n className={cn([\n \"oui-text-center oui-font-bold\",\n \"oui-text-[28px] oui-leading-[36px] lg:oui-text-[48px] lg:oui-leading-[56px]\",\n \"oui-w-[85%] lg:oui-w-full\",\n ])}\n >\n {campaign?.emphasisConfig?.subtitle}\n </Text.gradient>\n <Text\n className={cn([\n \"oui-text-center oui-font-semibold oui-text-base-contrast-80\",\n \"oui-text-[16px] oui-leading-[24px] lg:oui-text-[24px] lg:oui-leading-[32px]\",\n ])}\n >\n {campaign?.description}\n </Text>\n </Flex>\n );\n }\n return (\n <>\n <Text\n className={cn([\n \"oui-trading-leaderboard-title oui-text-center oui-text-[48px] oui-font-bold oui-leading-[56px] oui-text-base-contrast\",\n classNames?.title,\n ])}\n >\n {campaign.title}\n </Text>\n <div\n className={cn([\n \"oui-w-[342px] oui-text-center\",\n classNames?.descriptionContainer,\n ])}\n >\n <Text\n size=\"sm\"\n weight=\"semibold\"\n className={cn([\n \"oui-text-base-contrast-54\",\n classNames?.description,\n ])}\n >\n {campaign.description}\n </Text>\n </div>\n </>\n );\n };\n\n return (\n <div\n className={cn([\n \"oui-flex oui-h-[500px] oui-w-full oui-flex-col oui-items-center oui-justify-center oui-gap-10\",\n `oui-bg-cover oui-bg-center oui-bg-no-repeat`,\n campaign?.tiered_prize_pools?.length && !isMobile && \"oui-h-[634px]\",\n classNames?.container,\n ])}\n style={{\n backgroundImage: `linear-gradient(180deg, rgba(var(--oui-color-base-10) / 1) 0%, rgba(var(--oui-color-base-10) / 0.8) 15%, rgba(var(--oui-color-base-10) / 0.4) 40%, rgba(var(--oui-color-base-10) / 0.4) 60%, rgba(var(--oui-color-base-10) / 0.8) 85%, rgba(var(--oui-color-base-10) / 1) 100%), url(${bgSrc})`,\n }}\n >\n <div\n className={cn([\n \"oui-flex oui-flex-col oui-items-center oui-justify-center oui-gap-[10px]\",\n classNames?.topContainer,\n ])}\n >\n <Text\n size=\"sm\"\n weight=\"semibold\"\n className={cn([\"oui-text-base-contrast-54\", classNames?.time])}\n >\n {dateRange}\n </Text>\n {renderContent()}\n </div>\n {showTieredPricePool ? (\n <PricePoolWidget\n onLearnMore={onLearnMore as () => void}\n onTradeNow={onTradeNow as () => void}\n shouldShowJoinButton={shouldShowJoinButton as boolean}\n joinCampaign={\n joinCampaign as (data: {\n campaign_id: string | number;\n }) => Promise<any>\n }\n isJoining={isJoining as boolean}\n canTrade={canTrade as boolean}\n campaign={campaign}\n statistics={statistics}\n tradingVolume={tradingVolume}\n isMobile={isMobile as boolean}\n isCampaignStarted={isCampaignStarted}\n tooltipProps={tooltipProps}\n showTradeButton={showTradeButton}\n totalPrizePool={totalPrizePool as any}\n />\n ) : (\n <NormalPricePoolUI\n totalPrizePool={totalPrizePool}\n onLearnMore={onLearnMore}\n onTradeNow={onTradeNow}\n shouldShowJoinButton={shouldShowJoinButton}\n campaign={campaign}\n statistics={statistics}\n tradingVolume={tradingVolume}\n ticketPrizePool={ticketPrizePool as any}\n highlightPool={highlightPool as any}\n isMobile={isMobile as boolean}\n isCampaignStarted={isCampaignStarted}\n tooltipProps={tooltipProps}\n showTradeButton={showTradeButton}\n joinCampaign={\n joinCampaign as (data: {\n campaign_id: string | number;\n }) => Promise<any>\n }\n isJoining={isJoining as boolean}\n canTrade={canTrade as boolean}\n />\n )}\n </div>\n );\n};\n","import { FC, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n cn,\n Text,\n Tooltip,\n InfoCircleIcon,\n ChevronRightIcon,\n Button,\n} from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuard } from \"@kodiak-finance/orderly-ui-connector\";\nimport { CampaignsScriptReturn } from \"../campaigns.script\";\nimport { CampaignConfig } from \"../type\";\nimport { formatPrizeAmount } from \"../utils\";\n\ntype NormalPricePoolUIProps = Partial<CampaignsScriptReturn> & {\n isMobile: boolean;\n campaign: CampaignConfig;\n isCampaignStarted: boolean;\n ticketPrizePool?: { amount: number; currency: string };\n highlightPool?: { label: string; total_prize: number; currency: string };\n tradingVolume: number;\n tooltipProps: any;\n showTradeButton: boolean;\n};\n\nexport const NormalPricePoolUI: FC<NormalPricePoolUIProps> = ({\n totalPrizePool,\n ticketPrizePool,\n highlightPool,\n isMobile,\n isCampaignStarted,\n campaign,\n onLearnMore,\n onTradeNow,\n shouldShowJoinButton,\n joinCampaign,\n isJoining,\n canTrade,\n statistics,\n tradingVolume,\n tooltipProps,\n showTradeButton,\n}) => {\n const { t } = useTranslation();\n\n const tooltipContent = useMemo(() => {\n if (!campaign?.prize_pools) {\n return null;\n }\n\n return (\n <div className=\"oui-flex oui-min-w-[240px] oui-flex-col oui-gap-1\">\n {campaign?.prize_pools?.map((pool) => {\n return (\n <div\n key={pool.pool_id}\n className=\"oui-flex oui-h-[18px] oui-items-center oui-justify-between\"\n >\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast-54\"\n >\n {pool.label}\n </Text>\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <Text.numeral\n dp={2}\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast\"\n >\n {pool.total_prize}\n </Text.numeral>\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast\"\n >\n {pool.currency}\n </Text>\n </div>\n </div>\n );\n })}\n </div>\n );\n }, [campaign]);\n return (\n <div className=\"oui-overflow-hidden oui-rounded-2xl oui-border oui-border-solid oui-border-base-contrast/[0.08]\">\n <div\n className={cn([\n \"oui-flex oui-items-center oui-gap-4 oui-px-4 oui-py-3 oui-backdrop-blur-[10px]\",\n isCampaignStarted ? \"\" : \"oui-hidden\",\n ])}\n >\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast-54\"\n >\n {campaign?.user_account_label ||\n t(\"tradingLeaderboard.participants\")}\n </Text>\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast-80\"\n >\n {statistics?.total_participants}\n </Text>\n </div>\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast-54\"\n >\n {t(\"tradingLeaderboard.tradingVolume\")}\n </Text>\n <Text.numeral\n dp={2}\n currency=\"$\"\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast-80\"\n >\n {tradingVolume}\n </Text.numeral>\n </div>\n </div>\n <div\n className={cn([\n \"oui-rounded-2xl oui-border oui-border-solid oui-border-base-contrast/[0.08] oui-bg-primary/[0.08] oui-p-4 oui-backdrop-blur-[10px]\",\n \"oui-flex oui-flex-col oui-gap-4\",\n isCampaignStarted ? \"\" : \"oui-border-transparent\",\n ])}\n >\n <div className=\"oui-flex oui-items-center oui-gap-6\">\n <div className=\"oui-flex oui-flex-col\">\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <Text\n size={isMobile ? \"2xs\" : \"xs\"}\n weight=\"semibold\"\n className=\"oui-text-base-contrast-54\"\n >\n {/* {t(\"tradingLeaderboard.prizePool\")} */}\n {\"Total prize pool\"}\n </Text>\n <Tooltip\n // @ts-ignore\n content={tooltipContent}\n {...tooltipProps}\n className=\"oui-max-w-[260px] oui-bg-base-5 oui-px-2 oui-py-1\"\n >\n <div\n className=\"oui-flex oui-size-4 oui-items-center oui-justify-center\"\n onClick={() => tooltipProps.onOpenChange(true)}\n >\n <InfoCircleIcon className=\"oui-cursor-pointer\" />\n </div>\n </Tooltip>\n </div>\n <div>\n <Text.gradient\n weight=\"bold\"\n color=\"brand\"\n className={cn([\n \"oui-trading-leaderboard-title\",\n isMobile\n ? \"oui-text-[20px] oui-leading-[24px]\"\n : \"oui-text-[24px] oui-leading-[28px]\",\n ])}\n >\n {totalPrizePool\n ? formatPrizeAmount(\n totalPrizePool.amount,\n totalPrizePool.currency,\n )\n : \"0 USDC\"}\n </Text.gradient>\n </div>\n </div>\n {(ticketPrizePool || highlightPool) && (\n <div className=\"oui-flex oui-flex-col\">\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <Text\n size={isMobile ? \"2xs\" : \"xs\"}\n weight=\"semibold\"\n className=\"oui-text-base-contrast-54\"\n >\n {/* {t(\"tradingLeaderboard.ticketPrizePool\")} */}\n {highlightPool?.label || \"Raffle prize\"}\n </Text>\n </div>\n <div>\n <Text.gradient\n weight=\"bold\"\n color=\"brand\"\n className={cn([\n \"oui-trading-leaderboard-title\",\n isMobile\n ? \"oui-text-[20px] oui-leading-[24px]\"\n : \"oui-text-[24px] oui-leading-[28px]\",\n ])}\n >\n {formatPrizeAmount(\n ticketPrizePool?.amount || highlightPool?.total_prize || 0,\n ticketPrizePool?.currency ||\n highlightPool?.currency ||\n \"USDC\",\n )}\n </Text.gradient>\n </div>\n </div>\n )}\n </div>\n {isMobile && campaign?.rule_url && (\n <div\n className=\"-oui-mb-1 -oui-mt-2 oui-flex oui-items-center oui-gap-0.5 oui-text-2xs oui-leading-[15px] oui-text-base-contrast-36\"\n onClick={onLearnMore}\n >\n {t(\"tradingLeaderboard.viewRules\")}\n <ChevronRightIcon size={16} className=\"oui-text-base-contrast-36\" />\n </div>\n )}\n <div\n className={cn(\n \"oui-flex oui-gap-4\",\n campaign?.rule_url || canTrade ? \"\" : \"oui-hidden\",\n )}\n >\n {!isMobile && campaign?.rule_url && (\n <Button\n size=\"md\"\n variant=\"outlined\"\n className=\"oui-flex-1 \n oui-border-[rgb(var(--oui-gradient-brand-start))] \n oui-text-[rgb(var(--oui-gradient-brand-start))] \n hover:oui-bg-[rgb(var(--oui-gradient-brand-start))]/[0.08]\n active:oui-bg-[rgb(var(--oui-gradient-brand-start))]/[0.08]\n \"\n onClick={onLearnMore}\n fullWidth\n >\n {t(\"tradingLeaderboard.viewRules\")}\n </Button>\n )}\n {(shouldShowJoinButton || showTradeButton) && (\n <div className=\"oui-w-full\">\n <AuthGuard\n buttonProps={{\n fullWidth: true,\n size: isMobile ? \"sm\" : \"md\",\n className: \"oui-px-5\",\n }}\n >\n {shouldShowJoinButton && (\n <Button\n size={isMobile ? \"sm\" : \"md\"}\n variant=\"gradient\"\n color=\"primary\"\n className=\"oui-flex-1\"\n loading={isJoining}\n disabled={isJoining}\n onClick={async () => {\n try {\n await joinCampaign?.({\n campaign_id: Number(campaign.campaign_id),\n });\n } catch (error) {\n console.error(\"Failed to join campaign:\", error);\n }\n }}\n fullWidth\n >\n {t(\"tradingLeaderboard.joinNow\")}\n </Button>\n )}\n {showTradeButton && (\n <Button\n size={isMobile ? \"sm\" : \"md\"}\n variant=\"gradient\"\n color=\"primary\"\n className=\"oui-flex-1\"\n onClick={onTradeNow}\n fullWidth\n >\n {campaign?.trading_config?.format ||\n t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n )}\n </AuthGuard>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import { format } from \"date-fns\";\nimport { i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { TimelinePoint } from \"./components/axis\";\nimport { CampaignConfig, CampaignTagEnum, CampaignStatistics } from \"./type\";\n\n// Default timezone display for campaigns\nconst DEFAULT_TIMEZONE_DISPLAY = \"UTC\";\n\n/**\n * Get user's current timezone display name\n * @returns Display name for the user's timezone (e.g., 'UTC', 'EST', 'PST')\n */\nexport const getUserTimezoneDisplay = (): string => {\n try {\n const date = new Date();\n const timeString = date.toLocaleTimeString(\"en-US\", {\n timeZoneName: \"short\",\n });\n const shortName = timeString.split(\" \").pop();\n return shortName || DEFAULT_TIMEZONE_DISPLAY;\n } catch (error) {\n console.warn(\"Failed to detect user timezone, using default:\", error);\n return DEFAULT_TIMEZONE_DISPLAY;\n }\n};\n\n/**\n * Get the appropriate tag for a campaign based on its configuration and current conditions\n * @param campaign Campaign configuration object\n * @param userReferralCode User's referral code (optional)\n * @returns CampaignTagEnum representing the current status of the campaign\n */\nexport const getCampaignTag = (\n campaign: CampaignConfig,\n userReferralCode?: string,\n): CampaignTagEnum => {\n const currentTime = new Date();\n const startTime = new Date(campaign.start_time);\n const endTime = new Date(campaign.end_time);\n\n // For non-exclusive campaigns, check time-based status\n if (currentTime < startTime) {\n return CampaignTagEnum.COMING;\n } else if (currentTime > endTime) {\n return CampaignTagEnum.ENDED;\n } else {\n if (campaign.referral_codes && campaign.referral_codes.length > 0) {\n if (\n !userReferralCode ||\n !campaign.referral_codes.includes(userReferralCode)\n ) {\n return CampaignTagEnum.EXCLUSIVE;\n }\n }\n return CampaignTagEnum.ONGOING;\n }\n};\n\n/**\n * Check if a campaign is visible to the current user\n * @param campaign Campaign configuration object\n * @param userReferralCode User's referral code (optional)\n * @returns boolean indicating if the campaign should be displayed\n */\nexport const isCampaignVisible = (\n campaign: CampaignConfig,\n userReferralCode?: string,\n): boolean => {\n // If campaign has referral code restrictions\n if (campaign.referral_codes && campaign.referral_codes.length > 0) {\n // Only show if user has a valid referral code\n return (\n !!userReferralCode && campaign.referral_codes.includes(userReferralCode)\n );\n }\n\n // For non-exclusive campaigns, always visible\n return true;\n};\n\n/**\n * Format campaign date range to display format like \"Feb 28, 2025 - March 2, 2025 PST\"\n * @param startTime Start time string or timestamp (should be UTC)\n * @param endTime End time string or timestamp (should be UTC)\n * @param showTimezone Whether to show timezone suffix (defaults to true)\n * @returns Formatted date range string with user's timezone\n */\nexport const formatCampaignDateRange = (\n startTime: string | number | Date,\n endTime: string | number | Date,\n showTimezone: boolean = true,\n): string => {\n try {\n // Convert to Date objects - JavaScript automatically handles UTC conversion to local time\n const startDate = new Date(startTime);\n const endDate = new Date(endTime);\n\n // Check if dates are valid\n if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) {\n console.warn(\"Invalid date value provided to formatCampaignDateRange:\", {\n startTime,\n endTime,\n });\n return \"Invalid date range\";\n }\n\n // Format dates using date-fns (will display in user's local timezone)\n // MMM d, yyyy format gives us \"Feb 28, 2025\" style\n const startFormatted = format(startDate, \"MMM d, yyyy\");\n const endFormatted = format(endDate, \"MMM d, yyyy\");\n\n const dateRange = `${startFormatted} - ${endFormatted}`;\n\n if (!showTimezone) {\n return dateRange;\n }\n\n // Add user's timezone suffix\n const timezoneDisplay = getUserTimezoneDisplay();\n return `${dateRange} ${timezoneDisplay}`;\n } catch (error) {\n console.error(\"Error formatting campaign date range:\", error, {\n startTime,\n endTime,\n });\n return \"Date formatting error\";\n }\n};\n\n/**\n * Get total participants count from campaign statistics\n * @param statistics Campaign statistics data from API\n * @returns Formatted participants count\n */\nexport const getParticipantsCount = (\n statistics?: CampaignStatistics,\n): number => {\n return statistics?.total_participants || 0;\n};\n\n/**\n * Get total trading volume from campaign statistics\n * @param statistics Campaign statistics data from API\n * @returns Total trading volume amount\n */\nexport const getTradingVolume = (statistics?: CampaignStatistics): number => {\n return statistics?.total_volume || 0;\n};\n\n/**\n * Calculate total prize pool amount from campaign configuration\n * @param campaign Campaign configuration object\n * @returns Object with total amount and currency, or null if no prize pools\n */\nexport const getTotalPrizePool = (\n campaign?: CampaignConfig,\n tieredIndex?: number,\n): { amount: number; currency: string } | null => {\n if (campaign?.tiered_prize_pools && campaign.tiered_prize_pools.length > 0) {\n return {\n amount: campaign.tiered_prize_pools[tieredIndex || 0]?.[0]?.total_prize,\n currency: campaign.tiered_prize_pools[tieredIndex || 0]?.[0]?.currency,\n };\n }\n\n if (!campaign?.prize_pools || campaign.prize_pools.length === 0) {\n return null;\n }\n\n // Group by currency and sum up the amounts\n const currencyTotals: Record<string, number> = {};\n\n campaign.prize_pools.forEach((pool) => {\n currencyTotals[pool.currency] =\n (currencyTotals[pool.currency] || 0) + pool.total_prize;\n });\n\n // For now, return the first currency found (typically USDC)\n // In the future, we might want to handle multiple currencies differently\n const currencies = Object.keys(currencyTotals);\n if (currencies.length === 0) return null;\n\n const mainCurrency = currencies[0];\n return {\n amount: currencyTotals[mainCurrency],\n currency: mainCurrency,\n };\n};\n\n/**\n * Get ticket prize pool amount from campaign configuration\n * @param campaign Campaign configuration object\n * @returns Object with amount and currency, or null if no ticket rules\n */\nexport const getTicketPrizePool = (\n campaign?: CampaignConfig,\n): { amount: number; currency: string } | null => {\n if (!campaign?.ticket_rules) {\n return null;\n }\n\n return {\n amount: campaign.ticket_rules.total_prize,\n currency: campaign.ticket_rules.currency,\n };\n};\n\n/**\n * Format prize amount for display\n * @param amount Prize amount\n * @param currency Currency symbol\n * @returns Formatted string like \"15,000 USDC\"\n */\nexport const formatPrizeAmount = (amount: number, currency: string): string => {\n return `${amount?.toLocaleString()} ${currency}`;\n};\n\n/**\n * Format trading volume for display with currency symbol\n * @param volume Trading volume amount\n * @returns Formatted string with $ prefix\n */\nexport const formatTradingVolume = (\n volume: number,\n decimalPlaces: number = 1,\n): string => {\n if (volume >= 1_000_000) {\n return `$${(volume / 1_000_000).toFixed(decimalPlaces)}M`;\n } else if (volume >= 1_000) {\n return `$${(volume / 1_000).toFixed(decimalPlaces)}K`;\n } else {\n return `$${volume.toFixed(decimalPlaces)}`;\n }\n};\n\n/**\n * Format participants count for display\n * @param count Participants count\n * @returns Formatted string with proper formatting\n */\nexport const formatParticipantsCount = (\n count: number,\n decimalPlaces: number = 1,\n): string => {\n if (count >= 1_000_000) {\n return `${(count / 1_000_000).toFixed(decimalPlaces)}M`;\n } else if (count >= 1_000) {\n return `${(count / 1_000).toFixed(decimalPlaces)}K`;\n } else {\n return count.toLocaleString();\n }\n};\n\n/**\n * Generate timeline data points for campaign visualization\n * @param campaign Campaign configuration object\n * @returns Array of TimelinePoint objects (max 4 points) in user's local timezone\n */\nexport const generateCampaignTimeline = (\n campaign: CampaignConfig,\n): TimelinePoint[] => {\n const currentTime = new Date();\n const registerTime = campaign.register_time\n ? new Date(campaign.register_time)\n : null;\n const startTime = new Date(campaign.start_time);\n const endTime = new Date(campaign.end_time);\n const rewardTime = campaign.reward_distribution_time\n ? new Date(campaign.reward_distribution_time)\n : null;\n\n const timeline: TimelinePoint[] = [];\n\n // Helper function to determine point type based on time\n const getTimelineType = (\n time: Date,\n isNow: boolean = false,\n ): \"past\" | \"active\" | \"future\" => {\n if (isNow) return \"active\";\n return currentTime >= time ? \"past\" : \"future\";\n };\n\n // Helper function to format time for display in user's local timezone\n const formatTimeDisplay = (time: Date): string => {\n try {\n // Format time using date-fns (displays in user's local timezone)\n const formatted = format(time, \"yyyy-MM-dd HH:mm\");\n const timezoneDisplay = getUserTimezoneDisplay();\n return `${formatted} ${timezoneDisplay}`;\n } catch (error) {\n console.error(\"Error formatting time:\", error);\n return time.toISOString();\n }\n };\n\n if (registerTime) {\n timeline.push({\n title: \"Battle Registration\",\n type: getTimelineType(registerTime),\n time: formatTimeDisplay(registerTime),\n });\n\n const isInRegisterTime =\n currentTime >= registerTime && currentTime <= startTime;\n if (isInRegisterTime) {\n timeline.push({\n title: i18n.t(\"chart.now\"),\n type: \"active\",\n time: formatTimeDisplay(currentTime),\n });\n }\n }\n\n // Battle starts point\n timeline.push({\n title: i18n.t(\"tradingLeaderboard.battleStarts\"),\n type: getTimelineType(startTime),\n time: formatTimeDisplay(startTime),\n });\n\n // Add \"Now\" point if battle is ongoing\n const isOngoing = currentTime >= startTime && currentTime <= endTime;\n if (isOngoing) {\n timeline.push({\n title: i18n.t(\"chart.now\"),\n type: \"active\",\n time: formatTimeDisplay(currentTime),\n });\n }\n\n // Battle ends point\n timeline.push({\n title: i18n.t(\"tradingLeaderboard.battleEnds\"),\n type: getTimelineType(endTime),\n time: formatTimeDisplay(endTime),\n });\n\n // Reward distribution point (if provided)\n if (rewardTime) {\n timeline.push({\n title: i18n.t(\"tradingLeaderboard.rewardDistribution\"),\n type: getTimelineType(rewardTime),\n time: formatTimeDisplay(rewardTime),\n });\n }\n\n // Ensure we don't exceed 4 points\n return timeline.slice(0, 4);\n};\n","import { ReactNode } from \"react\";\nimport { RankingColumnFields } from \"../ranking/shared/column\";\nimport { DescriptionConfig, DescriptionItem } from \"../rule/description\";\n\nexport enum CampaignTagEnum {\n ONGOING = \"ongoing\",\n COMING = \"coming\",\n ENDED = \"ended\",\n EXCLUSIVE = \"exclusive\",\n}\n\n// Campaign statistics data structure (from campaign statistics API)\nexport interface CampaignStatistics {\n total_participants?: number;\n total_volume?: number;\n}\n\n// Campaign prize pool configuration types\nexport interface PrizePoolTier {\n position?: number;\n position_range?: [number, number];\n amount: number;\n}\n\nexport interface PrizePool {\n pool_id: string;\n label: string;\n total_prize: number;\n currency: string;\n metric: \"volume\" | \"pnl\";\n tiers: PrizePoolTier[];\n volume_limit?: number;\n}\n\n// Ticket prize configuration types\nexport interface TicketTierRule {\n value: number;\n tickets: number;\n}\n\nexport interface TicketLinearRule {\n every: number;\n tickets: number;\n}\n\nexport interface TicketRules {\n total_prize: number;\n currency: string;\n metric: \"volume\" | \"pnl\";\n mode: \"tiered\" | \"linear\";\n tiers?: TicketTierRule[];\n linear?: TicketLinearRule;\n}\n\n// Campaign configuration\nexport interface CampaignConfig {\n campaign_id: number | string;\n title: string;\n subtitle?: string;\n description: string;\n content?: ReactNode;\n classNames?: {\n container?: string;\n topContainer?: string;\n title?: string;\n description?: string;\n descriptionContainer?: string;\n };\n register_time?: string;\n start_time: string;\n end_time: string;\n reward_distribution_time?: string;\n volume_scope?: string | string[];\n referral_codes?: string[] | string;\n prize_pools?: PrizePool[];\n tiered_prize_pools?: Array<PrizePool[]>;\n ticket_rules?: TicketRules;\n image?: string;\n rule_url?: string;\n rule_config?: {\n action?: \"scroll\" | \"click\";\n };\n trading_url?: string;\n trading_config?: {\n format?: string;\n };\n href?: string;\n hide_arena?: boolean;\n hide_rewards?: boolean;\n hide_estimated_rewards?: boolean;\n highlight_pool_id?: string;\n user_account_label?: string;\n rule?: {\n rule: DescriptionItem[];\n terms: DescriptionItem[];\n ruleConfig?: DescriptionConfig;\n };\n leaderboard_config?: LeaderboardConfig;\n // template config, will be remove when campaign is ended\n emphasisConfig?: {\n subtitle: string;\n walletConnect: {\n title: string;\n description: string;\n };\n hideConnectWallet: boolean;\n };\n}\n\nexport interface LeaderboardConfig {\n use_general_leaderboard?: boolean;\n exclude_leaderboard_columns?: RankingColumnFields[];\n // for 128 campaign\n week_one_addresses?: string[];\n}\n\n// User data for calculations\nexport interface UserData {\n rank?: number | string;\n pnl: number;\n total_participants?: number;\n volume: number;\n referral_code?: string;\n}\n\nexport type CampaignStatsDetailsResponse = {\n broker_id: string;\n user_count: number;\n volume: number;\n symbol: string;\n}[];\n\nexport type CampaignStatsResponse = {\n sign_up_count: number;\n user_count: number;\n volume: number;\n updated_time: number;\n};\n\nexport type UserCampaignsResponse = {\n id: string;\n register_time: number;\n}[];\n","import { FC } from \"react\";\nimport { Box, Button, cn, Flex, Text, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuard } from \"@kodiak-finance/orderly-ui-connector\";\nimport { CampaignConfig } from \"../type\";\nimport { PricePoolDesktopUI } from \"./pricePool.desktop.ui\";\nimport { usePricePoolScript } from \"./pricePool.script\";\n\ntype PricePoolWidgetProps = {\n campaign: CampaignConfig;\n statistics: any;\n tradingVolume: number;\n isMobile: boolean;\n isCampaignStarted: boolean;\n tooltipProps: any;\n showTradeButton: boolean;\n onLearnMore: () => void;\n onTradeNow: () => void;\n shouldShowJoinButton: boolean;\n joinCampaign: (data: { campaign_id: string | number }) => Promise<any>;\n isJoining: boolean;\n canTrade: boolean;\n totalPrizePool: { amount: number; currency: string } | null;\n};\n\nexport const PricePoolWidget: FC<PricePoolWidgetProps> = (props) => {\n const state = usePricePoolScript(props.campaign);\n\n const emphasisConfig = props.campaign?.emphasisConfig;\n const { isMobile } = useScreen();\n\n return (\n <div>\n <PricePoolDesktopUI {...state} {...props} />\n {emphasisConfig?.hideConnectWallet && (\n <Box mt={4}>\n <AuthGuard\n buttonProps={{\n size: isMobile ? \"lg\" : \"xl\",\n fullWidth: true,\n className: \"oui-rounded-full lg:oui-rounded-2xl\",\n }}\n labels={{\n connectWallet: emphasisConfig?.walletConnect?.title,\n }}\n descriptions={{\n // @ts-ignore\n connectWallet: (\n <Text.gradient\n color=\"brand\"\n className={cn([\n \"oui-text-center oui-font-semibold\",\n \"oui-text-[14px] oui-leading-[20px] lg:oui-text-[16px] lg:oui-leading-[24px]\",\n ])}\n >\n {emphasisConfig?.walletConnect?.description}\n </Text.gradient>\n ),\n }}\n />\n </Box>\n )}\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Text, ChevronRightIcon, Button } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuard } from \"@kodiak-finance/orderly-ui-connector\";\nimport { useCanTrade } from \"../../../hooks/useCanTrade\";\nimport { CampaignConfig, PrizePool } from \"../type\";\nimport { formatPrizeAmount, formatTradingVolume } from \"../utils\";\nimport { PricePoolScriptReturn } from \"./pricePool.script\";\nimport {\n calculateProgressWidth,\n getCurrentTierIndex,\n getProgressLeft,\n} from \"./utils\";\n\ntype PricePoolDesktopUIProps = PricePoolScriptReturn & {\n isMobile?: boolean;\n tradingVolume: number;\n isCampaignStarted: boolean;\n tooltipProps: any;\n onLearnMore: () => void;\n statistics: any;\n campaign: CampaignConfig;\n shouldShowJoinButton: boolean;\n joinCampaign: (data: { campaign_id: string | number }) => Promise<any>;\n isJoining: boolean;\n showTradeButton: boolean;\n onTradeNow: () => void;\n totalPrizePool: { amount: number; currency: string } | null;\n};\n\nexport const PricePoolDesktopUI: FC<PricePoolDesktopUIProps> = ({\n totalPrizePool,\n ticketPrizePool,\n highlightPool,\n isMobile,\n onLearnMore,\n statistics,\n tradingVolume,\n campaign,\n shouldShowJoinButton,\n joinCampaign,\n isJoining,\n showTradeButton,\n onTradeNow,\n status,\n}) => {\n const { t } = useTranslation();\n const canTrade = useCanTrade();\n\n const renderButton = () => {\n if (campaign?.emphasisConfig?.hideConnectWallet && !canTrade) {\n return null;\n }\n\n if (shouldShowJoinButton || showTradeButton) {\n return (\n <div className=\"oui-w-full\">\n <AuthGuard\n buttonProps={{\n size: \"md\",\n fullWidth: true,\n className: cn([\"oui-px-5\", !isMobile && \"oui-w-[590px]\"]),\n }}\n >\n {shouldShowJoinButton && (\n <Button\n size={\"md\"}\n variant=\"gradient\"\n color=\"primary\"\n className=\"oui-flex-1\"\n loading={isJoining}\n disabled={isJoining}\n onClick={async () => {\n try {\n await joinCampaign?.({\n campaign_id: Number(campaign.campaign_id),\n });\n } catch (error) {\n console.error(\"Failed to join campaign:\", error);\n }\n }}\n fullWidth\n >\n {t(\"tradingLeaderboard.joinNow\")}\n </Button>\n )}\n {showTradeButton && (\n <Button\n size={\"md\"}\n variant=\"gradient\"\n color=\"primary\"\n className=\"oui-flex-1\"\n onClick={onTradeNow}\n fullWidth\n >\n {campaign?.trading_config?.format ||\n t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n )}\n </AuthGuard>\n </div>\n );\n }\n return null;\n };\n\n return (\n <div\n className={cn([\n \"oui-rounded-[24px] oui-border oui-border-solid oui-border-base-contrast/[0.08] oui-bg-primary/[0.08] oui-p-6 oui-backdrop-blur-[10px]\",\n \"oui-flex oui-flex-col\",\n isMobile ? \"oui-w-[calc(100vw-24px)]\" : \"oui-w-[640px]\",\n ])}\n >\n <div className=\"oui-flex oui-items-center\">\n <div className=\"oui-flex oui-flex-1 oui-flex-col\">\n <div className=\"oui-text-xs oui-font-semibold oui-text-base-contrast-54\">\n Current total prize pool\n </div>\n <div>\n <Text.gradient\n weight=\"bold\"\n color=\"brand\"\n className={cn([\n \"oui-trading-leaderboard-title \",\n isMobile\n ? \"oui-text-[20px] oui-leading-[28px]\"\n : \"oui-text-[32px] oui-leading-[28px]\",\n ])}\n >\n {totalPrizePool\n ? formatPrizeAmount(\n totalPrizePool.amount,\n totalPrizePool.currency,\n )\n : \"USDC\"}\n </Text.gradient>\n </div>\n </div>\n {(ticketPrizePool || highlightPool) && (\n <div className=\"oui-flex oui-flex-1 oui-flex-col\">\n <div className=\"oui-text-xs oui-font-semibold oui-text-base-contrast-54\">\n {highlightPool?.label || \"Raffle prize\"}\n </div>\n <div>\n <Text.gradient\n weight=\"bold\"\n color=\"brand\"\n className={cn([\n \"oui-trading-leaderboard-title oui-leading-[28px]\",\n isMobile\n ? \"oui-text-[20px] oui-leading-[28px]\"\n : \"oui-text-[32px] oui-leading-[28px]\",\n ])}\n >\n {formatPrizeAmount(\n ticketPrizePool?.amount || highlightPool?.total_prize || 0,\n ticketPrizePool?.currency ||\n highlightPool?.currency ||\n \"USDC\",\n )}\n </Text.gradient>\n </div>\n </div>\n )}\n </div>\n\n <div className=\"oui-mb-3 oui-mt-4\">\n <TradingVolumeAndParticipation\n onLearnMore={onLearnMore}\n tradingVolume={tradingVolume}\n statistics={statistics}\n />\n </div>\n\n <PricePoolProgress\n isMobile={isMobile}\n tieredPrizePools={campaign?.tiered_prize_pools || []}\n tradingVolume={tradingVolume}\n />\n\n <div\n className={cn([\n \"oui-flex oui-gap-4\",\n isMobile ? \"oui-mt-3\" : canTrade && \"oui-mt-6\",\n ])}\n >\n {isMobile && campaign?.rule_url && (\n <div className=\"oui-w-full\">\n <Button\n fullWidth\n size=\"md\"\n variant=\"outlined\"\n className=\"oui-flex-1 \n oui-border-[rgb(var(--oui-gradient-brand-start))] \n oui-text-[rgb(var(--oui-gradient-brand-start))] \n hover:oui-bg-[rgb(var(--oui-gradient-brand-start))]/[0.08]\n active:oui-bg-[rgb(var(--oui-gradient-brand-start))]/[0.08]\n \"\n onClick={onLearnMore}\n >\n {t(\"tradingLeaderboard.viewRules\")}\n </Button>\n </div>\n )}\n {renderButton()}\n </div>\n </div>\n );\n};\n\nconst TradingVolumeAndParticipation = ({\n onLearnMore,\n tradingVolume,\n statistics,\n}: {\n onLearnMore: () => void;\n tradingVolume: number;\n statistics: any;\n}) => {\n const { t } = useTranslation();\n return (\n <div className=\"oui-flex oui-items-center oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n <div>{t(\"tradingLeaderboard.tradingVolume\")}</div>\n <div className=\"oui-ml-1 oui-mr-2\">\n <Text.gradient color=\"brand\">\n <Text.numeral dp={2} prefix=\"$\">\n {tradingVolume}\n </Text.numeral>\n </Text.gradient>\n </div>\n <div>{t(\"tradingLeaderboard.participants\")}</div>\n <div className=\"oui-ml-1 oui-text-base-contrast-54\">\n <Text.numeral dp={0}>{statistics?.total_participants}</Text.numeral>\n </div>\n <div\n className=\"oui-ml-auto oui-flex oui-cursor-pointer oui-items-center oui-gap-0.5 oui-text-2xs oui-leading-[15px] oui-text-base-contrast-36\"\n onClick={onLearnMore}\n >\n {t(\"tradingLeaderboard.viewRules\")}\n <ChevronRightIcon size={16} className=\"oui-text-base-contrast-36\" />\n </div>\n </div>\n );\n};\n\ntype PricePoolProgressProps = {\n isMobile?: boolean;\n tieredPrizePools: Array<Array<PrizePool>>;\n tradingVolume: number;\n};\n\nconst PricePoolProgress: FC<PricePoolProgressProps> = ({\n isMobile,\n tieredPrizePools,\n tradingVolume,\n}) => {\n // Calculate the progress bar width b ased on current trading volume\n const progressWidth = calculateProgressWidth(\n tradingVolume,\n tieredPrizePools,\n isMobile ? 6 : 2,\n );\n const currentTierIndex = getCurrentTierIndex(tradingVolume, tieredPrizePools);\n\n return (\n <div\n className={cn([\n \"oui-relative oui-flex oui-items-center oui-p-4 oui-pr-12 oui-font-medium\",\n \"oui-rounded-[10px] oui-border oui-border-solid oui-border-base-contrast/[0.12]\",\n \"oui-trading-leaderboard-title\",\n isMobile ? \"oui-h-[88px] oui-text-3xs\" : \"oui-h-[114px] oui-text-sm\",\n ])}\n >\n <div className=\"oui-absolute oui-flex oui-h-6 oui-w-[calc(100%-64px)] oui-items-center\">\n <div\n className={cn([\n \"oui-relative oui-flex oui-flex-1 oui-flex-col oui-rounded-[14px] oui-bg-base-5 oui-p-0.5\",\n isMobile ? \"oui-h-3\" : \"oui-h-4\",\n ])}\n >\n <div\n className=\"oui-h-full oui-rounded-[14px] oui-bg-[linear-gradient(270deg,rgb(var(--oui-gradient-brand-start))_0%,rgb(var(--oui-gradient-brand-end))_100%)]\"\n style={{ width: `${progressWidth}%` }}\n />\n <div\n style={{\n position: \"absolute\",\n left: `${progressWidth}%`,\n transform: `translate(-90%, ${isMobile ? \"-44\" : \"-25\"}%)`,\n scale: isMobile ? \"0.8\" : \"1\",\n zIndex: 50,\n }}\n >\n <Dot />\n </div>\n </div>\n </div>\n <div\n className={cn(\n \"oui-absolute oui-left-1 oui-flex oui-w-[calc(100%-64px)] oui-items-center\",\n \"oui-p-4 oui-pr-12\",\n )}\n >\n {tieredPrizePools?.map((prizePool: PrizePool[], index: number) => {\n const isReached = index <= currentTierIndex;\n const isCurrentTier = index === currentTierIndex;\n\n const left = getProgressLeft(tieredPrizePools.length, index);\n\n return (\n <div\n key={prizePool[0].pool_id}\n className=\"oui-flex oui-items-center\"\n >\n <div\n className={cn(\n \"oui-absolute oui-top-[-12px] lg:oui-top-[-24px]\",\n \"-oui-translate-x-1/2\",\n isReached\n ? \"oui-text-base-contrast\"\n : \"oui-text-base-contrast-36\",\n )}\n style={{ left }}\n >{`>${formatTradingVolume(prizePool[0].volume_limit || 0, 0)}`}</div>\n <div\n className={cn(\n \"oui-absolute\",\n \" oui-rounded-full\",\n isMobile ? \"oui-size-[4px]\" : \"oui-size-[6px]\",\n isReached ? \"oui-bg-white/[0.8]\" : \"oui-bg-[#00A9DE]\",\n )}\n style={{ left }}\n />\n <div\n className=\"oui-absolute oui-bottom-[-12px] -oui-translate-x-1/2 lg:oui-bottom-[-24px]\"\n style={{ left }}\n >\n {isCurrentTier ? (\n <Text.gradient color=\"brand\" weight=\"bold\">\n <Text.numeral dp={0} prefix={\"$\"}>\n {prizePool[0].total_prize}\n </Text.numeral>\n </Text.gradient>\n ) : (\n <Text.numeral\n dp={0}\n prefix={\"$\"}\n className={cn([\n isReached\n ? \"oui-text-base-contrast\"\n : \"oui-text-base-contrast-36\",\n ])}\n >\n {prizePool[0].total_prize}\n </Text.numeral>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nconst Dot = () => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 0.749939C18.2132 0.749939 23.25 5.78674 23.25 11.9999C23.25 18.2131 18.2132 23.2499 12 23.2499C5.7868 23.2499 0.75 18.2131 0.75 11.9999C0.75 5.78674 5.7868 0.749939 12 0.749939Z\"\n fill=\"#161B22\"\n />\n <path\n d=\"M12 0.749939C18.2132 0.749939 23.25 5.78674 23.25 11.9999C23.25 18.2131 18.2132 23.2499 12 23.2499C5.7868 23.2499 0.75 18.2131 0.75 11.9999C0.75 5.78674 5.7868 0.749939 12 0.749939Z\"\n stroke=\"url(#paint0_linear_31433_10290)\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M8.30771 17.9999V16.3999H6.66669V7.59994H8.30771V5.99994H9.53848V7.59994H11.1795V16.3999H9.53848V17.9999H8.30771ZM7.89746 15.1999H9.94874V8.79994H7.89746V15.1999ZM14.4616 17.9999V14.1537H12.8205V9.12314H14.4616V5.99994H15.6923V9.12314H17.3334V14.1537H15.6923V17.9999H14.4616ZM14.0513 12.9537H16.1026V10.3229H14.0513V12.9537Z\"\n fill=\"url(#paint1_linear_31433_10290)\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_31433_10290\"\n x1=\"24\"\n y1=\"11.9999\"\n x2=\"-1.39122e-07\"\n y2=\"11.9999\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#59B0FE\" />\n <stop offset=\"1\" stopColor=\"#26FEFE\" />\n </linearGradient>\n <linearGradient\n id=\"paint1_linear_31433_10290\"\n x1=\"17.3334\"\n y1=\"11.9999\"\n x2=\"6.66669\"\n y2=\"11.9999\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#59B0FE\" />\n <stop offset=\"1\" stopColor=\"#26FEFE\" />\n </linearGradient>\n </defs>\n </svg>\n );\n};\n","import { useMemo } from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { CampaignConfig } from \"../type\";\nimport { getTicketPrizePool } from \"../utils\";\n\nexport const usePricePoolScript = (campaign: CampaignConfig) => {\n const { state } = useAccount();\n const ticketPrizePool = useMemo(\n () => getTicketPrizePool(campaign),\n [campaign],\n );\n\n const highlightPool = useMemo(() => {\n if (!campaign?.highlight_pool_id) {\n return null;\n }\n return campaign?.prize_pools?.find(\n (pool) => pool.pool_id === campaign.highlight_pool_id,\n );\n }, [campaign]);\n\n return {\n ticketPrizePool,\n highlightPool,\n status: state.status,\n };\n};\n\nexport type PricePoolScriptReturn = ReturnType<typeof usePricePoolScript>;\n","import { useMemo, useCallback } from \"react\";\nimport { useQuery, useMutation, useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { useTradingLeaderboardContext } from \"../provider\";\nimport { getCurrentTierIndex } from \"./pricePool/utils\";\nimport { UserCampaignsResponse } from \"./type\";\nimport { getTotalPrizePool } from \"./utils\";\n\n/**\n * Hook for managing campaigns data and statistics\n * TODO: Replace mock data with real API calls when backend is ready\n */\nexport const useCampaignsScript = () => {\n const {\n campaigns = [],\n currentCampaignId,\n onCampaignChange,\n currentCampaign,\n userData,\n backgroundSrc,\n statistics,\n } = useTradingLeaderboardContext();\n\n const isCampaignEnded = useMemo(() => {\n return (\n currentCampaign?.end_time &&\n currentCampaign?.end_time < new Date().toISOString()\n );\n }, [currentCampaign]);\n\n const { state } = useAccount();\n\n const { data: userCampaigns, mutate: refreshUserCampaigns } =\n useQuery<UserCampaignsResponse>(\n currentCampaignId !== \"general\" && state.address\n ? `https://api.orderly.org/v1/public/campaigns?address=${state.address}`\n : null,\n { revalidateOnFocus: false },\n );\n\n const isParticipated = useMemo(() => {\n const target = userCampaigns?.find((item) => item.id == currentCampaignId);\n return !!target;\n }, [userCampaigns, currentCampaignId]);\n\n const shouldShowJoinButton = useMemo(() => {\n // return false;\n return !!state.address && !isCampaignEnded && !isParticipated;\n }, [state.address, isCampaignEnded, isParticipated]);\n\n const [doJoinCampaign, { isMutating: isJoining, error: joinError }] =\n useMutation(`/v1/client/campaign/sign_up`, \"POST\");\n\n const joinCampaign = useCallback(\n async (data: { campaign_id: string | number }) => {\n try {\n if (state.status < AccountStatusEnum.EnableTrading) {\n toast.error(\"Please enable trading to proceed.\");\n return;\n }\n const result = await doJoinCampaign(data);\n\n // hardcode for 128 campaign\n if (String(data.campaign_id) === \"128\") {\n Promise.all(\n [\"130\", \"131\", \"132\", \"133\", \"134\", \"136\"].map(\n async (campaignId) => {\n await doJoinCampaign({ campaign_id: campaignId });\n },\n ),\n );\n }\n\n if (result?.success !== false) {\n // Refresh user campaigns data to update participation status\n await refreshUserCampaigns();\n toast.success(result?.message || \"Campaign joined successfully\");\n return result;\n } else {\n toast.error(result?.message || \"Failed to join campaign\");\n }\n } catch (error) {\n console.error(\"Failed to join campaign:\", error);\n throw error;\n }\n },\n [doJoinCampaign, refreshUserCampaigns, state.status],\n );\n\n const onLearnMore = () => {\n if (currentCampaign?.rule_url) {\n if (currentCampaign.rule_config?.action === \"scroll\") {\n document\n .getElementById(currentCampaign.rule_url)\n ?.scrollIntoView({ behavior: \"smooth\" });\n } else {\n window.open(currentCampaign.rule_url, \"_blank\");\n }\n }\n };\n\n const onTradeNow = () => {\n if (currentCampaign?.trading_url) {\n window.open(currentCampaign.trading_url, \"_self\");\n }\n };\n\n const canTrade = useMemo(() => {\n if (!currentCampaign) return false;\n return (\n currentCampaign?.start_time < new Date().toISOString() &&\n currentCampaign?.end_time > new Date().toISOString() &&\n state.status >= AccountStatusEnum.EnableTrading\n );\n }, [currentCampaign, state.status]);\n\n const tieredIndex = useMemo(() => {\n if (!currentCampaign?.tiered_prize_pools) return 0;\n return getCurrentTierIndex(\n statistics?.total_volume || 0,\n currentCampaign?.tiered_prize_pools,\n );\n }, [statistics?.total_volume, currentCampaign?.tiered_prize_pools]);\n\n const totalPrizePool = useMemo(() => {\n return getTotalPrizePool(currentCampaign, tieredIndex ?? undefined);\n }, [currentCampaign, tieredIndex]);\n\n return {\n campaigns,\n currentCampaignId,\n currentCampaign,\n onCampaignChange,\n statistics,\n userData,\n onLearnMore,\n onTradeNow,\n backgroundSrc,\n joinCampaign,\n isJoining,\n isParticipated,\n shouldShowJoinButton,\n joinError,\n canTrade,\n totalPrizePool,\n status: state.status,\n };\n};\n\nexport type CampaignsScriptReturn = ReturnType<typeof useCampaignsScript>;\n","import { FC } from \"react\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport { CampaignConfig } from \"../type\";\nimport { generateCampaignTimeline } from \"../utils\";\nimport { CampaignsAxis, CampaignsAxisMobile } from \"./axis\";\nimport { CampaignsCountdown } from \"./countdown\";\n\nexport const CampaignsTimeDesktopUI: FC<{\n campaign: CampaignConfig;\n isMobile?: boolean;\n}> = ({ campaign, isMobile }) => {\n const timelineData = generateCampaignTimeline(campaign);\n\n return (\n <div\n className={cn([\n \"oui-max-w-[992px] oui-mx-auto oui-flex oui-flex-col oui-items-center\",\n isMobile ? \"oui-pt-4 oui-gap-10 oui-pb-10\" : \"oui-py-10 oui-gap-4\",\n ])}\n >\n <CampaignsCountdown campaign={campaign} isMobile={isMobile} />\n {isMobile ? (\n <CampaignsAxisMobile points={timelineData} />\n ) : (\n <CampaignsAxis points={timelineData} />\n )}\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\n\nexport interface TimelinePoint {\n title: string;\n type: \"past\" | \"active\" | \"future\";\n time: string;\n}\n\nexport interface CampaignsAxisProps {\n points: TimelinePoint[];\n}\n\nexport const CampaignsAxis: FC<CampaignsAxisProps> = ({ points }) => {\n if (!points || points.length === 0) {\n return null;\n }\n\n // Find the index of the active point\n const activeIndex = points.findIndex((point) => point.type === \"active\");\n\n // For single point, center it without any lines\n if (points.length === 1) {\n return (\n <div className=\"oui-flex oui-w-full oui-justify-center\">\n <div className=\"oui-flex oui-flex-col oui-items-center\">\n <AxisPoint type={points[0].type} />\n <div className=\"oui-mt-4 oui-flex oui-flex-col oui-items-center oui-text-center\">\n <div className=\"oui-trading-leaderboard-title oui-mb-1 oui-whitespace-nowrap oui-text-sm oui-font-medium oui-text-base-contrast-54\">\n {points[0].title}\n </div>\n <div className=\"oui-whitespace-nowrap oui-text-xs oui-text-base-contrast-36\">\n {points[0].time}\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // Helper function to determine line background class\n const getLineBackgroundClass = (segmentIndex: number): string => {\n // If there's an active point and this segment is to the left of it, use oui-bg-base-3\n if (activeIndex !== -1 && segmentIndex < activeIndex) {\n return \"oui-bg-base-3\";\n }\n // Otherwise use regular color\n return \"oui-bg-base-8\";\n };\n\n const widthPercentage = points?.length > 3 ? \"110%\" : \"120%\";\n\n return (\n <div className=\"oui-flex oui-w-full\" style={{ width: widthPercentage }}>\n {points.map((point, index) => {\n const isFirst = index === 0;\n const isLast = index === points.length - 1;\n\n return (\n <div\n key={index}\n className=\"oui-relative oui-flex oui-flex-1 oui-flex-col oui-items-center\"\n >\n {/* Point container with connecting lines */}\n <div className=\"oui-relative oui-flex oui-w-full oui-items-center\">\n {/* Left line - always occupy space, but invisible for first point */}\n <div\n className={cn([\n \"oui-h-[6px] oui-flex-1\",\n !isFirst && getLineBackgroundClass(index - 1),\n ])}\n />\n\n {/* Point */}\n <div className=\"oui-z-10 oui-shrink-0\">\n <AxisPoint type={point.type} />\n </div>\n\n {/* Right line - always occupy space, but invisible for last point */}\n <div\n className={cn([\n \"oui-h-[6px] oui-flex-1\",\n !isLast && getLineBackgroundClass(index),\n ])}\n />\n </div>\n\n {/* Label below point */}\n <div className=\"oui-mt-4 oui-flex oui-flex-col oui-items-center oui-text-center\">\n <div className=\"oui-trading-leaderboard-title oui-mb-1 oui-whitespace-nowrap oui-text-sm oui-font-medium oui-text-base-contrast-54\">\n {point.title}\n </div>\n <div className=\"oui-whitespace-nowrap oui-text-xs oui-text-base-contrast-36\">\n {point.type !== \"active\" && point.time}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n\nexport const CampaignsAxisMobile: FC<CampaignsAxisProps> = ({ points }) => {\n if (!points || points.length === 0) {\n return null;\n }\n\n // Find the index of the active point\n const activeIndex = points.findIndex((point) => point.type === \"active\");\n\n // Helper function to determine line background class\n const getLineBackgroundClass = (segmentIndex: number): string => {\n // If there's an active point and this segment is above it, use oui-bg-base-3\n if (activeIndex !== -1 && segmentIndex < activeIndex) {\n return \"oui-bg-base-3\";\n }\n // Otherwise use regular color\n return \"oui-bg-base-8\";\n };\n\n return (\n <div className=\"oui-flex oui-w-full oui-flex-col oui-items-center oui-gap-10\">\n {points.map((point, index) => {\n const isFirst = index === 0;\n const isLast = index === points.length - 1;\n\n return (\n <div key={index} className={cn([\"oui-relative\"])}>\n {/* Main content container */}\n <div className=\"oui-flex oui-h-10 oui-items-start oui-gap-4\">\n {/* Point with connecting line */}\n <div\n className={cn([\n \"oui-relative oui-flex oui-flex-col oui-items-center\",\n isFirst && \"oui-translate-y-[10px]\",\n ])}\n >\n <AxisPoint type={point.type} />\n\n {/* Vertical connecting line - only show if not the last point */}\n {!isLast && (\n <div\n className={cn([\n \"oui-h-[64px] oui-w-[6px]\",\n getLineBackgroundClass(index),\n ])}\n />\n )}\n </div>\n\n {/* Text content */}\n <div className=\"oui-flex oui-flex-col oui-justify-start\">\n <div className=\"oui-trading-leaderboard-title oui-mb-1 oui-text-sm oui-font-medium oui-text-base-contrast-54\">\n {point.title}\n </div>\n <div className=\"oui-min-w-[160px] oui-text-xs oui-text-base-contrast-36\">\n {point.type !== \"active\" && point.time}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n\nconst AxisPoint: FC<{ type: \"past\" | \"active\" | \"future\" }> = ({ type }) => {\n return (\n <div\n className={cn([\n \"oui-size-5 oui-shrink-0 oui-rounded-full\",\n type === \"past\" && \"oui-bg-base-contrast-80\",\n type === \"active\" &&\n \"oui-bg-gradient-to-r oui-from-[rgba(var(--oui-gradient-brand-start))] oui-to-[rgba(var(--oui-gradient-brand-end))]\",\n type === \"future\" &&\n \"oui-border-[2.5px] oui-border-solid oui-border-base-contrast-80 oui-bg-[#07080A]\",\n ])}\n />\n );\n};\n","import { FC, useState, useEffect } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport { CampaignConfig } from \"../type\";\n\nconst Circle = () => (\n <div className=\"oui-w-1 oui-h-1 oui-rounded-full oui-bg-white/[0.16]\" />\n);\n\ninterface TimeLeft {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\ninterface TimeUnitProps {\n value: number;\n label: string;\n isMobile?: boolean;\n}\n\nconst TimeUnit: FC<TimeUnitProps> = ({ value, label, isMobile }) => (\n <div\n className={cn([\n \"oui-flex oui-flex-col oui-items-center oui-gap-1\",\n isMobile ? \"oui-w-[45px]\" : \"oui-w-[63px]\",\n ])}\n >\n <div\n className={cn([\n \"oui-trading-leaderboard-title oui-text-base-contrast oui-font-medium\",\n isMobile\n ? \"oui-text-[20px] oui-leading-[24px] oui-h-[24px]\"\n : \"oui-text-[36px] oui-leading-[44px] oui-h-[44px]\",\n ])}\n >\n {value.toString().padStart(2, \"0\")}\n </div>\n <div\n className={cn([\n \"oui-trading-leaderboard-title oui-text-base-contrast-80 oui-font-medium\",\n isMobile\n ? \"oui-text-[10px] oui-leading-[14px] oui-h-[14px]\"\n : \"oui-text-sm oui-leading-[20px] oui-h-[20px]\",\n ])}\n >\n {label}\n </div>\n </div>\n);\n\nexport const CampaignsCountdown: FC<{\n campaign: CampaignConfig;\n isMobile?: boolean;\n}> = ({ campaign, isMobile }) => {\n const { t } = useTranslation();\n const [timeLeft, setTimeLeft] = useState<TimeLeft>({\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0,\n });\n const [isStarted, setIsStarted] = useState(false);\n\n useEffect(() => {\n const calculateTimeLeft = () => {\n const currentTime = new Date().getTime();\n const startTime = new Date(campaign.start_time).getTime();\n const endTime = new Date(campaign.end_time).getTime();\n\n // Determine if campaign has started\n const hasStarted = currentTime >= startTime;\n setIsStarted(hasStarted);\n\n // Calculate time difference based on campaign status\n const targetTime = hasStarted ? endTime : startTime;\n const difference = targetTime - currentTime;\n\n if (difference > 0) {\n const days = Math.floor(difference / (1000 * 60 * 60 * 24));\n const hours = Math.floor(\n (difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60),\n );\n const minutes = Math.floor(\n (difference % (1000 * 60 * 60)) / (1000 * 60),\n );\n const seconds = Math.floor((difference % (1000 * 60)) / 1000);\n\n setTimeLeft({ days, hours, minutes, seconds });\n } else {\n setTimeLeft({ days: 0, hours: 0, minutes: 0, seconds: 0 });\n }\n };\n\n // Calculate immediately\n calculateTimeLeft();\n\n // Set up interval to update every second\n const timer = setInterval(calculateTimeLeft, 1000);\n\n // Cleanup interval on component unmount\n return () => clearInterval(timer);\n }, [campaign.start_time, campaign.end_time]);\n\n // Check if campaign has ended\n const currentTime = new Date();\n const endTime = new Date(campaign.end_time);\n\n if (currentTime > endTime) {\n return (\n <div className=\"oui-w-full oui-flex oui-items-center oui-justify-center oui-gap-4\">\n <div\n className=\"oui-max-w-[382px] oui-w-full oui-h-[1px] oui-bg-gradient-to-r oui-from-[rgba(var(--oui-gradient-brand-end)/0)]\n oui-to-[rgba(var(--oui-gradient-brand-start))]\"\n />\n <div\n className={cn([\n \"oui-trading-leaderboard-title oui-flex oui-items-center oui-justify-center oui-font-medium oui-text-base-contrast-54\",\n isMobile\n ? \"oui-text-[14px] oui-leading-[20px] oui-h-[20px] oui-whitespace-nowrap\"\n : \"oui-p-5 oui-text-[18px] oui-leading-[26px] oui-h-[26px]\",\n ])}\n >\n {t(\"tradingLeaderboard.batteleHasEnded\")}\n </div>\n <div\n className=\"oui-max-w-[382px] oui-w-full oui-h-[1px] oui-bg-gradient-to-r oui-from-[rgba(var(--oui-gradient-brand-start))]\n oui-to-[rgba(var(--oui-gradient-brand-end)/0)]\"\n />\n </div>\n );\n }\n\n const titleText = isStarted\n ? t(\"tradingLeaderboard.battleEndsIn\")\n : t(\"tradingLeaderboard.battleStartsIn\");\n\n // Time units configuration\n const timeUnits = [\n { value: timeLeft.days, label: \"Days\" },\n { value: timeLeft.hours, label: \"Hours\" },\n { value: timeLeft.minutes, label: \"Minutes\" },\n { value: timeLeft.seconds, label: \"Seconds\" },\n ];\n\n return (\n <div className=\"oui-w-full oui-flex oui-items-center oui-justify-center oui-gap-4\">\n <div\n className=\"oui-max-w-[298px] oui-w-full oui-h-[1px] oui-bg-gradient-to-r oui-from-[rgba(var(--oui-gradient-brand-end)/0)]\n oui-to-[rgba(var(--oui-gradient-brand-start))]\"\n />\n <div\n className={cn([\n \"oui-flex oui-flex-col oui-items-center\",\n isMobile ? \"oui-p-0 oui-gap-1\" : \"oui-p-5 oui-gap-2\",\n ])}\n >\n <div\n className={cn([\n \"oui-trading-leaderboard-title oui-font-medium oui-text-base-contrast-54\",\n isMobile\n ? \"oui-text-[14px] oui-leading-[20px] oui-h-[20px]\"\n : \"oui-text-[18px] oui-leading-[26px] oui-h-[26px]\",\n ])}\n >\n {titleText}\n </div>\n <div\n className={cn([\n \"oui-flex oui-items-center\",\n isMobile ? \"oui-gap-2\" : \"oui-gap-[10px]\",\n ])}\n >\n {timeUnits.map((unit, index) => (\n <div\n key={unit.label}\n className={cn([\n \"oui-flex oui-items-center\",\n isMobile ? \"oui-gap-2\" : \"oui-gap-[10px]\",\n ])}\n >\n <TimeUnit\n value={unit.value}\n label={unit.label}\n isMobile={isMobile}\n />\n {index < timeUnits.length - 1 && <Circle />}\n </div>\n ))}\n </div>\n </div>\n <div\n className=\"oui-max-w-[298px] oui-w-full oui-h-[1px] oui-bg-gradient-to-r oui-from-[rgba(var(--oui-gradient-brand-start))]\n oui-to-[rgba(var(--oui-gradient-brand-end)/0)]\"\n />\n </div>\n );\n};\n","import { FC, useCallback, useState, useEffect } from \"react\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n useEmblaCarousel,\n} from \"@kodiak-finance/orderly-ui\";\nimport { DefaultCampaign } from \"../DefaultCampaign\";\nimport { CampaignItemUI } from \"../campaign.item.ui\";\nimport { CampaignConfig } from \"../type\";\nimport { getCampaignTag } from \"../utils\";\n\nexport const CampaignsHeaderUI: FC<{\n campaigns: CampaignConfig[];\n currentCampaignId: string;\n onCampaignChange: (campaignId: string) => void;\n backgroundSrc?: string;\n}> = ({ campaigns, currentCampaignId, onCampaignChange, backgroundSrc }) => {\n const [isLargeScreen, setIsLargeScreen] = useState(false);\n const [canScrollPrev, setCanScrollPrev] = useState(false);\n const [canScrollNext, setCanScrollNext] = useState(false);\n\n useEffect(() => {\n const checkScreenSize = () => {\n setIsLargeScreen(window.innerWidth >= 1024);\n };\n\n // Check initial size\n checkScreenSize();\n\n // Add event listener\n window.addEventListener(\"resize\", checkScreenSize);\n\n // Cleanup\n return () => window.removeEventListener(\"resize\", checkScreenSize);\n }, []);\n\n const [emblaRef, emblaApi] = useEmblaCarousel({\n loop: false,\n align: \"start\",\n containScroll: \"keepSnaps\",\n slidesToScroll: 1,\n skipSnaps: false,\n dragFree: false,\n });\n\n // Update scroll availability\n const updateScrollAvailability = useCallback(() => {\n if (!emblaApi || !campaigns?.length) {\n return;\n }\n\n setCanScrollPrev(emblaApi.canScrollPrev());\n\n // Check if the last slide is in view\n const slidesInView = emblaApi.slidesInView();\n const lastSlideIndex = campaigns.length - 1;\n const isLastSlideInView = slidesInView.includes(lastSlideIndex);\n\n setCanScrollNext(emblaApi.canScrollNext() && !isLastSlideInView);\n }, [emblaApi, campaigns]);\n\n useEffect(() => {\n if (!emblaApi) {\n return;\n }\n\n // Initial check\n updateScrollAvailability();\n\n // Listen for scroll events\n emblaApi.on(\"select\", updateScrollAvailability);\n emblaApi.on(\"reInit\", updateScrollAvailability);\n emblaApi.on(\"scroll\", updateScrollAvailability);\n\n return () => {\n emblaApi.off(\"select\", updateScrollAvailability);\n emblaApi.off(\"reInit\", updateScrollAvailability);\n emblaApi.off(\"scroll\", updateScrollAvailability);\n };\n }, [emblaApi, updateScrollAvailability]);\n\n const scrollPrev = useCallback(() => {\n if (emblaApi) emblaApi.scrollPrev();\n }, [emblaApi]);\n\n const scrollNext = useCallback(() => {\n if (emblaApi) emblaApi.scrollNext();\n }, [emblaApi]);\n\n // Calculate width considering gap (0.5rem = 8px)\n // For 2 items: (100% - 1 * gap) / 2\n // For 3 items: (100% - 2 * gap) / 3\n const slideStyle = isLargeScreen\n ? { flexBasis: \"calc((100% - 2rem) / 4)\", width: \"calc((100% - 2rem) / 4)\" }\n : {\n flexBasis: \"calc((100% - 1rem) / 3)\",\n width: \"calc((100% - 1rem) / 3)\",\n };\n\n // Check if scroll buttons should be hidden based on screen size and campaign count\n const shouldHideScrollButtons = isLargeScreen\n ? campaigns.length <= 4\n : campaigns.length <= 3;\n\n return (\n <div className=\"oui-flex oui-w-full oui-items-center oui-gap-2 oui-px-6\">\n <div className=\"oui-shrink-0\">\n <DefaultCampaign\n currentCampaignId={currentCampaignId}\n onCampaignChange={onCampaignChange}\n className=\"oui-min-w-[322px]\"\n />\n </div>\n\n <div className=\"oui-h-[78px] oui-w-px oui-bg-white/[0.16]\" />\n\n <button\n onClick={scrollPrev}\n disabled={!canScrollPrev}\n className={`oui-group oui-flex oui-h-[78px] oui-w-6 oui-shrink-0 oui-items-center oui-justify-center oui-rounded-lg oui-transition-colors hover:oui-bg-base-7 disabled:oui-cursor-not-allowed disabled:oui-opacity-30 disabled:hover:oui-bg-transparent ${shouldHideScrollButtons ? \"oui-hidden\" : \"\"}`}\n aria-label=\"Previous campaigns\"\n >\n <ChevronLeftIcon\n opacity={1}\n className=\"oui-text-base-contrast-54 group-hover:oui-text-base-contrast\"\n />\n </button>\n\n <div className=\"oui-min-w-0 oui-flex-1 oui-overflow-hidden\">\n <div ref={emblaRef}>\n <div className=\"oui-flex oui-gap-2\">\n {campaigns?.map((campaign) => (\n <div\n key={campaign.campaign_id}\n className=\"oui-shrink-0\"\n style={slideStyle}\n >\n <CampaignItemUI\n backgroundSrc={backgroundSrc}\n campaign={campaign}\n tag={getCampaignTag(campaign)}\n active={currentCampaignId == campaign.campaign_id}\n onCampaignChange={onCampaignChange}\n classNames={{\n tag: {\n container: \"oui-h-[23px] oui-py-1 oui-px-2\",\n },\n }}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n <button\n onClick={scrollNext}\n disabled={!canScrollNext}\n className={`oui-group oui-flex oui-h-[78px] oui-w-6 oui-shrink-0 oui-items-center oui-justify-center oui-rounded-lg oui-transition-colors hover:oui-bg-base-7 disabled:oui-cursor-not-allowed disabled:oui-opacity-30 disabled:hover:oui-bg-transparent ${shouldHideScrollButtons ? \"oui-hidden\" : \"\"}`}\n aria-label=\"Next campaigns\"\n >\n <ChevronRightIcon\n opacity={1}\n className=\"oui-text-base-contrast-54 group-hover:oui-text-base-contrast\"\n />\n </button>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\n\nexport const DefaultCampaign: FC<{\n currentCampaignId: string;\n onCampaignChange: (campaignId: string) => void;\n style?: React.CSSProperties;\n className?: string;\n}> = ({ currentCampaignId, onCampaignChange, style, className }) => {\n const { t } = useTranslation();\n return (\n <div\n className={cn([\n \"oui-trading-leaderboard-title\",\n \"oui-flex oui-items-center oui-justify-center oui-cursor-pointer\",\n \"oui-bg-base-9 oui-h-[78px] oui-rounded-lg oui-border oui-border-solid\",\n currentCampaignId === \"general\"\n ? \"oui-border-[rgba(var(--oui-gradient-brand-start))]\"\n : \"oui-border-transparent\",\n className,\n ])}\n style={style}\n onClick={() => onCampaignChange(\"general\")}\n >\n {t(\"tradingLeaderboard.generalLeaderboard\")}\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { cn, Text } from \"@kodiak-finance/orderly-ui\";\nimport { CampaignConfig, CampaignTagEnum } from \"./type\";\nimport { formatParticipantsCount, getTotalPrizePool } from \"./utils\";\n\ninterface CampaignItemUIProps {\n className?: string;\n active?: boolean;\n tag: CampaignTagEnum;\n onCampaignChange: (campaignId: string) => void;\n campaign: CampaignConfig;\n backgroundSrc?: string;\n classNames?: {\n container?: string;\n content?: string;\n tag?: {\n container?: string;\n text?: string;\n };\n title?: string;\n };\n}\n\nexport const CampaignItemUI: FC<CampaignItemUIProps> = ({\n active,\n tag,\n onCampaignChange,\n campaign,\n backgroundSrc,\n classNames,\n}) => {\n const totalPrizePool = getTotalPrizePool(campaign);\n const formattedPrice = formatParticipantsCount(\n totalPrizePool?.amount || 0,\n 0,\n );\n\n return (\n <div\n className={cn([\n \"oui-w-full\",\n \"oui-relative oui-h-[78px] oui-cursor-pointer oui-overflow-hidden oui-rounded-lg oui-bg-white/[0.04]\",\n \"oui-group oui-border oui-border-solid oui-backdrop-blur-[200px]\",\n active\n ? \"oui-border-[rgba(var(--oui-gradient-brand-start))]\"\n : \"oui-border-transparent\",\n \"hover:oui-border-base-contrast\",\n classNames?.container,\n ])}\n onClick={() => onCampaignChange(campaign.campaign_id.toString())}\n >\n <CampaignTag tag={tag} active={active} classNames={classNames?.tag} />\n <PriceTag price={formattedPrice} active={active} />\n <div\n className={cn([\n \"oui-size-full\",\n \"oui-absolute oui-left-0 oui-top-0\",\n \"oui-bg-cover oui-bg-center oui-bg-no-repeat oui-bg-blend-luminosity\",\n active ? \"oui-bg-transparent\" : \"oui-bg-[lightgray] oui-opacity-40\",\n \"group-hover:oui-bg-transparent group-hover:oui-opacity-100\",\n ])}\n style={{\n backgroundImage: `url(${campaign?.image || backgroundSrc})`,\n }}\n />\n <div\n className={cn([\n \"oui-flex oui-size-full oui-flex-col oui-items-center oui-justify-center oui-gap-1\",\n \"oui-absolute oui-left-0 oui-top-0 oui-z-10\",\n classNames?.content,\n ])}\n >\n <Text\n weight=\"semibold\"\n className={cn([\n active ? \"oui-text-base-contrast\" : \"oui-text-base-contrast-54\",\n \"group-hover:oui-text-base-contrast\",\n \"oui-trading-leaderboard-title\",\n \"oui-w-3/5 oui-text-center oui-text-sm\",\n classNames?.title,\n ])}\n >\n {campaign.title}\n </Text>\n {campaign.referral_codes && (\n <Text\n className={cn([\n \"oui-text-base-contrast-54\",\n \"oui-text-center oui-text-[10px]\",\n ])}\n >\n {Array.isArray(campaign.referral_codes)\n ? campaign.referral_codes.join(\",\")\n : campaign.referral_codes}\n </Text>\n )}\n </div>\n </div>\n );\n};\n\nconst CampaignTag: FC<{\n tag: CampaignTagEnum;\n active?: boolean;\n classNames?: {\n container?: string;\n text?: string;\n };\n}> = ({ tag, active, classNames }) => {\n const tagText = tag.slice(0, 1).toUpperCase() + tag.slice(1);\n return (\n <div\n className={cn([\n \"oui-w-fit oui-rounded-br-lg\",\n \"oui-absolute oui-left-0 oui-top-0 oui-z-10 oui-flex oui-items-center\",\n active && tag !== CampaignTagEnum.COMING\n ? \"oui-bg-[rgba(var(--oui-gradient-brand-start))]\"\n : \"oui-bg-base-4\",\n active && tag !== CampaignTagEnum.ENDED && \"group-hover:oui-bg-base-4\",\n tag === CampaignTagEnum.ENDED &&\n \"oui-bg-base-6 group-hover:oui-bg-base-6\",\n classNames?.container,\n ])}\n >\n {tag === CampaignTagEnum.ENDED ? (\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className={cn([\"oui-text-base-contrast-54\", classNames?.text])}\n >\n {tagText}\n </Text>\n ) : (\n <Text.gradient\n size=\"2xs\"\n weight=\"semibold\"\n color=\"brand\"\n className={cn([\n active &&\n tag !== CampaignTagEnum.COMING &&\n \"oui-text-black/[0.88] group-hover:oui-text-transparent\",\n classNames?.text,\n ])}\n >\n {tagText}\n </Text.gradient>\n )}\n </div>\n );\n};\n\nconst PriceTag = ({ price, active }: { price: string; active?: boolean }) => {\n return (\n <div\n className={cn([\n \"oui-flex oui-h-[18px] oui-items-center oui-gap-0.5 oui-rounded-lg oui-bg-[rgba(255,169,64,0.70)] oui-px-1 oui-py-0.5 oui-backdrop-blur-[2px]\",\n \"oui-absolute oui-right-1 oui-top-1 oui-z-10 oui-flex oui-items-center\",\n active ? \"oui-opacity-100\" : \"oui-opacity-60\",\n ])}\n >\n <LeaderboardTotalPrice />\n <Text\n size=\"2xs\"\n className={cn(\n \"oui-trading-leaderboard-title oui-font-medium oui-text-base-contrast\",\n )}\n >\n {price}\n </Text>\n </div>\n );\n};\n\nconst LeaderboardTotalPrice = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n >\n <path\n d=\"M3.2 9.5C2.44167 9.5 1.80208 9.23958 1.28125 8.71875C0.760417 8.19792 0.5 7.55833 0.5 6.8C0.5 6.48333 0.554167 6.175 0.6625 5.875C0.770833 5.575 0.925 5.30417 1.125 5.0625L2.9 2.925L1.6875 0.5H8.3125L7.1 2.925L8.875 5.0625C9.075 5.30417 9.22917 5.575 9.3375 5.875C9.44583 6.175 9.5 6.48333 9.5 6.8C9.5 7.55833 9.2375 8.19792 8.7125 8.71875C8.1875 9.23958 7.55 9.5 6.8 9.5H3.2ZM5 7C4.725 7 4.48958 6.90208 4.29375 6.70625C4.09792 6.51042 4 6.275 4 6C4 5.725 4.09792 5.48958 4.29375 5.29375C4.48958 5.09792 4.725 5 5 5C5.275 5 5.51042 5.09792 5.70625 5.29375C5.90208 5.48958 6 5.725 6 6C6 6.275 5.90208 6.51042 5.70625 6.70625C5.51042 6.90208 5.275 7 5 7ZM3.8125 2.5H6.1875L6.6875 1.5H3.3125L3.8125 2.5ZM3.2 8.5H6.8C7.275 8.5 7.67708 8.33542 8.00625 8.00625C8.33542 7.67708 8.5 7.275 8.5 6.8C8.5 6.6 8.46458 6.40625 8.39375 6.21875C8.32292 6.03125 8.225 5.8625 8.1 5.7125L6.2625 3.5H3.75L1.9 5.7C1.775 5.85 1.67708 6.02083 1.60625 6.2125C1.53542 6.40417 1.5 6.6 1.5 6.8C1.5 7.275 1.66458 7.67708 1.99375 8.00625C2.32292 8.33542 2.725 8.5 3.2 8.5Z\"\n fill=\"#FFDD45\"\n />\n </svg>\n );\n};\n","import { useCallback, useState, useEffect, memo, useRef } from \"react\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n useEmblaCarousel,\n} from \"@kodiak-finance/orderly-ui\";\nimport { DefaultCampaign } from \"../DefaultCampaign\";\nimport { CampaignItemUI } from \"../campaign.item.ui\";\nimport { CampaignConfig } from \"../type\";\nimport { getCampaignTag } from \"../utils\";\n\nexport const CampaignsHeaderMobileUI = memo<{\n campaigns: CampaignConfig[];\n currentCampaignId: string;\n onCampaignChange: (campaignId: string) => void;\n backgroundSrc?: string;\n}>(({ campaigns, currentCampaignId, onCampaignChange, backgroundSrc }) => {\n const [canScrollPrev, setCanScrollPrev] = useState(false);\n const [canScrollNext, setCanScrollNext] = useState(false);\n const hasInitialScrolled = useRef(false);\n const isInitializing = useRef(true);\n\n const [emblaRef, emblaApi] = useEmblaCarousel({\n loop: false,\n align: \"start\",\n containScroll: \"keepSnaps\",\n slidesToScroll: 1,\n skipSnaps: false,\n dragFree: false,\n });\n\n // All campaign items including default campaign\n const allCampaignItems = [\n { campaign_id: \"general\", isDefault: true },\n ...campaigns.map((campaign) => ({ ...campaign, isDefault: false })),\n ];\n\n // Update scroll availability and handle auto campaign change on slide\n const updateScrollAvailability = useCallback(() => {\n if (!emblaApi || !campaigns?.length) return;\n\n setCanScrollPrev(emblaApi.canScrollPrev());\n setCanScrollNext(emblaApi.canScrollNext());\n\n // Skip auto campaign change during initialization or before initial scroll is completed\n if (isInitializing.current || !hasInitialScrolled.current) return;\n\n // Auto trigger onCampaignChange when slide changes (only after user interaction)\n const selectedIndex = emblaApi.selectedScrollSnap();\n const selectedCampaign = allCampaignItems[selectedIndex];\n\n if (selectedCampaign) {\n const campaignId = selectedCampaign.isDefault\n ? \"general\"\n : String(selectedCampaign.campaign_id);\n if (campaignId != currentCampaignId) {\n onCampaignChange(campaignId);\n }\n }\n }, [\n emblaApi,\n campaigns,\n currentCampaignId,\n onCampaignChange,\n allCampaignItems,\n ]);\n\n // Auto scroll to current campaign on initial load\n const scrollToCurrentCampaign = useCallback(() => {\n if (!emblaApi || !campaigns?.length) {\n return;\n }\n\n const targetIndex = allCampaignItems.findIndex((item) => {\n const campaignId = item.isDefault ? \"general\" : String(item.campaign_id);\n return campaignId === currentCampaignId;\n });\n\n if (targetIndex !== -1 && targetIndex !== emblaApi.selectedScrollSnap()) {\n emblaApi.scrollTo(targetIndex, false); // false to disable animation for initial scroll\n }\n\n // Mark as scrolled and initialized after the scroll operation\n hasInitialScrolled.current = true;\n // Small delay to ensure the scroll operation is completed before enabling auto change\n setTimeout(() => {\n isInitializing.current = false;\n }, 100);\n }, [emblaApi, campaigns, currentCampaignId, allCampaignItems]);\n\n useEffect(() => {\n if (!emblaApi) {\n return;\n }\n\n // Initial check\n updateScrollAvailability();\n\n // Auto scroll to current campaign on initial load\n scrollToCurrentCampaign();\n\n // Listen for scroll events\n emblaApi.on(\"select\", updateScrollAvailability);\n emblaApi.on(\"reInit\", updateScrollAvailability);\n\n return () => {\n emblaApi.off(\"select\", updateScrollAvailability);\n emblaApi.off(\"reInit\", updateScrollAvailability);\n };\n }, [emblaApi, updateScrollAvailability, scrollToCurrentCampaign]);\n\n // Reset scroll flag when currentCampaignId changes externally\n useEffect(() => {\n hasInitialScrolled.current = false;\n isInitializing.current = true;\n if (emblaApi) {\n scrollToCurrentCampaign();\n }\n }, [currentCampaignId, scrollToCurrentCampaign, emblaApi]);\n\n const scrollPrev = useCallback(() => {\n if (emblaApi) {\n // Enable auto campaign change after user interaction\n isInitializing.current = false;\n emblaApi.scrollPrev();\n }\n }, [emblaApi]);\n\n const scrollNext = useCallback(() => {\n if (emblaApi) {\n // Enable auto campaign change after user interaction\n isInitializing.current = false;\n emblaApi.scrollNext();\n }\n }, [emblaApi]);\n\n // Mobile shows one item at full width\n const slideStyle = { flexBasis: \"100%\", width: \"100%\", height: \"42px\" };\n\n // Hide scroll buttons when there's only one or no campaigns\n const shouldHideScrollButtons = campaigns.length < 1;\n\n return (\n <div className=\"oui-flex oui-w-full oui-items-center oui-gap-2 oui-px-3\">\n <button\n onClick={scrollPrev}\n disabled={!canScrollPrev}\n className={`oui-group oui-flex oui-h-[42px] oui-w-6 oui-shrink-0 oui-items-center oui-justify-center oui-rounded-lg oui-transition-colors hover:oui-bg-base-7 disabled:oui-cursor-not-allowed disabled:oui-opacity-30 disabled:hover:oui-bg-transparent ${shouldHideScrollButtons ? \"oui-hidden\" : \"\"}`}\n aria-label=\"Previous campaigns\"\n >\n <ChevronLeftIcon\n opacity={1}\n className=\"oui-text-base-contrast-54 group-hover:oui-text-base-contrast\"\n />\n </button>\n\n <div className=\"oui-min-w-0 oui-flex-1 oui-overflow-hidden\">\n <div ref={emblaRef}>\n <div className=\"oui-flex oui-gap-2\">\n <DefaultCampaign\n key=\"general_campaign\"\n currentCampaignId={currentCampaignId}\n onCampaignChange={onCampaignChange}\n style={slideStyle}\n className=\"oui-w-full oui-shrink-0\"\n />\n {campaigns?.map((campaign) => (\n <div\n key={campaign.campaign_id}\n className=\"oui-shrink-0\"\n style={slideStyle}\n >\n <CampaignItemUI\n backgroundSrc={backgroundSrc}\n campaign={campaign}\n tag={getCampaignTag(campaign)}\n active={currentCampaignId == campaign.campaign_id}\n onCampaignChange={onCampaignChange}\n classNames={{\n container: \"!oui-h-[42px]\",\n title: \"!oui-text-[10px]\",\n content: \"!oui-gap-[2px]\",\n tag: {\n container: \"!oui-h-[14px] !oui-px-1 !oui-py-[2px]\",\n text: \"!oui-text-[10px]\",\n },\n }}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n <button\n onClick={scrollNext}\n disabled={!canScrollNext}\n className={`oui-group oui-flex oui-h-[42px] oui-w-6 oui-shrink-0 oui-items-center oui-justify-center oui-rounded-lg oui-transition-colors hover:oui-bg-base-7 disabled:oui-cursor-not-allowed disabled:oui-opacity-30 disabled:hover:oui-bg-transparent ${shouldHideScrollButtons ? \"oui-hidden\" : \"\"}`}\n aria-label=\"Next campaigns\"\n >\n <ChevronRightIcon\n opacity={1}\n className=\"oui-text-base-contrast-54 group-hover:oui-text-base-contrast\"\n />\n </button>\n </div>\n );\n});\n","import { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { CampaignConfig } from \"../type\";\nimport { CampaignsHeaderUI } from \"./campaigns.header.desktop.ui\";\nimport { CampaignsHeaderMobileUI } from \"./campaigns.header.mobile.ui\";\n\nexport const CampaignsHeaderWidget = (props: {\n campaigns: CampaignConfig[];\n currentCampaignId: string;\n onCampaignChange: (campaignId: string) => void;\n backgroundSrc?: string;\n totalPrizePool?: { amount: number; currency: string };\n}) => {\n const { isMobile } = useScreen();\n return isMobile ? (\n <CampaignsHeaderMobileUI {...props} />\n ) : (\n <CampaignsHeaderUI {...props} />\n );\n};\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 parseTimeRange,\n} from \"../../../utils\";\n\nexport type GeneralLeaderboardIScriptReturn = ReturnType<\n typeof useGeneralLeaderboardIScript\n>;\n\nexport const FilterDays = [7, 14, 30, 90] as const;\nexport type TFilterDays = (typeof FilterDays)[number];\n\nexport type GeneralLeaderboardIScriptOptions = {\n campaignDateRange?: {\n start_time: Date | string;\n end_time: Date | string;\n };\n weekOneAddresses?: string[];\n timeRange?: {\n from?: string | Date;\n to?: string | Date | \"now\";\n };\n};\n\nexport function useGeneralLeaderboardIScript(\n options?: GeneralLeaderboardIScriptOptions,\n) {\n const { campaignDateRange, timeRange } = 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 parsedTimeRange = useMemo(() => {\n return parseTimeRange(timeRange);\n }, [timeRange]);\n\n const [activeTab, setActiveTab] = useState<LeaderboardTab>(\n LeaderboardTab.Volume,\n );\n const filterState = useFilter({\n defaultRange: currentOrAllTimeRange,\n customTimeRange: parsedTimeRange,\n });\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 weekOneAddresses: options?.weekOneAddresses,\n };\n}\n\nfunction useFilter({\n defaultRange,\n customTimeRange,\n}: {\n defaultRange?: DateRange;\n customTimeRange?: DateRange | null;\n}) {\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 // Use customTimeRange if provided, otherwise fall back to defaultRange or 90 days\n const rangeToUse = customTimeRange || defaultRange || getDateRange(90);\n setDateRange(rangeToUse);\n\n if (customTimeRange && rangeToUse?.from && rangeToUse?.to) {\n const offsetDay =\n Math.abs(differenceInDays(rangeToUse.from, rangeToUse.to)) + 1;\n if (FilterDays.includes(offsetDay as TFilterDays)) {\n setFilterDay(offsetDay as TFilterDays);\n } else {\n setFilterDay(null);\n }\n }\n }, [defaultRange, customTimeRange]);\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 { FC, useMemo } from \"react\";\nimport { cn, Box, useScreen, Divider } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTab } from \"../../../type\";\nimport { GeneralRankingWidget } from \"../../ranking128/generalRanking\";\nimport { RankingColumnFields } from \"../../ranking128/shared/column\";\nimport { LeaderboardFilter } from \"../shared/LeaderboardFilter\";\nimport { LeaderboardTabs } from \"../shared/LeaderboardTabs\";\nimport { GeneralLeaderboardIScriptReturn } from \"./generalLeaderboard.script\";\n\nexport type GeneralLeaderboardIProps = {\n style?: React.CSSProperties;\n className?: string;\n campaignDateRange?: {\n start_time: Date | string;\n end_time: Date | string;\n };\n weekOneAddresses?: string[];\n timeRange?: {\n from?: string | Date;\n to?: string | Date | \"now\";\n };\n} & GeneralLeaderboardIScriptReturn;\n\nexport const GeneralLeaderboardI: FC<GeneralLeaderboardIProps> = (props) => {\n const { isMobile } = useScreen();\n\n const fields = useMemo<RankingColumnFields[]>(() => {\n if (isMobile) {\n return [\n \"rank\",\n \"address\",\n props.activeTab === LeaderboardTab.Volume ? \"volume\" : \"pnl\",\n ];\n }\n return [\"rank\", \"address\", \"volume\", \"pnl\"];\n }, [isMobile, props.activeTab]);\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 <LeaderboardFilter {...props} />\n <LeaderboardTabs\n isMobile={isMobile}\n className=\"oui-pt-0\"\n activeTab={props.activeTab}\n onTabChange={props.onTabChange}\n />\n\n <GeneralRankingWidget\n weekOneAddresses={props.weekOneAddresses}\n dateRange={props.dateRange}\n address={props.searchValue}\n sortKey={\n props.activeTab === LeaderboardTab.Volume\n ? \"perp_volume\"\n : \"realized_pnl\"\n }\n fields={fields}\n />\n </Box>\n );\n }\n\n return (\n <Box\n pt={2}\n pb={6}\n px={6}\n r=\"2xl\"\n intensity={900}\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 <LeaderboardFilter {...props} />\n <Divider intensity={8} />\n\n <GeneralRankingWidget\n weekOneAddresses={props.weekOneAddresses}\n dateRange={props.dateRange}\n address={props.searchValue}\n fields={fields}\n />\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 \"@kodiak-finance/orderly-ui\";\nimport { type CampaignRankingData } from \"../campaignRanking/campaignRanking.script\";\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 | CampaignRankingData;\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 typeof props.onSort === \"function\",\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 (\n column: TanstackColumn<RankingData>,\n record: RankingData,\n index: number,\n ) => {\n const isFirstColumn = column.getIsFirstColumn();\n const isLastColumn = column.getIsLastColumn();\n const isRank = [1, 2, 3].includes(record.rank as number);\n if (record.key === getCurrentAddressRowKey(props.address!)) {\n return {\n className: cn(\n \"after:oui-absolute after:oui-h-[40px] after:oui-w-full md:after:oui-h-[48px]\",\n \"after:oui-border-[rgb(var(--oui-gradient-brand-start))]\",\n \"after:oui-left-0 after:oui-top-[2px] after:oui-z-[-1]\",\n \"after:oui-border-y\",\n isFirstColumn && \"after:oui-rounded-l-lg after:oui-border-l\",\n isLastColumn && \"after:oui-rounded-r-lg after:oui-border-r\",\n ),\n };\n }\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 // style: isRank\n // ? {\n // position: \"unset\",\n // }\n // : undefined,\n };\n },\n [props.address],\n );\n\n if (isMobile) {\n return (\n <>\n <DataTable\n classNames={{\n root: \"oui-trading-leaderboard-ranking-table\",\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 initialSort={props.initialSort}\n onSort={props.onSort}\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 initialSort={props.initialSort}\n onSort={props.onSort}\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-h-[calc(100%_-_53px_-_8px)]\",\n ),\n scroll: \"oui-min-h-[600px] oui-max-h-[1250px]\",\n }}\n onRow={onRow}\n onCell={onCell}\n />\n );\n};\n","import { ReactNode, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Text,\n Column,\n Box,\n useScreen,\n cn,\n toast,\n} from \"@kodiak-finance/orderly-ui\";\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 =\n | \"rank\"\n | \"address\"\n | \"volume\"\n | \"pnl\"\n | \"rewards\";\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 let linearGradientText;\n\n if (!isYou) {\n if (record.rank === 1) {\n linearGradientText =\n \"linear-gradient(169deg, #FBE67B 2.09%, #FCFBE7 15.8%, #F7D14E 40.73%, #D4A041 58.8%)\";\n } else if (record.rank === 2) {\n linearGradientText =\n \"linear-gradient(201.05deg, #D9D9D9 38.79%, #F7F6F4 53.85%, #D9D9D9 71.71%, #7F7F7F 91.87%), rgba(255, 255, 255, 0.8)\";\n } else if (record.rank === 3) {\n linearGradientText =\n \"linear-gradient(149.05deg, #B6947E 15.63%, #F8DAC8 31.37%, #B6947E 44.29%, #F8DCCB 56.6%), rgba(255, 255, 255, 0.8)\";\n }\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 copyable\n onCopy={(e) => {\n e.preventDefault();\n e.stopPropagation();\n navigator.clipboard.writeText(value);\n toast.success(t(\"common.copy.copied\"));\n }}\n // style={\n // linearGradientText\n // ? {\n // background: linearGradientText,\n // WebkitBackgroundClip: \"text\",\n // WebkitTextFillColor: \"transparent\",\n // backgroundClip: \"text\",\n // }\n // : {}\n // }\n className=\"oui-cursor-pointer oui-underline oui-decoration-line-16 oui-decoration-dashed oui-underline-offset-4\"\n >\n {value}\n </Text.formatted>\n {isYou && <Text> (You)</Text>}\n </a>\n </>\n );\n },\n width: 90,\n },\n {\n title: t(\"tradingLeaderboard.tradingVolume\"),\n dataIndex: \"volume\",\n onSort: enableSort,\n align: isMobile ? \"right\" : \"left\",\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2}>\n {value}\n </Text.numeral>\n );\n },\n width: 105,\n },\n {\n title: t(\"common.pnl\"),\n dataIndex: \"pnl\",\n onSort: enableSort,\n align: isMobile ? \"right\" : \"left\",\n render: (value: string) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral prefix=\"$\" rule=\"price\" dp={2} coloring>\n {value}\n </Text.numeral>\n );\n },\n width: 90,\n },\n {\n title: t(\"tradingLeaderboard.estimatedRewards\"),\n dataIndex: \"rewards\",\n align: isMobile ? \"right\" : \"left\",\n render: (value: { amount: number; currency: string }) => {\n if (!value) {\n return \"-\";\n }\n return (\n <Text.numeral\n suffix={` ${value?.currency || \"\"}`}\n rule=\"price\"\n dp={0}\n >\n {value?.amount}\n </Text.numeral>\n );\n },\n width: 90,\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, useState } from \"react\";\nimport { useAccount, useQuery } from \"@kodiak-finance/orderly-hooks\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { TableSort, usePagination, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useEndReached } from \"../../../hooks/useEndReached\";\nimport { DateRange } from \"../../../type\";\nimport { getDateRange } from \"../../../utils\";\nimport { CampaignStatistics } from \"../../campaigns/type\";\nimport { useTradingLeaderboardContext } from \"../../provider\";\nimport { getCurrentAddressRowKey, isSameAddress } from \"../shared/util\";\n\nconst CAMPAIGN_IDS = [\"129\", \"136\", \"131\", \"132\", \"133\", \"134\"];\n\nexport type GeneralRankingData = {\n account_id: string;\n address: string;\n broker_fee: number;\n date: string;\n perp_maker_volume: number;\n perp_taker_volume: number;\n perp_volume: number;\n realized_pnl: number;\n total_fee: number;\n\n // custom field\n key?: string;\n rank?: number | string;\n volume?: number;\n pnl?: number;\n};\n\nexport type GeneralRankingResponse = {\n meta: API.RecordsMeta;\n rows: GeneralRankingData[];\n};\nexport type GeneralRankingScriptReturn = ReturnType<\n typeof useGeneralRankingScript\n>;\n\nexport type GeneralRankingScriptOptions = {\n dateRange?: DateRange | null;\n address?: string;\n sortKey?: \"perp_volume\" | \"realized_pnl\";\n weekOneAddresses?: string[];\n};\n\nexport function useGeneralRankingScript(options?: GeneralRankingScriptOptions) {\n const {\n dateRange = getDateRange(90),\n address: searchValue,\n sortKey = \"perp_volume\",\n weekOneAddresses,\n } = options || {};\n\n const [initialSort] = useState<TableSort>({\n sortKey,\n sort: \"desc\",\n });\n\n const [sort, setSort] = useState<TableSort | undefined>(initialSort);\n\n const { state } = useAccount();\n\n const { setStatistics } = useTradingLeaderboardContext();\n\n const { isMobile } = useScreen();\n\n const { page, pageSize, setPage, parsePagination } = usePagination({\n pageSize: 500,\n });\n\n const { campaignRankingList, filteredCampaignData, isLoading } =\n useCampaignRankingList({\n dateRange,\n sort,\n searchValue,\n weekOneAddresses,\n setStatistics,\n });\n\n const getAddressRank = useCallback(\n (address: string) => {\n const index = filteredCampaignData?.findIndex((item) =>\n isSameAddress(item.address, address!),\n );\n return index !== -1 ? index! + 1 : \"-\";\n },\n [filteredCampaignData],\n );\n\n const userDataList = useMemo(() => {\n if (!state.address) {\n return [];\n }\n\n const targetAddress = filteredCampaignData?.find((item) =>\n isSameAddress(item.address, state.address!),\n );\n\n if (!targetAddress) {\n return [];\n }\n\n return [\n {\n ...targetAddress,\n rank: getAddressRank(targetAddress!.address!),\n key: getCurrentAddressRowKey(targetAddress!.address!),\n },\n ];\n }, [state.address, getAddressRank, filteredCampaignData]);\n\n const addRankForList = useCallback(\n (list: GeneralRankingData[], total: number) => {\n return list?.map((item, index) => {\n let rank: string | number = index + 1;\n\n if (searchValue) {\n rank = getAddressRank(item.address);\n } else {\n if (sort?.sort === \"asc\") {\n rank = total - index;\n } else if (sort?.sort === \"desc\") {\n rank = index + 1;\n }\n }\n\n return {\n ...item,\n rank,\n };\n });\n },\n [page, pageSize, sort, searchValue, getAddressRank],\n );\n\n const dataSource = useMemo(() => {\n let list: GeneralRankingData[] =\n filteredCampaignData as GeneralRankingData[];\n // hardcode for 128 campaign\n\n if (page === 1) {\n list = list.slice(0, pageSize);\n }\n const total = list.length;\n\n const rankList = addRankForList(list, total);\n\n if (page === 1 && !searchValue) {\n return formatData([...userDataList, ...rankList]);\n }\n return formatData(rankList);\n }, [\n page,\n pageSize,\n userDataList,\n searchValue,\n addRankForList,\n campaignRankingList,\n filteredCampaignData,\n ]);\n\n const dataList = useMemo(() => {\n let total = filteredCampaignData?.length || 0;\n let flatList = filteredCampaignData as GeneralRankingData[];\n if (campaignRankingList && campaignRankingList.length > 0) {\n if (filteredCampaignData) {\n flatList = filteredCampaignData as GeneralRankingData[];\n total = filteredCampaignData.length;\n } else {\n flatList = flatList.filter((item) =>\n campaignRankingList.includes(item.address),\n );\n total = flatList.length;\n }\n }\n const rankList = addRankForList(flatList, total);\n\n if (!searchValue) {\n return formatData([...userDataList, ...rankList]);\n }\n return formatData(rankList);\n }, [\n userDataList,\n searchValue,\n addRankForList,\n campaignRankingList,\n filteredCampaignData,\n ]);\n\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n const pagination = useMemo(\n () =>\n parsePagination({\n total: dataSource?.length,\n current_page: 1,\n records_per_page: pageSize,\n }),\n [pageSize, dataSource],\n );\n\n useEndReached(sentinelRef, () => {\n if (isMobile) {\n setPage(page + 1);\n }\n });\n\n const onSort = useCallback(\n (sort?: TableSort) => {\n // befause table column dataIndex is not the same as the api sort, so we need to map the sortKey\n if (sort?.sortKey === \"volume\") {\n sort.sortKey = \"perp_volume\";\n } else if (sort?.sortKey === \"pnl\") {\n sort.sortKey = \"realized_pnl\";\n }\n // fix for mobile sort\n setSort((_sort) => {\n if (sort) return sort;\n return isMobile\n ? { sortKey: _sort?.sortKey || \"\", sort: \"desc\" }\n : initialSort;\n });\n },\n [initialSort, isMobile],\n );\n\n useEffect(() => {\n if (searchValue) {\n setPage(1);\n }\n }, [searchValue]);\n\n useEffect(() => {\n setPage(1);\n }, [state.address]);\n\n useEffect(() => {\n if (dateRange?.to && dateRange?.from) {\n setPage(1);\n }\n }, [dateRange]);\n\n useEffect(() => {\n setSort({ sortKey, sort: \"desc\" });\n }, [sortKey]);\n\n return {\n pagination,\n initialSort,\n onSort,\n dataSource,\n isLoading,\n isMobile,\n sentinelRef,\n dataList,\n address: state.address,\n };\n}\n\nfunction formatData(data: any[]) {\n return data.map((item) => ({\n ...item,\n volume: item.perp_volume,\n pnl: item.realized_pnl,\n }));\n}\n\n// for 128 campaign hardcode\nconst useCampaignRankingList = ({\n dateRange,\n sort,\n searchValue,\n weekOneAddresses,\n setStatistics,\n}: {\n dateRange: DateRange | null;\n sort?: TableSort;\n searchValue?: string;\n weekOneAddresses?: string[];\n setStatistics: any;\n}) => {\n const [allCampaignData, setAllCampaignData] = useState<any[]>([]);\n const getUrl = (campaignId: string) => {\n const searchParams = new URLSearchParams();\n searchParams.set(\"campaign_id\", campaignId);\n searchParams.set(\"page\", \"1\");\n searchParams.set(\"size\", \"2000\");\n searchParams.set(\"aggregate_by\", \"address\");\n\n return `https://api.orderly.org/v1/public/campaign/ranking?${searchParams.toString()}`;\n };\n\n useEffect(() => {\n const urls = CAMPAIGN_IDS.map((campaignId) => getUrl(campaignId));\n Promise.all(urls.map((url) => fetch(url).then((res) => res.json()))).then(\n (res) => {\n setAllCampaignData(res.map(formatCampaignData));\n },\n );\n }, []);\n\n const { data: campaignData, isLoading: isCampaignDataLoading } = useQuery<\n GeneralRankingResponse[\"rows\"]\n >(getUrl(\"128\"), {\n revalidateOnFocus: false,\n });\n\n const { data, isLoading: isDataLoading } = useQuery<\n GeneralRankingResponse[\"rows\"]\n >(\n dateRange?.label\n ? getUrl(CAMPAIGN_IDS[Number(dateRange.label?.split(\" \")[1]) - 1])\n : null,\n {\n revalidateOnFocus: false,\n },\n );\n\n const campaignRankingList = useMemo(() => {\n if (!dateRange?.label) {\n return undefined;\n }\n return campaignData?.map((item) => item.address) || [];\n }, [campaignData, dateRange]);\n\n useEffect(() => {\n if (allCampaignData.length > 0 && campaignRankingList) {\n const list = weekOneAddresses ? weekOneAddresses : campaignRankingList;\n let totalVolume = 0;\n\n allCampaignData.forEach((item, index) => {\n if (index === 0) {\n const filteredList = item.filter((item: any) =>\n list.includes(item.address),\n );\n totalVolume += filteredList.reduce(\n (acc: number, curr: any) => acc + curr.perp_volume,\n 0,\n );\n } else {\n totalVolume += item.reduce(\n (acc: number, curr: any) => acc + curr.perp_volume,\n 0,\n );\n }\n });\n\n setStatistics((stas: CampaignStatistics) => ({\n ...stas,\n total_volume: totalVolume,\n }));\n }\n }, [allCampaignData, weekOneAddresses, campaignRankingList]);\n\n const isLoading = isCampaignDataLoading || isDataLoading;\n\n const filteredCampaignData = useMemo(() => {\n const list =\n data?.filter((item) => {\n if (dateRange?.label === \"Week 1\") {\n return (\n (weekOneAddresses\n ? weekOneAddresses?.includes(item.address)\n : campaignRankingList?.includes(item.address)) &&\n (searchValue ? isSameAddress(item.address, searchValue) : true)\n );\n }\n return searchValue ? isSameAddress(item.address, searchValue) : true;\n }) || [];\n const newList = list.map((item) => ({\n address: item.address,\n perp_volume: item.volume,\n realized_pnl: item.pnl,\n }));\n\n if (sort) {\n newList.sort((a: any, b: any) => {\n if (sort?.sort === \"asc\") {\n return a?.[sort?.sortKey] - b?.[sort?.sortKey];\n } else if (sort?.sort === \"desc\") {\n return b?.[sort?.sortKey] - a?.[sort?.sortKey];\n }\n return 0;\n });\n }\n return newList;\n }, [\n data,\n campaignRankingList,\n sort,\n dateRange,\n searchValue,\n weekOneAddresses,\n ]);\n\n return { campaignRankingList, filteredCampaignData, isLoading };\n};\n\nconst formatCampaignData = (result: any) => {\n const data = result?.data?.rows || [];\n return data.map((item: any) => ({\n address: item.address,\n perp_volume: item.volume,\n realized_pnl: item.pnl,\n }));\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 { dateRange, address, fields, sortKey, weekOneAddresses, ...rest } =\n props;\n const state = useGeneralRankingScript({\n dateRange,\n address,\n sortKey,\n weekOneAddresses,\n });\n\n return <Ranking {...state} {...rest} fields={fields} />;\n};\n","import { FC, SVGProps } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n CloseCircleFillIcon,\n cn,\n DataFilter,\n Flex,\n Input,\n Text,\n useScreen,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ScrollIndicator } from \"@kodiak-finance/orderly-ui\";\nimport {\n FilterDays,\n GeneralLeaderboardIScriptReturn,\n} from \"../generalLeaderboard/generalLeaderboard.script\";\n\nexport type LeaderboardFilterProps = GeneralLeaderboardIScriptReturn;\n\nexport const LeaderboardFilter: FC<LeaderboardFilterProps> = (props) => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const { useCampaignDateRange, weeklyRanges, setDateRange } = props;\n\n const weeklyView = (\n <Flex gap={3} className={cn(isMobile ? \"oui-h-[24px]\" : \"oui-h-[53px]\")}>\n {weeklyRanges.map((range) => (\n <button\n className=\"oui-relative oui-w-fit oui-whitespace-nowrap oui-px-2 oui-py-[2px] oui-text-sm\"\n key={range.label}\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={\n props.dateRange?.label === range.label ? \"brand\" : undefined\n }\n className={\n props.dateRange?.label !== range.label\n ? \"oui-text-base-contrast-54\"\n : \"\"\n }\n >\n {`${range.label}`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-absolute oui-inset-0 oui-rounded oui-opacity-[.12] oui-gradient-primary\"\n onClick={() => {\n setDateRange(range);\n }}\n ></div>\n </button>\n ))}\n </Flex>\n );\n\n const input = (\n <Input\n value={props.searchValue}\n onValueChange={props.onSearchValueChange}\n placeholder={t(\"common.address.search.placeholder\")}\n className={cn(\n \"oui-trading-leaderboard-trading-search-input\",\n \"oui-w-full\",\n )}\n size=\"sm\"\n prefix={\n <Box pl={3} pr={1}>\n <SearchIcon className=\"oui-text-base-contrast-36\" />\n </Box>\n }\n suffix={\n props.searchValue && (\n <Box mr={2}>\n <CloseCircleFillIcon\n size={14}\n className=\"oui-cursor-pointer oui-text-base-contrast-36\"\n onClick={props.clearSearchValue}\n />\n </Box>\n )\n }\n autoComplete=\"off\"\n />\n );\n\n const dateRangeView = props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value) => {\n props.onFilter(value);\n }}\n className=\"oui-h-[53px] oui-border-none\"\n />\n );\n\n const filterDayView = FilterDays.map((value) => {\n return (\n <button\n className=\"oui-relative oui-px-2 oui-py-[2px] oui-text-sm\"\n key={value}\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={props.filterDay === value ? \"brand\" : undefined}\n className={\n props.filterDay !== value ? \"oui-text-base-contrast-54\" : \"\"\n }\n >\n {`${value}D`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-absolute oui-inset-0 oui-rounded oui-opacity-[.12] oui-gradient-primary\"\n onClick={() => {\n props.updateFilterDay(value as any);\n }}\n ></div>\n </button>\n );\n });\n\n if (isMobile) {\n return (\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n direction=\"column\"\n mt={3}\n className={cn(\"oui-mobile-trading-leaderboard-ranking-filter\")}\n >\n {input}\n\n {useCampaignDateRange ? (\n <Flex gap={3} className=\"oui-w-full oui-py-3\">\n <ScrollIndicator className=\"oui-w-full\">\n {weeklyView}\n </ScrollIndicator>\n </Flex>\n ) : (\n <Flex gap={3} className=\"oui-w-full\">\n {dateRangeView}\n <ScrollIndicator className=\"oui-w-full\">\n <Flex gap={3}>{filterDayView}</Flex>\n </ScrollIndicator>\n </Flex>\n )}\n </Flex>\n );\n }\n\n return (\n <Flex\n width=\"100%\"\n justify=\"between\"\n itemAlign=\"center\"\n className={cn(\"oui-trading-leaderboard-ranking-filter\")}\n >\n <Flex gap={3}>\n {useCampaignDateRange && weeklyView}\n {!useCampaignDateRange && dateRangeView}\n {!useCampaignDateRange && filterDayView}\n </Flex>\n <Box width={240}>{input}</Box>\n </Flex>\n );\n};\n\nexport const SearchIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M5.841 1.14a4.667 4.667 0 0 0 0 9.333 4.74 4.74 0 0 0 2.875-.975l2.54 2.56a.6.6 0 0 0 .838 0 .6.6 0 0 0 0-.838L9.537 8.677a4.72 4.72 0 0 0 .971-2.871 4.667 4.667 0 0 0-4.667-4.667m0 1.166a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7\" />\n </svg>\n);\n","import { FC, useEffect, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Flex, TabPanel, Tabs } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTab } from \"../../../type\";\nimport { formatUpdateDate } from \"../../../utils\";\nimport { useTradingLeaderboardContext } from \"../../provider\";\n\ntype LeaderboardTabsProps = {\n isMobile?: boolean;\n className?: string;\n activeTab: LeaderboardTab;\n onTabChange: (tab: LeaderboardTab) => void;\n};\n\nexport const LeaderboardTabs: FC<LeaderboardTabsProps> = (props) => {\n const { t } = useTranslation();\n const { updatedTime, currentCampaign } = useTradingLeaderboardContext();\n\n const updateTime = useMemo(() => {\n if (updatedTime && currentCampaign) {\n return formatUpdateDate(updatedTime);\n }\n return \"\";\n }, [props.isMobile, updatedTime, currentCampaign]);\n\n const { showVolume, showPnl } = useMemo(() => {\n const metrics = currentCampaign?.prize_pools?.map((item) => item.metric);\n const isMobileGeneral = props.isMobile && !currentCampaign;\n const showVolume = isMobileGeneral\n ? true\n : metrics?.includes(LeaderboardTab.Volume);\n const showPnl = isMobileGeneral\n ? true\n : metrics?.includes(LeaderboardTab.Pnl);\n\n return {\n showVolume,\n showPnl,\n };\n }, [currentCampaign, props.activeTab, props.isMobile]);\n\n useEffect(() => {\n // set default tab\n if (showVolume && showPnl) {\n props.onTabChange(LeaderboardTab.Volume);\n } else if (showVolume) {\n props.onTabChange(LeaderboardTab.Volume);\n } else if (showPnl) {\n props.onTabChange(LeaderboardTab.Pnl);\n }\n }, [currentCampaign, showVolume, showPnl]);\n\n const renderTabs = () => {\n if (showVolume && showPnl) {\n return (\n <Tabs\n value={props.activeTab}\n onValueChange={props.onTabChange as (tab: string) => void}\n variant=\"contained\"\n size=\"lg\"\n key={currentCampaign?.campaign_id}\n >\n <TabPanel\n title={t(\"tradingLeaderboard.tradingVolume\")}\n value={LeaderboardTab.Volume}\n ></TabPanel>\n <TabPanel\n title={t(\"common.realizedPnl\")}\n value={LeaderboardTab.Pnl}\n ></TabPanel>\n </Tabs>\n );\n }\n\n if (showVolume) {\n return (\n <Tabs\n value={props.activeTab}\n onValueChange={props.onTabChange as (tab: string) => void}\n variant=\"contained\"\n size=\"lg\"\n key={currentCampaign?.campaign_id}\n >\n <TabPanel\n title={t(\"tradingLeaderboard.tradingVolume\")}\n value={LeaderboardTab.Volume}\n ></TabPanel>\n </Tabs>\n );\n }\n\n if (showPnl) {\n return (\n <Tabs\n value={props.activeTab}\n onValueChange={props.onTabChange as (tab: string) => void}\n variant=\"contained\"\n size=\"lg\"\n key={currentCampaign?.campaign_id}\n >\n <TabPanel\n title={t(\"common.realizedPnl\")}\n value={LeaderboardTab.Pnl}\n ></TabPanel>\n </Tabs>\n );\n }\n return <div></div>;\n };\n\n return (\n <Flex\n width=\"100%\"\n py={3}\n justify=\"between\"\n className={cn(\n \"oui-trading-leaderboard-ranking-tabs\",\n \"oui-border-b oui-border-line\",\n props.className,\n )}\n >\n {renderTabs()}\n {/* <Tabs\n value={props.activeTab}\n onValueChange={props.onTabChange as (tab: string) => void}\n variant=\"contained\"\n size=\"lg\"\n >\n <TabPanel\n title=\"Trading volume\"\n value={LeaderboardTab.Volume}\n ></TabPanel>\n <TabPanel title=\"Realized PnL\" value={LeaderboardTab.Pnl}></TabPanel>\n </Tabs> */}\n {updateTime && (\n <Flex\n itemAlign=\"start\"\n direction={props.isMobile ? \"column\" : \"row\"}\n gap={1}\n className={cn(\n props.isMobile ? \"oui-text-3xs\" : \"oui-text-sm\",\n \"oui-text-base-contrast-36\",\n )}\n >\n <span>{t(\"tradingLeaderboard.lastUpdate\")}:</span>\n <span>{updateTime}</span>\n </Flex>\n )}\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport { useGeneralLeaderboardIScript } from \"./generalLeaderboard.script\";\nimport {\n GeneralLeaderboardI,\n GeneralLeaderboardIProps,\n} from \"./generalLeaderboard.ui\";\n\nexport type GeneralLeaderboardIWidgetProps = Pick<\n GeneralLeaderboardIProps,\n \"style\" | \"className\" | \"campaignDateRange\" | \"weekOneAddresses\" | \"timeRange\"\n>;\n\nexport const GeneralLeaderboardIWidget: FC<GeneralLeaderboardIWidgetProps> = (\n props,\n) => {\n const state = useGeneralLeaderboardIScript({\n campaignDateRange: props.campaignDateRange,\n weekOneAddresses: props.weekOneAddresses,\n timeRange: props.timeRange,\n });\n\n return (\n <GeneralLeaderboardI\n {...state}\n className={props.className}\n style={props.style}\n timeRange={props.timeRange}\n />\n );\n};\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTitle } from \"../../pages/leaderboard/page\";\nimport { useCampaignsScript } from \"../campaigns/campaigns.script\";\nimport { RewardsDesktopUI } from \"./rewards.desktop.ui\";\n\nexport const RewardsWidget = () => {\n const state = useCampaignsScript();\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const hideConfig = useMemo(() => {\n return {\n estimatedRewards: state.currentCampaign?.hide_estimated_rewards,\n };\n }, [state.currentCampaign]);\n\n if (\n state.currentCampaignId === \"general\" ||\n state.currentCampaign?.hide_rewards\n ) {\n return null;\n }\n\n return (\n <>\n <LeaderboardTitle\n title={t(\"tradingRewards.rewards\")}\n isMobile={isMobile}\n />\n <RewardsDesktopUI\n campaign={state.currentCampaign}\n userdata={state.userData}\n onLearnMore={state.onLearnMore}\n onTradeNow={state.onTradeNow}\n isMobile={isMobile}\n shouldShowJoinButton={state.shouldShowJoinButton}\n joinCampaign={state.joinCampaign}\n hideConfig={hideConfig}\n />\n </>\n );\n};\n","import { FC, useMemo, useState } from \"react\";\nimport { useTranslation, Trans } from \"@kodiak-finance/orderly-i18n\";\nimport { InfoCircleIcon, Tooltip, Text, Button, cn } from \"@kodiak-finance/orderly-ui\";\nimport { commify } from \"@kodiak-finance/orderly-utils\";\nimport { CampaignConfig, UserData } from \"../campaigns/type\";\nimport {\n calculateEstimatedRewards,\n calculateEstimatedTickets,\n calculateUserPoolReward,\n formatRewardAmount,\n formatTicketCount,\n calculateTicketProgress,\n} from \"./utils\";\n\ninterface RewardsDesktopUIProps {\n campaign?: CampaignConfig;\n userdata?: UserData;\n onLearnMore: () => void;\n onTradeNow: () => void;\n isMobile?: boolean;\n shouldShowJoinButton?: boolean;\n joinCampaign?: (data: { campaign_id: string | number }) => Promise<any>;\n isJoining?: boolean;\n hideConfig?: {\n estimatedRewards?: boolean;\n estimatedTickets?: boolean;\n };\n}\n\nexport const RewardsDesktopUI: FC<RewardsDesktopUIProps> = ({\n campaign,\n userdata,\n onLearnMore,\n onTradeNow,\n isMobile,\n shouldShowJoinButton,\n joinCampaign,\n isJoining,\n hideConfig,\n}) => {\n const { t } = useTranslation();\n // Use mock data for userdata if not provided\n const currentUserData = userdata;\n\n // Calculate estimated rewards\n const estimatedRewards =\n campaign && currentUserData\n ? calculateEstimatedRewards(currentUserData, campaign)\n : null;\n\n // Calculate estimated tickets\n const estimatedTickets =\n campaign?.ticket_rules && currentUserData\n ? calculateEstimatedTickets(currentUserData, campaign.ticket_rules)\n : 0;\n\n const rewardText = estimatedRewards\n ? formatRewardAmount(estimatedRewards.amount, estimatedRewards.currency)\n : \"0 USDC\";\n\n const ticketText = formatTicketCount(estimatedTickets);\n\n const canTrade = useMemo(() => {\n return (\n campaign?.start_time &&\n campaign?.end_time &&\n campaign.start_time < new Date().toISOString() &&\n campaign.end_time > new Date().toISOString()\n );\n }, [campaign]);\n\n const tooltipContent = useMemo(() => {\n // if (!campaign?.prize_pools || !currentUserData) {\n // return null;\n // }\n\n return (\n <div className=\"oui-flex oui-min-w-[240px] oui-flex-col oui-gap-1\">\n {campaign?.prize_pools?.map((pool) => {\n if (pool.tiers.length == 0) {\n return null;\n }\n const userPoolReward = currentUserData\n ? calculateUserPoolReward(currentUserData, pool)\n : 0;\n\n return (\n <div\n key={pool.pool_id}\n className=\"oui-flex oui-h-[18px] oui-items-center oui-justify-between\"\n >\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast-54\"\n >\n {pool.label}\n </Text>\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <Text.numeral\n dp={2}\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast\"\n >\n {userPoolReward}\n </Text.numeral>\n <Text\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-text-base-contrast\"\n >\n {pool.currency}\n </Text>\n </div>\n </div>\n );\n })}\n </div>\n );\n }, [campaign, currentUserData]);\n\n const ticketTooltipContent = useMemo(() => {\n const ticketRules = campaign?.ticket_rules;\n\n if (!ticketRules) {\n return null;\n }\n\n if (ticketRules.mode === \"linear\") {\n return (\n <div>\n {t(\"tradingLeaderboard.earnTickets\", {\n ticket: ticketRules?.linear?.tickets,\n amount: commify(ticketRules?.linear?.every || 0),\n })}\n </div>\n );\n }\n\n return (\n <div className=\"oui-flex oui-min-w-[240px] oui-flex-col oui-gap-1\">\n {ticketRules?.tiers?.map((tier) => {\n return (\n <div\n key={tier.value}\n className=\"h-[18px] oui-flex oui-items-center oui-justify-between oui-text-2xs oui-font-semibold\"\n >\n <Text.numeral\n currency=\"$\"\n suffix=\" volume\"\n dp={0}\n className=\"oui-text-base-contrast-54\"\n >\n {tier.value}\n </Text.numeral>\n <div className=\"oui-text-base-contrast\">\n {tier.tickets} tickets\n </div>\n </div>\n );\n })}\n </div>\n );\n }, [campaign]);\n\n const extraProps = useMemo(() => {\n if (\n !userdata ||\n !campaign?.ticket_rules ||\n campaign.end_time < new Date().toISOString() ||\n campaign.start_time > new Date().toISOString()\n ) {\n return {\n showExtraInfo: false,\n extraInfo: null,\n };\n }\n\n const progress = calculateTicketProgress(userdata, campaign.ticket_rules);\n\n if (!progress) {\n return {\n showExtraInfo: false,\n extraInfo: null,\n };\n }\n\n return {\n showExtraInfo: true,\n extraInfo: progress,\n };\n }, [campaign, userdata]);\n\n return (\n <div\n className={cn([\n \"oui-mx-auto oui-mb-10 oui-flex oui-max-w-[992px] oui-flex-col oui-pb-10\",\n isMobile ? \"oui-gap-3\" : \"oui-gap-6\",\n ])}\n >\n <div\n className={cn([\n \"oui-flex oui-w-full oui-items-stretch oui-gap-3\",\n isMobile ? \"oui-px-3\" : \"\",\n ])}\n >\n {!hideConfig?.estimatedRewards && (\n <RewardItem\n title={t(\"tradingLeaderboard.estimatedRewards\")}\n value={rewardText}\n showTooltip\n tooltip={tooltipContent}\n isMobile={isMobile}\n />\n )}\n <RewardItem\n showTooltip={!!campaign?.ticket_rules}\n title={t(\"tradingLeaderboard.estimatedTicketsEarned\")}\n value={ticketText}\n tooltip={ticketTooltipContent}\n {...extraProps}\n isMobile={isMobile}\n />\n </div>\n <div\n className={cn([\n \"oui-flex oui-justify-center oui-gap-3\",\n isMobile ? \"oui-px-3\" : \"\",\n ])}\n >\n {campaign?.rule_url && (\n <Button\n size={isMobile ? \"md\" : \"lg\"}\n variant=\"outlined\"\n className={cn([\n \"oui-border-[rgb(var(--oui-gradient-brand-start))] oui-text-[rgb(var(--oui-gradient-brand-start))] hover:oui-bg-[rgb(var(--oui-gradient-brand-start))]/[0.08] active:oui-bg-[rgb(var(--oui-gradient-brand-start))]/[0.08]\",\n isMobile ? \"oui-flex-1\" : \"oui-w-[140px]\",\n ])}\n onClick={onLearnMore}\n >\n {t(\"tradingLeaderboard.viewRules\")}\n </Button>\n )}\n {shouldShowJoinButton && (\n <Button\n size={isMobile ? \"md\" : \"lg\"}\n variant=\"gradient\"\n color=\"primary\"\n loading={isJoining}\n disabled={isJoining}\n className={cn([isMobile ? \"oui-flex-1\" : \"oui-w-[140px]\"])}\n onClick={() =>\n joinCampaign?.({ campaign_id: Number(campaign?.campaign_id) })\n }\n >\n {t(\"tradingLeaderboard.joinNow\")}\n </Button>\n )}\n {!shouldShowJoinButton && canTrade && (\n <Button\n size={isMobile ? \"md\" : \"lg\"}\n variant=\"gradient\"\n color=\"primary\"\n className={cn([isMobile ? \"oui-flex-1\" : \"oui-w-[140px]\"])}\n onClick={onTradeNow}\n >\n {t(\"tradingLeaderboard.tradeNow\")}\n </Button>\n )}\n </div>\n </div>\n );\n};\n\nconst RewardItem: FC<{\n title: string;\n value: string;\n showTooltip?: boolean;\n tooltip?: any;\n showExtraInfo?: boolean;\n extraInfo?: {\n percent: number;\n value: number;\n } | null;\n isMobile?: boolean;\n}> = (props) => {\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n const tooltipProps = useMemo(() => {\n if (!props.isMobile) {\n return {};\n }\n return {\n open: tooltipOpen,\n onOpenChange: setTooltipOpen,\n };\n }, [tooltipOpen, props.isMobile, setTooltipOpen]);\n\n return (\n <div className=\"oui-flex oui-flex-1 oui-flex-col oui-items-center oui-justify-center oui-rounded-2xl oui-bg-base-9 oui-px-5 oui-py-4\">\n <div\n className={cn([\n \"oui-text-base-contrast-54\",\n props.isMobile\n ? \"oui-h-[15px] oui-text-2xs oui-leading-[15px]\"\n : \"oui-text-sm oui-font-semibold\",\n ])}\n >\n {props.title}\n </div>\n <div className=\"oui-flex oui-items-center oui-gap-2\">\n <Text.gradient\n weight=\"bold\"\n color=\"brand\"\n className={cn([\n \"oui-trading-leaderboard-title\",\n props.isMobile\n ? \"oui-h-[16px] oui-text-base oui-leading-[16px]\"\n : \"oui-h-10 oui-text-[32px] oui-leading-10\",\n ])}\n >\n {props.value}\n </Text.gradient>\n {props.showTooltip && (\n <Tooltip content={props.tooltip} {...tooltipProps}>\n <div\n className=\"oui-flex oui-size-4 oui-items-center oui-justify-center\"\n onClick={() => setTooltipOpen(true)}\n >\n <InfoCircleIcon className=\"oui-cursor-pointer\" />\n </div>\n </Tooltip>\n )}\n </div>\n {props.showExtraInfo && (\n <div\n className={cn([\n \"oui-flex oui-flex-col oui-items-center oui-justify-end\",\n props.isMobile ? \"oui-mt-2\" : \"\",\n ])}\n >\n <div className=\"oui-flex oui-flex-col oui-items-center oui-gap-1 oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n <div\n className={cn([\n \"oui-flex oui-h-[18px] oui-w-[225px] oui-items-center oui-rounded-[100px] oui-bg-base-5 oui-p-[2px]\",\n props.isMobile ? \"oui-w-full\" : \"oui-w-[225px]\",\n ])}\n >\n <div\n className={cn([\n \"oui-h-[14px] oui-rounded-[100px]\",\n \"oui-bg-[linear-gradient(270deg,rgb(var(--oui-gradient-brand-start))_0%,rgb(var(--oui-gradient-brand-end))_100%)]\",\n ])}\n style={{ width: `${props?.extraInfo?.percent}%` }}\n />\n </div>\n <div\n className={cn([\n \"oui-text-center oui-font-semibold\",\n props.isMobile ? \"oui-text-2xs oui-leading-[15px]\" : \"\",\n ])}\n >\n {/* @ts-ignore */}\n {props.extraInfo.atMax ? (\n <Trans i18nKey=\"tradingLeaderboard.maxTicketsAchieved\" />\n ) : (\n <Trans\n i18nKey=\"tradingLeaderboard.tradeForMoreTickets\"\n components={[\n <span key=\"0\" className=\"oui-text-base-contrast\">\n ${props?.extraInfo?.value?.toFixed(2)}\n </span>,\n ]}\n />\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n","import { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useCampaignsScript } from \"../campaigns/campaigns.script\";\nimport { CampaignRuleUI } from \"./rule\";\nimport { CampaignTermsUI } from \"./terms\";\n\nexport const RuleWidget = () => {\n const state = useCampaignsScript();\n const { isMobile } = useScreen();\n\n const rulesAndTerms = state.currentCampaign?.rule;\n\n if (\n state.currentCampaignId === \"general\" ||\n !state.currentCampaign?.rule_config\n ) {\n return null;\n }\n\n return (\n <>\n <CampaignRuleUI\n id={state.currentCampaign.rule_url || \"\"}\n className={isMobile ? \"oui-px-3\" : \"\"}\n rules={rulesAndTerms?.rule}\n ruleConfig={rulesAndTerms?.ruleConfig}\n isMobile={isMobile}\n />\n <CampaignTermsUI\n className={isMobile ? \"oui-px-3\" : \"\"}\n termsConfig={rulesAndTerms?.terms}\n isMobile={isMobile}\n />\n </>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTitle } from \"../../pages/leaderboard/page\";\nimport {\n DescriptionContent,\n DescriptionItem,\n DescriptionConfig,\n} from \"./description\";\n\ntype RuleUIProps = {\n id: string;\n className?: string;\n isMobile?: boolean;\n rules?: DescriptionItem[];\n ruleConfig?: DescriptionConfig;\n};\n\nexport const CampaignRuleUI: FC<RuleUIProps> = ({\n id,\n className,\n isMobile,\n rules,\n ruleConfig,\n}) => {\n const { t } = useTranslation();\n return (\n <div\n className={cn(\"oui-mx-auto oui-max-w-[992px] oui-py-10\", className)}\n id={id}\n >\n <LeaderboardTitle\n isMobile={isMobile}\n title={t(\"tradingLeaderboard.rules\")}\n />\n <DescriptionContent description={rules || []} config={ruleConfig} />\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\n\n// import ReactMarkdown from \"react-markdown\";\n// import remarkGfm from \"remark-gfm\";\n\n// Enhanced type definition supporting multiple content formats\ntype ListStyle =\n | \"disc\"\n | \"decimal\"\n | \"none\"\n | \"circle\"\n | \"square\"\n | \"decimal-leading-zero\"\n | \"lower-alpha\"\n | \"upper-alpha\"\n | \"lower-roman\"\n | \"upper-roman\";\n\nexport type DescriptionItem = {\n content: string; // Support markdown syntax, plain text, or image URL\n type: \"markdown\" | \"text\" | \"image\";\n alt?: string; // For images\n className?: string; // Custom styling\n listStyle?: ListStyle; // List style for ul/ol elements\n listClassName?: string; // Custom list container class\n children?: DescriptionItem[];\n};\n\nexport type DescriptionConfig = {\n listStyle?: ListStyle; // Global list style\n listClassName?: string; // Global list container class\n};\n\n// Utility function to get list style classes\nconst getListStyleClass = (style: ListStyle): string => {\n const styleMap: Record<ListStyle, string> = {\n disc: \"oui-list-disc\",\n decimal: \"oui-list-decimal\",\n none: \"oui-list-none\",\n circle: \"oui-list-disc\", // Tailwind doesn't have circle, fallback to disc\n square: \"oui-list-disc\", // Tailwind doesn't have square, fallback to disc\n \"decimal-leading-zero\": \"oui-list-decimal\",\n \"lower-alpha\": \"oui-list-decimal\", // Fallback\n \"upper-alpha\": \"oui-list-decimal\", // Fallback\n \"lower-roman\": \"oui-list-decimal\", // Fallback\n \"upper-roman\": \"oui-list-decimal\", // Fallback\n };\n return styleMap[style] || \"oui-list-disc\";\n};\n\n// Custom rich text parser (no external dependencies)\nconst parseRichText = (text: string): JSX.Element[] => {\n const parts: JSX.Element[] = [];\n let currentIndex = 0;\n let key = 0;\n\n // Parse **bold** syntax\n const boldRegex = /\\*\\*(.*?)\\*\\*/g;\n // Parse [link text](url) syntax\n const linkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n // Parse ![alt text](image url) syntax\n const imageRegex = /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g;\n\n const allMatches: Array<{\n type: \"bold\" | \"link\" | \"image\";\n match: RegExpMatchArray;\n index: number;\n }> = [];\n\n // Find all matches\n let match;\n while ((match = boldRegex.exec(text)) !== null) {\n allMatches.push({ type: \"bold\", match, index: match.index });\n }\n while ((match = linkRegex.exec(text)) !== null) {\n allMatches.push({ type: \"link\", match, index: match.index });\n }\n while ((match = imageRegex.exec(text)) !== null) {\n allMatches.push({ type: \"image\", match, index: match.index });\n }\n\n // Sort by index\n allMatches.sort((a, b) => a.index - b.index);\n\n for (const { type, match } of allMatches) {\n // Add text before match\n if (match.index !== undefined && match.index > currentIndex) {\n const beforeText = text.slice(currentIndex, match.index);\n if (beforeText) {\n parts.push(<span key={key++}>{beforeText}</span>);\n }\n }\n\n // Add formatted element\n switch (type) {\n case \"bold\":\n parts.push(\n <strong\n key={key++}\n className=\"oui-font-bold oui-text-base-contrast-54\"\n >\n {match[1]}\n </strong>,\n );\n break;\n case \"link\":\n parts.push(\n <a\n key={key++}\n href={match[2]}\n className=\"oui-text-base-contrast-54 oui-underline hover:oui-text-base-contrast-54\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {match[1]}\n </a>,\n );\n break;\n case \"image\":\n parts.push(\n <img\n key={key++}\n src={match[2]}\n alt={match[1]}\n className=\"oui-my-2 oui-block oui-h-auto oui-max-w-full\"\n />,\n );\n break;\n }\n\n currentIndex = (match.index ?? 0) + match[0].length;\n }\n\n // Add remaining text\n if (currentIndex < text.length) {\n const remainingText = text.slice(currentIndex);\n if (remainingText) {\n parts.push(<span key={key++}>{remainingText}</span>);\n }\n }\n\n return parts.length > 0 ? parts : [<span key={0}>{text}</span>];\n};\n\n// Custom rich text implementation (recommended for lightweight needs)\nexport const DescriptionContent: FC<{\n description: DescriptionItem[] | ReadonlyArray<DescriptionItem>;\n config?: DescriptionConfig;\n}> = ({ description, config }) => {\n const renderContent = (\n contents: DescriptionItem[] | ReadonlyArray<DescriptionItem>,\n level: number = 0,\n ) => {\n // Determine list style - item level overrides global config\n const defaultListStyle = config?.listStyle || \"disc\";\n const hasListItems = contents.some((item) => item.children?.length);\n\n if (!hasListItems && contents.length === 1) {\n // Single item without children - render without list wrapper\n const content = contents[0];\n return (\n <div className={cn(\"oui-mb-2\", content.className)}>\n {renderContentItem(content)}\n </div>\n );\n }\n\n return (\n <ul\n className={cn(\n // Use list-outside for proper alignment\n \"oui-list-outside\",\n // Add left padding for proper spacing\n level === 0 ? \"oui-pl-5\" : \"oui-pl-4\",\n // Get list style class\n getListStyleClass(defaultListStyle),\n // Custom list container class\n config?.listClassName,\n )}\n >\n {contents.map((content, index) => {\n const itemListStyle = content.listStyle || defaultListStyle;\n\n return (\n <li\n key={`${content.content}-${index}`}\n className={cn(\n \"oui-mb-1 oui-leading-relaxed\",\n // Override list style if specified on item\n content.listStyle && getListStyleClass(itemListStyle),\n content.className,\n )}\n >\n {renderContentItem(content)}\n {content?.children?.length && (\n <div className=\"oui-mt-2 oui-text-sm oui-text-base-contrast-36\">\n {renderContent(content.children, level + 1)}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n );\n };\n\n const renderContentItem = (content: DescriptionItem) => {\n if (content.type === \"image\") {\n return (\n <img\n src={content.content}\n alt={content.alt || \"\"}\n className=\"oui-my-2 oui-h-auto oui-max-w-full\"\n />\n );\n }\n\n // Both markdown and text use the rich text parser\n return (\n <div className=\"rich-text-content inline\">\n {parseRichText(content.content)}\n </div>\n );\n };\n\n return (\n <div\n className={cn(\n \"oui-text-sm oui-font-semibold oui-leading-[28px] oui-text-base-contrast-54\",\n )}\n >\n {renderContent(description)}\n </div>\n );\n};\n\n// Alternative: React-markdown implementation (requires additional dependencies)\nexport const MarkdownDescriptionContent: FC<{\n description: DescriptionItem[] | ReadonlyArray<DescriptionItem>;\n}> = ({ description }) => {\n const renderContent = (\n contents: DescriptionItem[] | ReadonlyArray<DescriptionItem>,\n ) => {\n return (\n <ul className=\"oui-list-inside oui-list-disc\">\n {contents.map((content, index) => (\n <li key={`${content.content}-${index}`} className={content.className}>\n {content.type === \"image\" ? (\n <img\n src={content.content}\n alt={content.alt || \"\"}\n className=\"oui-my-2 oui-h-auto oui-max-w-full\"\n />\n ) : (\n <div>{content.content}</div>\n )}\n {Array.isArray(content?.children) &&\n content?.children.length > 0 && (\n <div className=\"oui-ml-4\">\n {renderContent(content.children)}\n </div>\n )}\n </li>\n ))}\n </ul>\n );\n };\n\n return (\n <div\n className={cn(\n \"oui-text-sm oui-font-semibold oui-leading-[28px] oui-text-base-contrast-54\",\n )}\n >\n {renderContent(description)}\n </div>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport { LeaderboardTitle } from \"../../pages/leaderboard/page\";\nimport { DescriptionContent, DescriptionItem } from \"./description\";\n\ntype TermsUIProps = {\n className?: string;\n isMobile?: boolean;\n termsConfig?: DescriptionItem[];\n};\n\nexport const CampaignTermsUI: FC<TermsUIProps> = ({\n className,\n isMobile,\n termsConfig,\n}) => {\n const { t } = useTranslation();\n return (\n <div className={cn(\"oui-mx-auto oui-max-w-[992px] oui-py-10\", className)}>\n <LeaderboardTitle\n isMobile={isMobile}\n title={t(\"tradingLeaderboard.termsAndConditions\")}\n />\n <DescriptionContent description={termsConfig || EMPTY_LIST} />\n </div>\n );\n};\n"]}