From a58b7459fb7a0499676a3f6a60eb9c5cf16b4de9 Mon Sep 17 00:00:00 2001
From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com>
Date: Sat, 2 May 2026 18:03:12 +0200
Subject: [PATCH] fix(web): in-session pause/resume preserves File ref; aborted
transfers flip bubble to failed
---
packages/web/src/components/chat/Message.tsx | 9 +++++++-
.../web/src/stores/pendingMessageRehydrate.ts | 17 ++++++++++++++
packages/web/src/stores/transferStore.ts | 23 +++++++++++++++----
3 files changed, 44 insertions(+), 5 deletions(-)
diff --git a/packages/web/src/components/chat/Message.tsx b/packages/web/src/components/chat/Message.tsx
index 61b0dfb8..fc7c27e3 100644
--- a/packages/web/src/components/chat/Message.tsx
+++ b/packages/web/src/components/chat/Message.tsx
@@ -132,6 +132,13 @@ export function Message({ message, isCompact, isFirstInGroup, previousMessageId
const pending = isPendingMessage(message) ? message.__pending : null;
const showInteractions = !pending;
+ const transfersForRow = useTransferStore((s) => s.transfers);
+ const anyTransferTerminallyBad = !!pending && pending.transferIds.some((tid) => {
+ const t = transfersForRow.get(tid);
+ return t && (t.state === 'failed' || t.state === 'aborted');
+ });
+ const showRetryDiscardRow = pending?.state === 'failed' || anyTransferTerminallyBad;
+
const channelKey: string = isPendingMessage(message)
? message.channelId || message.dmChannelId || ''
: message.channelId || (message as MessageWithUser & { dmChannelId?: string }).dmChannelId || '';
@@ -503,7 +510,7 @@ export function Message({ message, isCompact, isFirstInGroup, previousMessageId
)}
{/* Failed-state retry/discard row */}
- {pending?.state === 'failed' && (
+ {showRetryDiscardRow && pending && (