"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
)}
);
}