feat(inbox): add "Unread" filter to conversation list

Adds an "Unread" option to the Inbox conversation-list filter dropdown,
showing only conversations with unread messages (unread_count > 0).

Closes #233

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Arnas Donauskas 2026-06-17 13:40:06 +03:00
parent 6c5cfdd377
commit 66a5bb51d2
No known key found for this signature in database

View File

@ -36,8 +36,11 @@ const STATUS_COLORS: Record<ConversationStatus, string> = {
closed: "bg-muted-foreground",
};
const FILTER_OPTIONS: { label: string; value: ConversationStatus | "all" }[] = [
type InboxFilter = ConversationStatus | "all" | "unread";
const FILTER_OPTIONS: { label: string; value: InboxFilter }[] = [
{ label: "All", value: "all" },
{ label: "Unread", value: "unread" },
{ label: "Open", value: "open" },
{ label: "Pending", value: "pending" },
{ label: "Closed", value: "closed" },
@ -51,7 +54,7 @@ export function ConversationList({
resyncToken = 0,
}: ConversationListProps) {
const [search, setSearch] = useState("");
const [filter, setFilter] = useState<ConversationStatus | "all">("all");
const [filter, setFilter] = useState<InboxFilter>("all");
const [loading, setLoading] = useState(true);
// Keep the latest callback in a ref so the fetch effect below can
@ -110,7 +113,9 @@ export function ConversationList({
const filtered = useMemo(() => {
let result = conversations;
if (filter !== "all") {
if (filter === "unread") {
result = result.filter((c) => c.unread_count > 0);
} else if (filter !== "all") {
result = result.filter((c) => c.status === filter);
}