diff --git a/src/hooks/useKeyDiscoveryLeaderboard.ts b/src/hooks/useKeyDiscoveryLeaderboard.ts new file mode 100644 index 00000000..33a98e8c --- /dev/null +++ b/src/hooks/useKeyDiscoveryLeaderboard.ts @@ -0,0 +1,29 @@ +import { useQuery } from '@tanstack/react-query'; +import { queryKeys } from '@/lib/queryKeys'; +import { + analyticsService, + type LeaderboardMetric, + type KeyLeaderboardEntry, +} from '@/services/analytics.service'; + +export interface UseKeyDiscoveryLeaderboardOptions { + enabled?: boolean; + refetchInterval?: number | false; +} + +/** + * Hook to fetch top performing creator keys discovery leaderboard (#1206). + * Ranked by volume, holders, or reputation score. + */ +export function useKeyDiscoveryLeaderboard( + metric: LeaderboardMetric = 'volume', + options: UseKeyDiscoveryLeaderboardOptions = {} +) { + return useQuery({ + queryKey: queryKeys.keyLeaderboard.byMetric(metric), + queryFn: () => analyticsService.getKeyDiscoveryLeaderboard(metric), + enabled: options.enabled ?? true, + refetchInterval: options.refetchInterval ?? false, + staleTime: 30_000, + }); +} diff --git a/src/lib/queryKeys.ts b/src/lib/queryKeys.ts index 35e74288..3473c9d0 100644 --- a/src/lib/queryKeys.ts +++ b/src/lib/queryKeys.ts @@ -9,7 +9,10 @@ import type { GetCoursesParams } from '@/services/course.service'; import type { VolumeWindow } from '@/services/leaderboard.service'; -import type { ProtocolTimeRange } from '@/services/analytics.service'; +import type { + ProtocolTimeRange, + LeaderboardMetric, +} from '@/services/analytics.service'; export const queryKeys = { creatorProfile: { @@ -224,6 +227,11 @@ export const queryKeys = { data: (range: ProtocolTimeRange = '30d') => ['protocolAnalytics', 'data', range] as const, }, + keyLeaderboard: { + all: () => ['analytics', 'keys', 'leaderboard'] as const, + byMetric: (metric: LeaderboardMetric = 'volume') => + ['analytics', 'keys', 'leaderboard', metric] as const, + }, creatorRevenue: { all: () => ['creatorRevenue'] as const, summary: (creatorId: string) => diff --git a/src/pages/DiscoveryPage.tsx b/src/pages/DiscoveryPage.tsx index b1c5219a..8ebc1a80 100644 --- a/src/pages/DiscoveryPage.tsx +++ b/src/pages/DiscoveryPage.tsx @@ -1,5 +1,5 @@ import { Link } from 'react-router'; -import { ArrowRight, RefreshCw, Flame, Sparkles, Layers } from 'lucide-react'; +import { ArrowRight, RefreshCw, Flame, Sparkles, Layers, Trophy } from 'lucide-react'; import { useDocumentTitle } from '@/hooks/useDocumentTitle'; import { useNavigationTiming } from '@/hooks/useNavigationTiming'; import { useKeyDiscovery } from '@/hooks/useKeyDiscovery'; @@ -110,6 +110,15 @@ export default function DiscoveryPage() { )} + + +