From 5c414cb484e240cf7f6e0fcbe8aa965e4ef8ba03 Mon Sep 17 00:00:00 2001 From: kilodesodiq-arch Date: Sat, 30 May 2026 19:54:07 +0000 Subject: [PATCH] feat: implement WebSocket real-time updates hook Closes #785 --- frontend/opsce/hooks/useRealtimeUpdates.ts | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 frontend/opsce/hooks/useRealtimeUpdates.ts diff --git a/frontend/opsce/hooks/useRealtimeUpdates.ts b/frontend/opsce/hooks/useRealtimeUpdates.ts new file mode 100644 index 00000000..8977f2d8 --- /dev/null +++ b/frontend/opsce/hooks/useRealtimeUpdates.ts @@ -0,0 +1,67 @@ +'use client'; + +import { useCallback } from 'react'; +import { useQueryClient } from '@tanstack/react-query'; +import { useWebSocket } from '@/hooks/useWebSocket'; +import { useAuthStore } from '@/store/auth.store'; +import { queryKeys } from '@/lib/query/keys'; + +export function useRealtimeUpdates() { + const userId = useAuthStore((s) => s.user?.id); + const queryClient = useQueryClient(); + + const handleEvent = useCallback( + (eventType: string) => { + switch (eventType) { + case 'asset_created': + case 'asset_updated': + case 'asset_deleted': + queryClient.invalidateQueries({ queryKey: queryKeys.assets.lists() }); + break; + + case 'asset_transferred': + queryClient.invalidateQueries({ queryKey: queryKeys.assets.lists() }); + queryClient.invalidateQueries({ queryKey: queryKeys.assets.details() }); + break; + + case 'maintenance_scheduled': + case 'maintenance_completed': + queryClient.invalidateQueries({ queryKey: ['assets', 'detail'] }); + break; + + default: + break; + } + }, + [queryClient], + ); + + const { + isConnected, + notifications, + setNotifications, + } = useWebSocket({ + userId, + onNotification: () => { + handleEvent('notification'); + }, + onTransferCreated: () => { + handleEvent('asset_transferred'); + }, + onTransferApproved: () => { + handleEvent('asset_updated'); + }, + onTransferRejected: () => { + handleEvent('asset_updated'); + }, + onTransferExecuted: () => { + handleEvent('asset_transferred'); + }, + }); + + return { + isConnected, + notifications, + setNotifications, + }; +}