'use client' import { useState, useEffect } from 'react' import { useRouter } from 'next/navigation' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Bell, Check, X, Clock, User } from 'lucide-react' import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { getPendingShareRequests, respondToShareRequest, removeSharedNoteFromView } from '@/app/actions/notes' import { toast } from 'sonner' import { useNoteRefresh } from '@/context/NoteRefreshContext' import { cn } from '@/lib/utils' interface ShareRequest { id: string status: string permission: string createdAt: Date note: { id: string title: string | null content: string color: string createdAt: Date } sharer: { id: string name: string | null email: string image: string | null } } export function NotificationPanel() { const router = useRouter() const { triggerRefresh } = useNoteRefresh() const [requests, setRequests] = useState([]) const [isLoading, setIsLoading] = useState(false) const [pendingCount, setPendingCount] = useState(0) const loadRequests = async () => { setIsLoading(true) try { const data = await getPendingShareRequests() setRequests(data) setPendingCount(data.length) } catch (error: any) { console.error('Failed to load share requests:', error) } finally { setIsLoading(false) } } useEffect(() => { loadRequests() const interval = setInterval(loadRequests, 10000) return () => clearInterval(interval) }, []) const handleAccept = async (shareId: string) => { console.log('[NOTIFICATION] Accepting share:', shareId) try { await respondToShareRequest(shareId, 'accept') console.log('[NOTIFICATION] Share accepted, calling router.refresh()') router.refresh() console.log('[NOTIFICATION] Calling triggerRefresh()') triggerRefresh() setRequests(prev => prev.filter(r => r.id !== shareId)) setPendingCount(prev => prev - 1) toast.success('Note shared successfully!', { description: 'The note now appears in your list', duration: 3000, }) console.log('[NOTIFICATION] Done! Note should appear now') } catch (error: any) { console.error('[NOTIFICATION] Error:', error) toast.error(error.message || 'Error') } } const handleDecline = async (shareId: string) => { console.log('[NOTIFICATION] Declining share:', shareId) try { await respondToShareRequest(shareId, 'decline') router.refresh() triggerRefresh() setRequests(prev => prev.filter(r => r.id !== shareId)) setPendingCount(prev => prev - 1) toast.info('Share declined') } catch (error: any) { console.error('[NOTIFICATION] Error:', error) toast.error(error.message || 'Error') } } const handleRemove = async (shareId: string) => { try { await removeSharedNoteFromView(shareId) router.refresh() triggerRefresh() setRequests(prev => prev.filter(r => r.id !== shareId)) toast.info('Request hidden') } catch (error: any) { toast.error(error.message || 'Error') } } return (
Pending Shares
{pendingCount > 0 && ( {pendingCount} )}
{isLoading ? (
Loading...
) : requests.length === 0 ? (

No pending share requests

) : (
{requests.map((request) => (
{(request.sharer.name || request.sharer.email)[0].toUpperCase()}

{request.sharer.name || request.sharer.email}

shared "{request.note.title || 'Untitled'}"

{request.permission}
{new Date(request.createdAt).toLocaleDateString()}
))}
)} ) }