From 8fcfd60ff599385cf8db1e622d9542b6456875ea Mon Sep 17 00:00:00 2001 From: benya Date: Sun, 8 Mar 2026 11:34:45 +0300 Subject: [PATCH] feat(web): improve archive chats UX - keep archived list synced while browsing chats - add archived entry in All tab with unread count-like badge - show loading/empty states in Archived tab --- web/src/components/ChatList.tsx | 41 +++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/web/src/components/ChatList.tsx b/web/src/components/ChatList.tsx index 9b0260b..a0b4667 100644 --- a/web/src/components/ChatList.tsx +++ b/web/src/components/ChatList.tsx @@ -24,6 +24,7 @@ export function ChatList() { const [archivedChats, setArchivedChats] = useState([]); const [searchLoading, setSearchLoading] = useState(false); const [tab, setTab] = useState<"all" | "people" | "groups" | "channels" | "archived">("all"); + const [archivedLoading, setArchivedLoading] = useState(false); const [ctxChatId, setCtxChatId] = useState(null); const [ctxPos, setCtxPos] = useState<{ x: number; y: number } | null>(null); const [deleteModalChatId, setDeleteModalChatId] = useState(null); @@ -50,11 +51,9 @@ export function ChatList() { }, [loadChats]); useEffect(() => { - if (tab !== "archived") { - return; - } let cancelled = false; void (async () => { + setArchivedLoading(true); try { const rows = await getChats(undefined, true); if (!cancelled) { @@ -64,12 +63,16 @@ export function ChatList() { if (!cancelled) { setArchivedChats([]); } + } finally { + if (!cancelled) { + setArchivedLoading(false); + } } })(); return () => { cancelled = true; }; - }, [tab]); + }, [tab, chats.length]); useEffect(() => { const term = search.trim(); @@ -310,6 +313,36 @@ export function ChatList() { ) : null}
+ {tab === "all" && archivedChats.length > 0 ? ( + + ) : null} + + {tab === "archived" && archivedLoading ? ( +

Loading archived chats...

+ ) : null} + {tab === "archived" && !archivedLoading && archivedChats.length === 0 ? ( +

Archive is empty

+ ) : null} + {visibleChats.map((chat) => (