'use client'; import { useEffect, useState } from 'react'; import { PenLine, Plus, X } from 'lucide-react'; import { Compose } from '@/components/Compose'; import { AvatarImage } from '@/components/AvatarImage'; import { signedAPI } from '@/lib/api/signed-fetch'; import { useAuth } from '@/lib/contexts/AuthContext'; import { useToast } from '@/lib/contexts/ToastContext'; export function GlobalPostComposer() { const { user, did, handle } = useAuth(); const { showToast } = useToast(); const [openForUserId, setOpenForUserId] = useState(null); const open = Boolean(user && openForUserId === user.id); useEffect(() => { if (!open) return; const previousOverflow = document.body.style.overflow; document.body.style.overflow = 'hidden'; const handleKeyDown = (event: KeyboardEvent) => { if (event.key === 'Escape') setOpenForUserId(null); }; window.addEventListener('keydown', handleKeyDown); return () => { document.body.style.overflow = previousOverflow; window.removeEventListener('keydown', handleKeyDown); }; }, [open]); if (!user) return null; const handlePost = async ( content: string, mediaIds: string[], linkPreview?: unknown, _replyToId?: string, isNsfw?: boolean, ): Promise => { if (!did || !handle) { showToast('Your identity is still loading. Try again in a moment.', 'error'); return false; } try { const response = await signedAPI.createPost( content, mediaIds, linkPreview, undefined, undefined, isNsfw || false, did, handle, ); if (!response.ok) { const data = await response.json().catch(() => ({})); showToast(data.error || 'Failed to publish post.', 'error'); return false; } return true; } catch (error) { showToast(error instanceof Error ? error.message : 'Failed to publish post.', 'error'); return false; } }; return ( <> {!open && ( )} {open && (
{ if (event.target === event.currentTarget) setOpenForUserId(null); }} >

New post

Share something with your network

{user.displayName || user.handle} @{user.handle}
Public
{ setOpenForUserId(null); showToast('Post published.', 'success'); }} />
)} ); }