78 lines
2.6 KiB
TypeScript
78 lines
2.6 KiB
TypeScript
import React, { useState, useEffect, useCallback } from 'react';
|
|
import { useAuth } from '../context/useAuth';
|
|
import api from '../services/api';
|
|
import type { INotification } from '../types';
|
|
import { NotificationContext } from './NotificationContextState';
|
|
|
|
export const NotificationProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
|
|
const { appUser, isSignedIn } = useAuth();
|
|
const orgId = appUser?.organizationId;
|
|
const [notifications, setNotifications] = useState<INotification[]>([]);
|
|
const [loading, setLoading] = useState(false);
|
|
|
|
const fetchNotifications = useCallback(async () => {
|
|
if (!isSignedIn || !orgId) return;
|
|
|
|
try {
|
|
setLoading(true);
|
|
const response = await api.get<INotification[]>('/notifications');
|
|
setNotifications(response.data);
|
|
} catch (error) {
|
|
console.error('Error fetching notifications:', error);
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
}, [isSignedIn, orgId]);
|
|
|
|
useEffect(() => {
|
|
if (isSignedIn && orgId) {
|
|
fetchNotifications();
|
|
const interval = setInterval(fetchNotifications, 60000);
|
|
return () => clearInterval(interval);
|
|
}
|
|
}, [isSignedIn, orgId, fetchNotifications]);
|
|
|
|
const markAsRead = async (id: string) => {
|
|
try {
|
|
await api.patch(`/notifications/${id}/read`);
|
|
setNotifications(prev => prev.map(n => n._id === id ? { ...n, isRead: true } : n));
|
|
} catch (error) {
|
|
console.error('Error marking notification as read:', error);
|
|
}
|
|
};
|
|
|
|
const markAllAsRead = async () => {
|
|
try {
|
|
await api.post('/notifications/read-all');
|
|
setNotifications(prev => prev.map(n => ({ ...n, isRead: true })));
|
|
} catch (error) {
|
|
console.error('Error marking all notifications as read:', error);
|
|
}
|
|
};
|
|
|
|
const deleteNotification = async (id: string) => {
|
|
try {
|
|
await api.delete(`/notifications/${id}`);
|
|
setNotifications(prev => prev.filter(n => n._id !== id));
|
|
} catch (error) {
|
|
console.error('Error deleting notification:', error);
|
|
}
|
|
};
|
|
|
|
const unreadCount = notifications.filter(n => !n.isRead).length;
|
|
|
|
return (
|
|
<NotificationContext.Provider value={{
|
|
notifications,
|
|
unreadCount,
|
|
loading,
|
|
fetchNotifications,
|
|
markAsRead,
|
|
markAllAsRead,
|
|
deleteNotification
|
|
}}>
|
|
{children}
|
|
</NotificationContext.Provider>
|
|
);
|
|
};
|