fix(voice): proper shadcn select dropdowns + top reactors leaderboard

- ui/select: trigger default w-full h-9 (was w-fit h-8 — selects rendered
  tiny/misaligned); callers keep size override via className
- VoiceConnectionCard: labeled full-width h-10 selects (Server/Guild +
  Voice Channel), guild icon + name in options, channel type icon +
  'no akses' tag, empty states, htmlFor/id a11y wiring
- GuildSelector sidebar + messages channel filter bumped to match
- Backend GET /api/dashboard/reactors: top users by net reactions given
  (adds-removes) + messages_reacted + emojis_used
- Reactions tab: second 'Top reaktor' leaderboard panel
This commit is contained in:
asepharyana
2026-08-05 11:29:56 +07:00
parent f999be4fa0
commit 9a2fa999bf
12 changed files with 288 additions and 110 deletions
@@ -1,6 +1,6 @@
"use client";
import { AlertCircle, RefreshCw } from "lucide-react";
import { AlertCircle, RefreshCw, Server } from "lucide-react";
import { useEffect, useRef } from "react";
import { Badge } from "@/components/ui/badge";
@@ -93,7 +93,7 @@ export function GuildSelector({
Guild
</Badge>
<Select value={value} onValueChange={(v) => v && onChange(v)}>
<SelectTrigger className="h-8 w-full max-w-xs">
<SelectTrigger className="h-10 w-full max-w-sm">
<SelectValue placeholder="Select a guild…">
{guilds.find((g) => g.id === value)?.name}
</SelectValue>
@@ -101,7 +101,19 @@ export function GuildSelector({
<SelectContent>
{guilds.map((g) => (
<SelectItem key={g.id} value={g.id}>
{g.name}
<span className="flex items-center gap-2">
{g.icon ? (
// biome-ignore lint/performance/noImgElement: guild icon is a remote Discord CDN URL
<img
src={g.icon}
alt=""
className="size-4 rounded-full object-cover"
/>
) : (
<Server className="size-4 text-muted-foreground" />
)}
<span className="line-clamp-1">{g.name}</span>
</span>
</SelectItem>
))}
</SelectContent>