"use client"; import { Hash, Search } from "lucide-react"; import { useCallback, useState } from "react"; import { EmptyState, LoadingSkeleton } from "@/components/shared"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { useChannelDetail, useChannels } from "@/hooks"; import { renderMessageContent } from "@/lib/format"; import type { DashboardChannel } from "@/lib/types"; import { cn } from "@/lib/utils"; export function ChannelsSection({ guildId }: { guildId?: string }) { const [search, setSearch] = useState(""); const [selectedId, setSelectedId] = useState(null); const { data: channels = [], isLoading, error, mutate: refetch, } = useChannels(guildId ?? "", search); const { data: detail } = useChannelDetail(selectedId); const handleSearch = useCallback((v: string) => { setSearch(v); setSelectedId(null); }, []); if (error) { return ( Failed to load channels: {error.message} ); } return (
handleSearch(e.target.value)} className="pl-9 h-9" />
{isLoading ? ( ) : channels.length === 0 ? ( ) : (
{channels.map((channel) => ( ))}
)}
{detail ? (

{detail.channel_name ?? detail.channel_id}

{detail.channel_id}

Messages: {detail.total_messages} Flagged: {detail.flagged_count} Clean: {detail.clean_count}
{detail.culture_summary && (

Culture summary

{detail.culture_summary}

)} {detail.recent_messages.length > 0 && (

Recent messages

{detail.recent_messages.slice(0, 5).map((msg) => (

{msg.username}:{" "} {renderMessageContent(msg.content, msg.metadata) || "(no text content)"}

{new Date(msg.created_at).toLocaleString()}

))}
)}
) : (

Select a channel to see its culture summary and recent messages.

)}
); } function ChannelRow({ channel, active, onSelect, }: { channel: DashboardChannel; active: boolean; onSelect: (id: string) => void; }) { return ( onSelect(channel.channel_id)} >

{channel.channel_name ?? channel.channel_id}

{channel.channel_id}

{channel.total_messages} {channel.flagged_count > 0 && ( {channel.flagged_count} )}
); }