// Copyright: © 2026 TWWIM UG. All rights reserved. (www.twwim.com) /** * TanStack Query hooks for the Communication Center. * Single source of truth = customer-api; mock data is gone. */ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { conversationsApi, type ListFilter } from '@/infrastructure/http/api/conversations/api'; import { useVisibilityRefetch } from './useVisibilityRefetch'; const KEY = { list: (f: ListFilter) => ['conversations', 'list', f] as const, detail: (id: string) => ['conversations', 'detail', id] as const, counts: (tenantId?: string) => ['conversations', 'counts', tenantId] as const, }; const INBOX_POLL_MS = 5_000; const DETAIL_POLL_MS = 3_000; export function useConversationsList(filter: ListFilter) { const isVisible = useVisibilityRefetch(); return useQuery({ queryKey: KEY.list(filter), queryFn: () => conversationsApi.listConversations(filter), refetchInterval: isVisible ? INBOX_POLL_MS : false, refetchOnWindowFocus: true, }); } export function useQueueCounts(tenantId?: string) { const isVisible = useVisibilityRefetch(); return useQuery({ queryKey: KEY.counts(tenantId), queryFn: () => conversationsApi.queueCounts(tenantId), refetchInterval: isVisible ? INBOX_POLL_MS : false, refetchOnWindowFocus: true, }); } export function useConversationDetail(id: string | null) { const isVisible = useVisibilityRefetch(); return useQuery({ queryKey: id ? KEY.detail(id) : ['conversations', 'detail', 'none'], queryFn: () => conversationsApi.getConversation(id as string), enabled: !!id, refetchInterval: isVisible && id ? DETAIL_POLL_MS : false, refetchOnWindowFocus: true, }); } export function useInterceptMutation() { const qc = useQueryClient(); return useMutation({ mutationFn: (id: string) => conversationsApi.intercept(id), onSuccess: (detail) => { qc.invalidateQueries({ queryKey: ['conversations', 'list'] }); qc.invalidateQueries({ queryKey: ['conversations', 'counts'] }); qc.setQueryData(KEY.detail(detail.id), detail); }, }); } export function useReleaseMutation() { const qc = useQueryClient(); return useMutation({ mutationFn: (id: string) => conversationsApi.release(id), onSuccess: (detail) => { qc.invalidateQueries({ queryKey: ['conversations', 'list'] }); qc.invalidateQueries({ queryKey: ['conversations', 'counts'] }); qc.setQueryData(KEY.detail(detail.id), detail); }, }); } export function useSendMessageMutation() { const qc = useQueryClient(); return useMutation({ mutationFn: ({ id, content }: { id: string; content: string }) => conversationsApi.sendMessage(id, content), onSuccess: (detail) => { qc.invalidateQueries({ queryKey: ['conversations', 'list'] }); qc.invalidateQueries({ queryKey: ['conversations', 'counts'] }); qc.setQueryData(KEY.detail(detail.id), detail); }, }); } export function useCloseMutation() { const qc = useQueryClient(); return useMutation({ mutationFn: (id: string) => conversationsApi.close(id), onSuccess: (detail) => { qc.invalidateQueries({ queryKey: ['conversations', 'list'] }); qc.invalidateQueries({ queryKey: ['conversations', 'counts'] }); qc.setQueryData(KEY.detail(detail.id), detail); }, }); } export function useMarkSeenMutation() { const qc = useQueryClient(); return useMutation({ mutationFn: (id: string) => conversationsApi.markSeen(id), onSuccess: (_, id) => { qc.invalidateQueries({ queryKey: ['conversations', 'list'] }); qc.invalidateQueries({ queryKey: ['conversations', 'counts'] }); qc.invalidateQueries({ queryKey: KEY.detail(id) }); }, }); }