feat: implement real-time leaderboard system with XP and voice channel tracking features

This commit is contained in:
2026-07-25 21:26:53 +07:00 Unverified
parent bb6740fcee
commit 3f4b670170
18 changed files with 531 additions and 178 deletions
+7 -2
View File
@@ -32,11 +32,13 @@ type LeaderboardBoardProps =
| {
kind: "xp";
data: LeaderboardPage<XpLeaderboardRow>;
searchQuery: string;
channelId?: never;
}
| {
kind: "vc";
data: LeaderboardPage<VoiceLeaderboardRow>;
searchQuery: string;
channelId?: string;
};
@@ -115,7 +117,7 @@ function Podium({ data }: LeaderboardBoardProps) {
}
export function LeaderboardBoard(props: LeaderboardBoardProps) {
const { kind, data, channelId } = props;
const { kind, data, channelId, searchQuery } = props;
const firstRow = data.totalRows === 0
? 0
: (data.page - 1) * data.pageSize + 1;
@@ -133,7 +135,9 @@ export function LeaderboardBoard(props: LeaderboardBoardProps) {
<CardDescription>
{data.totalRows > 0
? `แสดง ${firstRow}–${lastRow} จาก ${formatInteger(String(data.totalRows))} คน`
: "ยังไม่มีข้อมูลในขอบเขตนี้"}
: searchQuery
? "ไม่พบสมาชิกที่ตรงกับคำค้นหานี้"
: "ยังไม่มีข้อมูลในขอบเขตนี้"}
</CardDescription>
</CardHeader>
<CardContent className="px-0">
@@ -181,6 +185,7 @@ export function LeaderboardBoard(props: LeaderboardBoardProps) {
page={data.page}
totalPages={data.totalPages}
channelId={channelId}
searchQuery={searchQuery}
/>
</CardFooter>
</Card>