diff --git a/client/src/app/providers/SseProvider.tsx b/client/src/app/providers/SseProvider.tsx index c0258ad..0d16a73 100644 --- a/client/src/app/providers/SseProvider.tsx +++ b/client/src/app/providers/SseProvider.tsx @@ -21,6 +21,14 @@ export function SseProvider() { const es = createEventStream(token) sourceRef.current = es + function invalidateOrderQueries(orderId: unknown) { + if (!orderId) return + queryClient.invalidateQueries({ queryKey: ['me', 'orders', orderId] }) + queryClient.invalidateQueries({ queryKey: ['admin', 'orders', 'detail', orderId] }) + queryClient.invalidateQueries({ queryKey: ['admin', 'orders'] }) + queryClient.invalidateQueries({ queryKey: ['admin', 'orders', 'summary'] }) + } + function handleEvent(eventName: string) { return function (event: MessageEvent) { try { @@ -31,22 +39,13 @@ export function SseProvider() { case 'message:new': queryClient.invalidateQueries({ queryKey: ['me', 'messages', 'unread-count'] }) queryClient.invalidateQueries({ queryKey: ['me', 'conversations'] }) - if (orderId) { - queryClient.invalidateQueries({ queryKey: ['me', 'orders', orderId] }) - queryClient.invalidateQueries({ queryKey: ['admin', 'orders', orderId] }) - } + invalidateOrderQueries(orderId) break case 'order:statusChanged': - if (orderId) { - queryClient.invalidateQueries({ queryKey: ['me', 'orders', orderId] }) - queryClient.invalidateQueries({ queryKey: ['admin', 'orders', orderId] }) - } + invalidateOrderQueries(orderId) break case 'order:updated': - if (orderId) { - queryClient.invalidateQueries({ queryKey: ['me', 'orders', orderId] }) - queryClient.invalidateQueries({ queryKey: ['admin', 'orders', orderId] }) - } + invalidateOrderQueries(orderId) break case 'order:new': queryClient.invalidateQueries({ queryKey: ['admin', 'orders', 'summary'] }) diff --git a/client/src/app/providers/__tests__/SseProvider.test.tsx b/client/src/app/providers/__tests__/SseProvider.test.tsx index c9f55c4..3da6488 100644 --- a/client/src/app/providers/__tests__/SseProvider.test.tsx +++ b/client/src/app/providers/__tests__/SseProvider.test.tsx @@ -108,7 +108,9 @@ describe('SseProvider', () => { expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['me', 'messages', 'unread-count'] }) expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['me', 'conversations'] }) expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['me', 'orders', 'o1'] }) - expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'o1'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'detail', 'o1'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'summary'] }) }) it('invalidates order queries on order:statusChanged', () => { @@ -117,7 +119,9 @@ describe('SseProvider', () => { const handler = mockEventHandlers['order:statusChanged'] handler(new MessageEvent('order:statusChanged', { data: JSON.stringify({ orderId: 'o2' }) })) expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['me', 'orders', 'o2'] }) - expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'o2'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'detail', 'o2'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'summary'] }) }) it('invalidates order queries on order:updated', () => { @@ -126,7 +130,9 @@ describe('SseProvider', () => { const handler = mockEventHandlers['order:updated'] handler(new MessageEvent('order:updated', { data: JSON.stringify({ orderId: 'o3' }) })) expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['me', 'orders', 'o3'] }) - expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'o3'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'detail', 'o3'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders'] }) + expect(mockInvalidateQueries).toHaveBeenCalledWith({ queryKey: ['admin', 'orders', 'summary'] }) }) it('invalidates admin queries on order:new', () => { diff --git a/client/src/features/order-detail/ui/OrderDetailContent.tsx b/client/src/features/order-detail/ui/OrderDetailContent.tsx index 357cfc1..ca19b9f 100644 --- a/client/src/features/order-detail/ui/OrderDetailContent.tsx +++ b/client/src/features/order-detail/ui/OrderDetailContent.tsx @@ -215,7 +215,7 @@ export function OrderDetailContent({ detail, orderId }: { detail: AdminOrderDeta /> ) return ( - + {isAdminMsg ? 'Админ (вы)' : 'Пользователь'} · {new Date(m.createdAt).toLocaleString()} diff --git a/client/src/features/order-detail/ui/__tests__/OrderDetailContent.test.tsx b/client/src/features/order-detail/ui/__tests__/OrderDetailContent.test.tsx index 9887403..385261f 100644 --- a/client/src/features/order-detail/ui/__tests__/OrderDetailContent.test.tsx +++ b/client/src/features/order-detail/ui/__tests__/OrderDetailContent.test.tsx @@ -1,3 +1,4 @@ +import type { ReactNode } from 'react' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { render, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' @@ -29,6 +30,12 @@ vi.mock('@/shared/ui/RichTextMessageEditor.lazy', () => ({ }) =>