chore: optimize code
This commit is contained in:
@@ -238,7 +238,7 @@ func (a *App) handleDeleteMailLabel(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer tx.Rollback()
|
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")
|
respondError(w, http.StatusInternalServerError, "failed to remove label associations")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -239,9 +239,14 @@ export function MailPage() {
|
|||||||
mutationFn: (id: string) => api.deleteLabel(id),
|
mutationFn: (id: string) => api.deleteLabel(id),
|
||||||
onMutate: async (id) => {
|
onMutate: async (id) => {
|
||||||
await qc.cancelQueries({ queryKey: ["labels"] })
|
await qc.cancelQueries({ queryKey: ["labels"] })
|
||||||
|
await qc.cancelQueries({ queryKey: ["messages"] })
|
||||||
|
if (selectedId) await qc.cancelQueries({ queryKey: ["message", selectedId] })
|
||||||
const prevLabels = qc.getQueryData<ListResponse<MailLabel>>(["labels", activeMailboxId])
|
const prevLabels = qc.getQueryData<ListResponse<MailLabel>>(["labels", activeMailboxId])
|
||||||
|
const prevMessage = selectedId ? qc.getQueryData<MailMessage>(["message", selectedId]) : undefined
|
||||||
qc.setQueryData<ListResponse<MailLabel>>(["labels", activeMailboxId], (current) => current ? { ...current, items: (current.items || []).filter((l) => l.id !== id) } : current)
|
qc.setQueryData<ListResponse<MailLabel>>(["labels", activeMailboxId], (current) => current ? { ...current, items: (current.items || []).filter((l) => l.id !== id) } : current)
|
||||||
return { prevLabels }
|
if (selectedId) qc.setQueryData<MailMessage>(["message", selectedId], (current) => current ? { ...current, labels: (current.labels || []).filter((l) => l.id !== id) } : current)
|
||||||
|
qc.setQueriesData<InfiniteData<MailListResponse>>({ 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) => {
|
onSuccess: (_data, id) => {
|
||||||
if (mailView === "label" && selectedLabelId === id) {
|
if (mailView === "label" && selectedLabelId === id) {
|
||||||
@@ -253,6 +258,8 @@ export function MailPage() {
|
|||||||
},
|
},
|
||||||
onError: (_error, _id, context) => {
|
onError: (_error, _id, context) => {
|
||||||
if (context?.prevLabels) qc.setQueryData(["labels", activeMailboxId], context.prevLabels)
|
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: "删除标签失败" })
|
toast({ title: "删除标签失败" })
|
||||||
},
|
},
|
||||||
onSettled: () => { qc.invalidateQueries({ queryKey: ["labels"] }); qc.invalidateQueries({ queryKey: ["messages"] }) },
|
onSettled: () => { qc.invalidateQueries({ queryKey: ["labels"] }); qc.invalidateQueries({ queryKey: ["messages"] }) },
|
||||||
@@ -667,11 +674,9 @@ export function MailPage() {
|
|||||||
<SidebarGroupLabel className="m-0 p-0">标签</SidebarGroupLabel>
|
<SidebarGroupLabel className="m-0 p-0">标签</SidebarGroupLabel>
|
||||||
{canManageLabels && (
|
{canManageLabels && (
|
||||||
<div className="flex items-center gap-0.5">
|
<div className="flex items-center gap-0.5">
|
||||||
{labelEditMode && (
|
<Button type="button" variant="ghost" size="icon" className="h-5 w-5" onClick={() => { setNewLabelEditing(true); setLabelEditMode(true) }}>
|
||||||
<Button type="button" variant="ghost" size="icon" className="h-5 w-5" onClick={() => setNewLabelEditing(true)}>
|
|
||||||
<Plus className="h-3.5 w-3.5" />
|
<Plus className="h-3.5 w-3.5" />
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
|
||||||
{labelItems.length > 0 && (
|
{labelItems.length > 0 && (
|
||||||
<Button type="button" variant="ghost" size="icon" className="h-5 w-5" onClick={() => setLabelEditMode((v) => !v)}>
|
<Button type="button" variant="ghost" size="icon" className="h-5 w-5" onClick={() => setLabelEditMode((v) => !v)}>
|
||||||
{labelEditMode ? <Check className="h-3 w-3" /> : <Pencil className="h-3 w-3" />}
|
{labelEditMode ? <Check className="h-3 w-3" /> : <Pencil className="h-3 w-3" />}
|
||||||
|
|||||||
Reference in New Issue
Block a user