import React, { useState } from 'react' import { router, usePage } from '@inertiajs/react' import StudioLayout from '../../Layouts/StudioLayout' async function requestJson(url, method = 'POST') { const response = await fetch(url, { method, credentials: 'same-origin', headers: { Accept: 'application/json', 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') || '', 'X-Requested-With': 'XMLHttpRequest', }, }) const payload = await response.json().catch(() => ({})) if (!response.ok) throw new Error(payload?.message || 'Request failed') return payload } function formatDate(value) { if (!value) return 'Unknown' const date = new Date(value) if (Number.isNaN(date.getTime())) return 'Unknown' return date.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' }) } const priorityClasses = { high: 'border-rose-300/20 bg-rose-300/10 text-rose-100', medium: 'border-sky-300/20 bg-sky-300/10 text-sky-100', low: 'border-white/10 bg-white/[0.03] text-slate-300', } export default function StudioInbox() { const { props } = usePage() const inbox = props.inbox || {} const filters = inbox.filters || {} const items = inbox.items || [] const meta = inbox.meta || {} const summary = inbox.summary || {} const [marking, setMarking] = useState(false) const updateFilters = (patch) => { const next = { ...filters, ...patch } if (patch.page == null) next.page = 1 router.get(window.location.pathname, next, { preserveScroll: true, preserveState: true, replace: true, }) } const markAllRead = async () => { setMarking(true) try { await requestJson(props.endpoints.markAllRead) router.reload({ preserveScroll: true, preserveState: true }) } catch (error) { window.alert(error?.message || 'Unable to mark inbox as read.') } finally { setMarking(false) } } return ( {marking ? 'Updating...' : 'Mark all read'}}>
Unread
{Number(summary.unread_count || 0).toLocaleString()}
High priority
{Number(summary.high_priority_count || 0).toLocaleString()}
Comments
{Number(summary.comment_count || 0).toLocaleString()}
Followers
{Number(summary.follower_count || 0).toLocaleString()}
{items.length > 0 ? items.map((item) => (
{item.actor?.avatar_url ? {item.actor.name :
}
{item.module_label} {item.priority} {item.is_new && Unread}

{item.title}

{item.body}

{formatDate(item.created_at)} {item.actor?.name && {item.actor.name}} Open
)) :
No inbox items match this filter.
}
Page {meta.current_page || 1} of {meta.last_page || 1}
) }