'use client'; import Link from 'next/link'; import { useEffect } from 'react'; import { useSWRConfig } from 'swr'; import useSWRInfinite from 'swr/infinite'; import { notificationPath, notificationText, timeAgo, type NotificationListDTO } from '@musicshare/shared'; import { Avatar } from '@/components/Avatar'; import { client, useMe } from '@/lib/api'; /** Reactions, comments, new followers and songs sent to you, newest first. Opening it marks them read. */ export default function NotificationsPage() { const { me, loggedOut } = useMe(); const { mutate } = useSWRConfig(); const { data, size, setSize, isLoading } = useSWRInfinite( (i, prev: NotificationListDTO | null) => (!me || (i > 0 && !prev?.nextCursor) ? null : ['notifications', prev?.nextCursor ?? null]), ([, cursor]: [string, string | null]) => client.notifications(cursor), { revalidateOnFocus: false }, ); const items = data?.flatMap((p) => p.notifications) ?? []; const unread = data?.[0]?.unread ?? 0; // Seen once you've looked: clear the bell (rows stay highlighted until you come back). useEffect(() => { if (unread) client.markNotificationsRead().then(() => mutate('/notifications'), () => {}); }, [unread, mutate]); if (loggedOut) return

Log in to see your notifications.

; return (

Notifications

{items.length === 0 && !isLoading && (

Nothing yet. Reactions, new followers and songs sent to you show up here.

)} {data?.at(-1)?.nextCursor && ( )}
); }