"use client"; import { Hash, Search, Sparkles, TrendingUp } from "lucide-react"; import { useEffect, useState } from "react"; import { useAmbient } from "@/components/ambient/ambient-context"; import { Avatar, Badge, GlassPanel, Input } from "@/components/primitives"; import { EmptyState, SectionHeader, SkeletonRows } from "@/components/shared"; import { useChannels, useMessageSearch, useTopReactors } from "@/hooks"; import { aiTone } from "@/lib/ai-status"; import { formatDuration, getMessageChannelLabel, renderMessageContent, } from "@/lib/format"; export function AnalysisView() { const [query, setQuery] = useState(""); const search = useMessageSearch(query, query.trim().length >= 2); const { data: reactors } = useTopReactors(); const { data: channels } = useChannels(); const ambient = useAmbient(); useEffect(() => { ambient.set( query ? "amber" : "signal", 0.3, query ? "analyzing" : "search", ); }, [query, ambient]); return (
Semantic search

Search the archive

setQuery(e.target.value)} autoFocus />
{query.trim().length > 0 && query.trim().length < 2 && (
Type at least 2 characters…
)}
{(search.data ?? []).length} } /> {query.trim().length >= 2 && search.isLoading && ( )} {(search.data ?? []).length === 0 ? ( } title="No matches yet" description="Run a search to surface messages across the guild." /> ) : (
{(search.data ?? []).map((m) => (
{m.username} {getMessageChannelLabel(m)} {m.ai_status && ( {m.ai_analysis_duration_ms && m.ai_analysis_duration_ms > 0 ? `${m.ai_status} · ${formatDuration(m.ai_analysis_duration_ms)}` : m.ai_status} )}
{renderMessageContent(m.content, m.metadata) || "(embed)"}
))}
)}
Top reactors } />
{(reactors ?? []).slice(0, 6).map((r, i) => { const maxNet = reactors?.[0]?.net_count || 1; const pct = Math.max( 4, Math.round((r.net_count / maxNet) * 100), ); return (
{i + 1} {r.username}
+{r.net_count}
); })} {(reactors ?? []).length === 0 && (
No data
)}
Top channels } />
{(channels ?? []).slice(0, 6).map((c) => (
{c.channel_name ?? c.channel_id.slice(0, 8)} {c.total_messages}
))} {(channels ?? []).length === 0 && (
No data
)}
); }