feat(ui): add NotificationBell component with unread badge
This commit is contained in:
parent
8e049984a2
commit
27b61415a6
1 changed files with 48 additions and 0 deletions
48
src/components/notification-bell.tsx
Normal file
48
src/components/notification-bell.tsx
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
'use client';
|
||||||
|
|
||||||
|
import Link from 'next/link';
|
||||||
|
import { useQuery } from '@tanstack/react-query';
|
||||||
|
import { apiFetch, type Notification } from '../lib/api';
|
||||||
|
|
||||||
|
export function NotificationBell({ tenantId }: { tenantId: string }) {
|
||||||
|
const { data: notifications = [] } = useQuery({
|
||||||
|
queryKey: ['notifications-unread', tenantId],
|
||||||
|
queryFn: () => apiFetch<Notification[]>('/v1/notifications?filter=unread', { tenantId }),
|
||||||
|
enabled: Boolean(tenantId),
|
||||||
|
refetchInterval: 30_000,
|
||||||
|
staleTime: 20_000,
|
||||||
|
});
|
||||||
|
|
||||||
|
const count = notifications.length;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Link
|
||||||
|
href="/dashboard/settings/notifications"
|
||||||
|
aria-label={count > 0 ? `${count} notificări necitite` : 'Notificări'}
|
||||||
|
className="relative flex h-9 w-9 items-center justify-center rounded-lg text-ink-faint
|
||||||
|
transition-colors hover:bg-paper-sunken hover:text-ink"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth="1.6"
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
className="h-5 w-5"
|
||||||
|
aria-hidden="true"
|
||||||
|
>
|
||||||
|
<path d="M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9" />
|
||||||
|
<path d="M13.73 21a2 2 0 01-3.46 0" />
|
||||||
|
</svg>
|
||||||
|
{count > 0 && (
|
||||||
|
<span
|
||||||
|
className="absolute right-1 top-1 flex h-4 min-w-[1rem] items-center justify-center
|
||||||
|
rounded-full bg-signal-danger px-0.5 text-[9px] font-bold leading-none text-paper"
|
||||||
|
>
|
||||||
|
{count > 99 ? '99+' : count}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
);
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue