'use client' import { useCallback, useEffect, useState } from 'react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { toast } from 'sonner' import type { Bookmark } from '@/components/app-shell' export function BookmarkExtras({ bookmark, canEdit, onUpdate }: { bookmark: Bookmark; canEdit: boolean; onUpdate: () => void }) { const [sources, setSources] = useState([]) const [signals, setSignals] = useState([]) const [pages, setPages] = useState([]) const [from, setFrom] = useState('') const [subject, setSubject] = useState('') const [busy, setBusy] = useState(false) const [shares, setShares] = useState([]) const load = useCallback(async () => { const [signalResponse, bookmarkResponse] = await Promise.all([ fetch(`/api/bookmarks/${bookmark.id}/signals`), fetch(`/api/bookmarks/${bookmark.id}`), ]) if (signalResponse.ok) { const data = await signalResponse.json(); setSources(data.sources); setSignals(data.signals) } if (bookmarkResponse.ok) { const data = await bookmarkResponse.json(); setPages(data.pageLinks ?? []); setShares(data.sharedWith ?? []) } }, [bookmark.id]) useEffect(() => { const timer = setTimeout(() => load().catch(() => toast.error('Could not load bookmark details')), 0); return () => clearTimeout(timer) }, [load]) const change = async (url: string, method: string, body?: any) => { setBusy(true) try { const response = await fetch(url, { method, headers: { 'Content-Type': 'application/json' }, body: body ? JSON.stringify(body) : undefined }) if (!response.ok) { toast.error((await response.json()).error || 'Request failed'); return } await load(); onUpdate() } catch { toast.error('Request failed') } finally { setBusy(false) } } return
Download Markdown {canEdit && shares.length > 0 &&

Shared with

{shares.map(share =>
{share.user?.name || share.user?.email}
)}
}

On pages

{pages.length ? pages.map(link => {link.page.title}) :

Not linked to a page yet

}

Signals

{canEdit && <>
setFrom(e.target.value)} /> setSubject(e.target.value)} />
} {sources.map(source =>

{source.type}: {source.config.from || 'any sender'} / {source.config.subject || 'any subject'}

{source.lastStatus || 'Not checked yet'}

{canEdit &&
}
)} {signals.map(signal =>

{signal.title}

{signal.summary}

)} {!signals.length &&

No matching events yet. Configure a mailbox in Settings to check email watchers.

}
}