import { useMutation, useQueryClient } from "@tanstack/react-query"; import { api } from "../api"; import { inboxKeys } from "./queries"; import { useWorkspaceId } from "../hooks"; import type { InboxItem } from "../types"; export function useMarkInboxRead() { const qc = useQueryClient(); const wsId = useWorkspaceId(); return useMutation({ mutationFn: (id: string) => api.markInboxRead(id), onMutate: async (id) => { await qc.cancelQueries({ queryKey: inboxKeys.list(wsId) }); const prev = qc.getQueryData(inboxKeys.list(wsId)); qc.setQueryData(inboxKeys.list(wsId), (old) => old?.map((item) => (item.id === id ? { ...item, read: true } : item)), ); return { prev }; }, onError: (_err, _id, ctx) => { if (ctx?.prev) qc.setQueryData(inboxKeys.list(wsId), ctx.prev); }, onSettled: () => { qc.invalidateQueries({ queryKey: inboxKeys.list(wsId) }); }, }); } export function useArchiveInbox() { const qc = useQueryClient(); const wsId = useWorkspaceId(); return useMutation({ mutationFn: (id: string) => api.archiveInbox(id), onMutate: async (id) => { await qc.cancelQueries({ queryKey: inboxKeys.list(wsId) }); const prev = qc.getQueryData(inboxKeys.list(wsId)); // Archive all items for the same issue (same behavior as store) const target = prev?.find((i) => i.id === id); const issueId = target?.issue_id; qc.setQueryData(inboxKeys.list(wsId), (old) => old?.map((item) => item.id === id || (issueId && item.issue_id === issueId) ? { ...item, archived: true } : item, ), ); return { prev }; }, onError: (_err, _id, ctx) => { if (ctx?.prev) qc.setQueryData(inboxKeys.list(wsId), ctx.prev); }, onSettled: () => { qc.invalidateQueries({ queryKey: inboxKeys.list(wsId) }); }, }); } export function useMarkAllInboxRead() { const qc = useQueryClient(); const wsId = useWorkspaceId(); return useMutation({ mutationFn: () => api.markAllInboxRead(), onMutate: async () => { await qc.cancelQueries({ queryKey: inboxKeys.list(wsId) }); const prev = qc.getQueryData(inboxKeys.list(wsId)); qc.setQueryData(inboxKeys.list(wsId), (old) => old?.map((item) => !item.archived ? { ...item, read: true } : item, ), ); return { prev }; }, onError: (_err, _vars, ctx) => { if (ctx?.prev) qc.setQueryData(inboxKeys.list(wsId), ctx.prev); }, onSettled: () => { qc.invalidateQueries({ queryKey: inboxKeys.list(wsId) }); }, }); } export function useArchiveAllInbox() { const qc = useQueryClient(); const wsId = useWorkspaceId(); return useMutation({ mutationFn: () => api.archiveAllInbox(), onSettled: () => { qc.invalidateQueries({ queryKey: inboxKeys.list(wsId) }); }, }); } export function useArchiveAllReadInbox() { const qc = useQueryClient(); const wsId = useWorkspaceId(); return useMutation({ mutationFn: () => api.archiveAllReadInbox(), onSettled: () => { qc.invalidateQueries({ queryKey: inboxKeys.list(wsId) }); }, }); } export function useArchiveCompletedInbox() { const qc = useQueryClient(); const wsId = useWorkspaceId(); return useMutation({ mutationFn: () => api.archiveCompletedInbox(), onSettled: () => { qc.invalidateQueries({ queryKey: inboxKeys.list(wsId) }); }, }); }