From 7cf6be651538acd3a7d09fa24d7a09dc471e9eed Mon Sep 17 00:00:00 2001 From: Codex Date: Mon, 9 Mar 2026 13:42:58 +0300 Subject: [PATCH] web: add multi-message forward from selection --- web/src/components/MessageList.tsx | 54 ++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/web/src/components/MessageList.tsx b/web/src/components/MessageList.tsx index 5c238a3..ce8638e 100644 --- a/web/src/components/MessageList.tsx +++ b/web/src/components/MessageList.tsx @@ -63,7 +63,7 @@ export function MessageList() { const showToast = useUiStore((s) => s.showToast); const [ctx, setCtx] = useState(null); - const [forwardMessageId, setForwardMessageId] = useState(null); + const [forwardMessageIds, setForwardMessageIds] = useState([]); const [forwardQuery, setForwardQuery] = useState(""); const [forwardError, setForwardError] = useState(null); const [isForwarding, setIsForwarding] = useState(false); @@ -169,7 +169,7 @@ export function MessageList() { return; } setCtx(null); - setForwardMessageId(null); + setForwardMessageIds([]); setForwardSelectedChatIds(new Set()); setDeleteMessageId(null); setSelectedIds(new Set()); @@ -184,7 +184,7 @@ export function MessageList() { setSelectedIds(new Set()); setCtx(null); setDeleteMessageId(null); - setForwardMessageId(null); + setForwardMessageIds([]); setForwardSelectedChatIds(new Set()); setForwardIncludeAuthor(true); if (activeChatId) { @@ -337,7 +337,7 @@ export function MessageList() { } async function handleForwardSubmit() { - if (!forwardMessageId) return; + if (!forwardMessageIds.length) return; const targetChatIds = [...forwardSelectedChatIds]; if (!targetChatIds.length) { setForwardError("Select at least one chat"); @@ -346,11 +346,14 @@ export function MessageList() { setIsForwarding(true); setForwardError(null); try { - await forwardMessageBulk(forwardMessageId, targetChatIds, forwardIncludeAuthor); - setForwardMessageId(null); + await Promise.all( + forwardMessageIds.map((messageId) => forwardMessageBulk(messageId, targetChatIds, forwardIncludeAuthor)) + ); + setForwardMessageIds([]); setForwardSelectedChatIds(new Set()); setForwardIncludeAuthor(true); setForwardQuery(""); + setSelectedIds(new Set()); } catch { setForwardError("Failed to forward message"); } finally { @@ -359,6 +362,17 @@ export function MessageList() { setCtx(null); } + function openForwardDialog(messageIds: number[]) { + if (!messageIds.length) { + return; + } + setForwardMessageIds([...new Set(messageIds)]); + setForwardQuery(""); + setForwardError(null); + setForwardSelectedChatIds(new Set()); + setForwardIncludeAuthor(true); + } + async function handlePin(messageId: number) { const nextPinned = activeChat?.pinned_message_id === messageId ? null : messageId; const chat = await pinMessage(chatId, nextPinned); @@ -493,6 +507,12 @@ export function MessageList() {
{selectedIds.size} selected
+ {!channelOnlyDeleteForAll ? ( ) : null} - -