diff --git a/apps/api/internal/app/mail_handlers.go b/apps/api/internal/app/mail_handlers.go index 5076141..a7f4966 100644 --- a/apps/api/internal/app/mail_handlers.go +++ b/apps/api/internal/app/mail_handlers.go @@ -238,7 +238,7 @@ func (a *App) handleDeleteMailLabel(w http.ResponseWriter, r *http.Request) { return } defer tx.Rollback() - if _, err := tx.ExecContext(ctx, "DELETE FROM message_labels WHERE label_id = ? AND EXISTS (SELECT 1 FROM mail_labels WHERE id = ? AND mailbox_id = ?)", labelID, labelID, mb.ID); err != nil { + if _, err := tx.ExecContext(ctx, "DELETE FROM message_labels WHERE label_id = ?", labelID); err != nil { respondError(w, http.StatusInternalServerError, "failed to remove label associations") return } diff --git a/apps/web/src/pages/mail.tsx b/apps/web/src/pages/mail.tsx index 22d822a..32e32e5 100644 --- a/apps/web/src/pages/mail.tsx +++ b/apps/web/src/pages/mail.tsx @@ -239,9 +239,14 @@ export function MailPage() { mutationFn: (id: string) => api.deleteLabel(id), onMutate: async (id) => { await qc.cancelQueries({ queryKey: ["labels"] }) + await qc.cancelQueries({ queryKey: ["messages"] }) + if (selectedId) await qc.cancelQueries({ queryKey: ["message", selectedId] }) const prevLabels = qc.getQueryData>(["labels", activeMailboxId]) + const prevMessage = selectedId ? qc.getQueryData(["message", selectedId]) : undefined qc.setQueryData>(["labels", activeMailboxId], (current) => current ? { ...current, items: (current.items || []).filter((l) => l.id !== id) } : current) - return { prevLabels } + if (selectedId) qc.setQueryData(["message", selectedId], (current) => current ? { ...current, labels: (current.labels || []).filter((l) => l.id !== id) } : current) + qc.setQueriesData>({ queryKey: ["messages"] }, (current) => current ? { ...current, pages: current.pages.map((page) => ({ ...page, items: (page.items || []).map((m) => ({ ...m, labels: (m.labels || []).filter((l) => l.id !== id) })) })) } : current) + return { prevLabels, prevMessage } }, onSuccess: (_data, id) => { if (mailView === "label" && selectedLabelId === id) { @@ -253,6 +258,8 @@ export function MailPage() { }, onError: (_error, _id, context) => { if (context?.prevLabels) qc.setQueryData(["labels", activeMailboxId], context.prevLabels) + if (selectedId && context?.prevMessage) qc.setQueryData(["message", selectedId], context.prevMessage) + qc.invalidateQueries({ queryKey: ["messages"] }) toast({ title: "删除标签失败" }) }, onSettled: () => { qc.invalidateQueries({ queryKey: ["labels"] }); qc.invalidateQueries({ queryKey: ["messages"] }) }, @@ -667,16 +674,14 @@ export function MailPage() { 标签 {canManageLabels && (
- {labelEditMode && ( - - )} - {labelItems.length > 0 && ( - - )} + + {labelItems.length > 0 && ( + + )}
)}