Initial commit: Port Nimara CRM (Layers 0-4)
Full CRM rebuild with Next.js 15, TypeScript, Tailwind, Drizzle ORM, PostgreSQL, Redis, BullMQ, MinIO, and Socket.io. Includes 461 source files covering clients, berths, interests/pipeline, documents/EOI, expenses/invoices, email, notifications, dashboard, admin, and client portal. CI/CD via Gitea Actions with Docker builds. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
47
src/hooks/use-notifications.ts
Normal file
47
src/hooks/use-notifications.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
'use client';
|
||||
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useQuery, useQueryClient } from '@tanstack/react-query';
|
||||
|
||||
import { useSocket } from '@/providers/socket-provider';
|
||||
import { apiFetch } from '@/lib/api/client';
|
||||
|
||||
export function useNotifications() {
|
||||
const socket = useSocket();
|
||||
const queryClient = useQueryClient();
|
||||
const [unreadCount, setUnreadCount] = useState(0);
|
||||
|
||||
// Initial unread count
|
||||
const { data } = useQuery<{ count: number }>({
|
||||
queryKey: ['notifications', 'unread-count'],
|
||||
queryFn: () => apiFetch('/api/v1/notifications/unread-count'),
|
||||
staleTime: 30_000,
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
if (data) setUnreadCount(data.count);
|
||||
}, [data]);
|
||||
|
||||
// Socket listeners
|
||||
useEffect(() => {
|
||||
if (!socket) return;
|
||||
|
||||
const handleNew = () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['notifications'] });
|
||||
};
|
||||
|
||||
const handleCount = (payload: { count: number }) => {
|
||||
setUnreadCount(payload.count);
|
||||
};
|
||||
|
||||
socket.on('notification:new' as any, handleNew);
|
||||
socket.on('notification:unreadCount' as any, handleCount);
|
||||
|
||||
return () => {
|
||||
socket.off('notification:new' as any, handleNew);
|
||||
socket.off('notification:unreadCount' as any, handleCount);
|
||||
};
|
||||
}, [socket, queryClient]);
|
||||
|
||||
return { unreadCount };
|
||||
}
|
||||
Reference in New Issue
Block a user