diff --git a/lib/puzzles.ts b/lib/puzzles.ts index 5c1a4b5..158a41d 100644 --- a/lib/puzzles.ts +++ b/lib/puzzles.ts @@ -85,6 +85,7 @@ export type Puzzle = { content: string; scoreMax: number; tags: Tag[] | null; + tries?: number; score?: number; }; diff --git a/ui/Leaderboard.tsx b/ui/Leaderboard.tsx index a79c6b2..eafe411 100644 --- a/ui/Leaderboard.tsx +++ b/ui/Leaderboard.tsx @@ -5,46 +5,67 @@ import { cn } from '@/lib/utils'; import { useMemo, useState } from 'react'; import AvatarComponent from './Avatar'; import Select from './Select'; +import { type ScoreEvent } from '@/lib/leaderboard'; +import useSWRSubscription, { type SWRSubscription } from 'swr/subscription'; +import { useGroups } from '@/lib/hooks/use-groups'; const SCORE_COLORS = ['text-yellow-400', 'text-gray-400', 'text-orange-400']; export default function Leaderboard({ token }: { token: string }) { - const { data, isLoading } = useLeaderboard({ token }); + // const { data, isLoading } = useLeaderboard({ token }); + + const subscription: SWRSubscription = (key, { next }) => { + const socket = new WebSocket(key); + + socket.addEventListener('message', (event) => { + next(null, JSON.parse(event.data)); + }); + + socket.addEventListener('error', (event) => { + console.error(event); + }); + + return () => socket.close(); + }; + + const { data } = useSWRSubscription( + `wss://${process.env.NEXT_PUBLIC_API_URL?.split('//')[1]}/rleaderboard`, + subscription + ); const [filter, setFilter] = useState(''); let options = [] as { value: string; title: string }[]; - if (data) { - options = data - .filter((score) => score.groups && score.groups.length > 0) - .map((score) => score.groups.map((group) => ({ value: group.name, title: group.name }))) - .flat() + const { data: groups } = useGroups({ token }); + + if (groups) { + options = groups + .filter((group) => !group.chapter) + .map((group) => ({ value: group.name, title: group.name })) .filter((group, index, self) => self.findIndex((g) => g.value === group.value) === index) .sort((a, b) => a.title.localeCompare(b.title)); options.unshift({ value: '', title: 'Tous' }); - options.push({ value: 'no-group', title: 'Sans groupe' }); } const filteredData = useMemo(() => { if (filter) { - if (filter === 'no-group') { - return data?.filter((score) => !score.groups || score.groups.length === 0); - } - return data?.filter((score) => score.groups?.find((group) => group.name === filter)); + return data?.groups.filter((group) => group.name === filter); } return data; }, [data, filter]); + console.log(filteredData); + return (

Tableau des scores

-

Suivez la progression des élèves en direct

+

Suivez la progression des élèves en direct

- {(filteredData && ( + {/* {(filteredData && ( ( + a: ({ ...props }) => ( ), code: ({ ...props }) => ( - ) }}