import { useCallback } from "react"; import { ArrowLeft } from "lucide-react"; import { EmailDetail } from "@/client/components/email-detail"; import { EmailList } from "@/client/components/email-list"; import { InboxHeader } from "@/client/components/inbox/inbox-header"; import { MissingInboxSessionState } from "@/client/components/inbox/missing-inbox-session-state"; import { ErrorBanner } from "@/client/components/ui"; import { useCountdown } from "@/client/hooks/useCountdown"; import { useInbox } from "@/client/hooks/useInbox"; import { useInboxPageActions } from "@/client/hooks/useInboxPageActions"; import { useInboxRouteSession } from "@/client/hooks/useInboxRouteSession"; import { useWebSocket } from "@/client/hooks/useWebSocket"; import { NewEmailEvent } from "@/shared/contracts"; interface InboxViewProps { onDeleted: (address: string) => void; } export function InboxView({ onDeleted }: InboxViewProps) { const { address, adminMode, auth } = useInboxRouteSession(); const session = auth ? { address, auth } : null; const { inbox, emails, selectedEmail, selectedEmailId, loading, emailLoading, error, refreshInbox, refresh, selectEmail, deleteEmail: removeEmail, applyIncomingEmail, } = useInbox(session, { markReadOnOpen: !adminMode }); const countdown = useCountdown(inbox?.expiresAt ?? null); const { availableExtensions, canDeleteEmail, extendingTo, isAdminInspectingTemporaryInbox, handleBackToList, handleCopy, handleDeleteInbox, handleExtendInbox, } = useInboxPageActions({ address, adminMode, inbox, onDeleted, refreshInbox, selectEmail, session, }); const socketState = useWebSocket({ address, auth, enabled: Boolean(session), messageCodec: NewEmailEvent, onMessage: useCallback( (message: NewEmailEvent) => { if (message.type === "new_email") { void applyIncomingEmail(message.email); } }, [applyIncomingEmail], ), }); if (!session) { return ; } return (
{/* Inbox hero bar */} {error ? {error} : null} {/* Email list + detail — desktop: side-by-side, mobile: toggle */}
void selectEmail(emailId)} />
{selectedEmailId ? ( ) : null} void removeEmail(emailId)} />
); }