'use client'; import { useState, useEffect, useCallback } from 'react'; import Image from 'next/image'; import Link from 'next/link'; import { notificationsApiService, type AppNotification } from '@/services/notifications-api.service'; function getNotificationIcon(type: AppNotification['type']) { switch (type) { case 'connection': return '/assets/icons/user-placeholder-icon.svg'; case 'message': return '/assets/icons/message-icon.svg'; case 'system': return '/assets/icons/settings-icon.svg'; case 'update': return '/assets/icons/notification-bell-icon.svg'; default: return '/assets/icons/notification-bell-icon.svg'; } } function formatTimestamp(dateStr: string): string { const date = new Date(dateStr); const now = new Date(); const diffMs = now.getTime() - date.getTime(); const diffMins = Math.floor(diffMs / 60000); const diffHours = Math.floor(diffMs / 3600000); const diffDays = Math.floor(diffMs / 86400000); if (diffMins < 1) return 'Just now'; if (diffMins < 60) return `${diffMins} min ago`; if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`; if (diffDays < 7) return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`; return date.toLocaleDateString(); } export default function UserNotificationsPage() { const [notifications, setNotifications] = useState([]); const [unreadCount, setUnreadCount] = useState(0); const [totalCount, setTotalCount] = useState(0); const [filter, setFilter] = useState<'all' | 'unread'>('all'); const [isLoading, setIsLoading] = useState(true); const fetchNotifications = useCallback(async () => { try { const data = await notificationsApiService.getNotifications(filter, 1, 50); setNotifications(data.notifications); setUnreadCount(data.unreadCount); setTotalCount(data.pagination.total); } catch (err) { console.error('Failed to fetch notifications:', err); } finally { setIsLoading(false); } }, [filter]); useEffect(() => { fetchNotifications(); }, [fetchNotifications]); const markAsRead = async (id: string) => { try { await notificationsApiService.markAsRead(id); if (filter === 'unread') { setNotifications((prev) => prev.filter((n) => n.id !== id)); } else { setNotifications((prev) => prev.map((n) => (n.id === id ? { ...n, read: true } : n)) ); } setUnreadCount((prev) => Math.max(0, prev - 1)); } catch (err) { console.error('Failed to mark as read:', err); } }; const markAllAsRead = async () => { try { await notificationsApiService.markAllAsRead(); if (filter === 'unread') { setNotifications([]); } else { setNotifications((prev) => prev.map((n) => ({ ...n, read: true }))); } setUnreadCount(0); } catch (err) { console.error('Failed to mark all as read:', err); } }; return (
{/* Header */}
Notifications

Notifications

{unreadCount > 0 ? `You have ${unreadCount} unread notification${unreadCount > 1 ? 's' : ''}` : 'All caught up!'}

{unreadCount > 0 && ( )}
{/* Filter Tabs */}
{/* Notifications List */}
{isLoading ? (
) : notifications.length === 0 ? (
No notifications

{filter === 'unread' ? 'No unread notifications' : 'No notifications yet'}

) : (
{notifications.map((notification) => (
{/* Icon */}
{notification.type}
{/* Content */}

{notification.title}

{notification.description}

{formatTimestamp(notification.createdAt)}
{/* Actions */}
{notification.actionUrl && ( View details )} {!notification.read && ( )}
{/* Unread indicator */} {!notification.read && (
)}
))}
)}
{/* Settings Link */}
Manage notification settings
); }