import { useQueryClient } from '@tanstack/react-query'; import { RefreshCw } from 'lucide-react'; import { useCallback, useEffect } from 'react'; import { useMetadata } from '@/lib/hooks/useMetadata'; import { useUsers } from '@/features/auth/hooks/useUsers'; import { SchemaVisualizer, VisualizerSkeleton } from '../components'; import { Alert, AlertDescription, Button } from '@/components'; import { useSocket, ServerEvents, DataUpdatePayload, DataUpdateResourceType, SocketMessage, } from '@/lib/contexts/SocketContext'; const VisualizerPage = () => { const { socket, isConnected } = useSocket(); const queryClient = useQueryClient(); const { metadata, isLoading: metadataLoading, error: metadataError, refetch: refetchMetadata, } = useMetadata(); const { totalUsers, isLoading: userStatsLoading, refetch: refetchUserStats, } = useUsers({ enabled: true }); const isLoading = metadataLoading || userStatsLoading; const error = metadataError; const handleRefresh = useCallback(() => { void refetchMetadata(); void refetchUserStats(); }, [refetchMetadata, refetchUserStats]); // Listen for schema change events useEffect(() => { if (!socket || !isConnected) { return; } const handleDataUpdate = (message: SocketMessage) => { if ( message.payload?.resource === DataUpdateResourceType.DATABASE || message.payload?.resource === DataUpdateResourceType.BUCKETS ) { // Invalidate all metadata-related queries void queryClient.invalidateQueries({ queryKey: ['metadata'] }); } }; socket.on(ServerEvents.DATA_UPDATE, handleDataUpdate); return () => { socket.off(ServerEvents.DATA_UPDATE, handleDataUpdate); }; }, [socket, isConnected, queryClient]); if (isLoading) { return ; } if (!metadata || error) { return (
{/* Dot Matrix Background - Light Mode */}
{/* Dot Matrix Background - Dark Mode */}
Failed to load database schema. Please ensure the backend is running and try refreshing.
); } return (
{/* Dot Matrix Background - Light Mode */}
{/* Dot Matrix Background - Dark Mode */}
{/* Schema Visualizer */}
); }; export default VisualizerPage;