/* global React, PR */ const { useState, useEffect, useRef, useCallback } = React; const { I, Avatar } = PR; const USER_COLORS = [ "#7C8BA1","#A37BC8","#5BA89E","#C8895B", "#5B7BC8","#B85B7B","#5BA860","#C8B45B", ]; // ── Shared helpers ───────────────────────────────────────────────────────── async function api(url, opts = {}) { const resp = await fetch(url, { headers: { "Content-Type": "application/json" }, ...opts, }); if (!resp.ok) { const err = await resp.json().catch(() => ({})); throw new Error(err.detail || `HTTP ${resp.status}`); } return resp.json(); } // ── Cover image picker ──────────────────────────────────────────────────── function CoverImagePicker({ value, onChange }) { const fileInputRef = useRef(null); const [uploading, setUploading] = useState(false); const [error, setError] = useState(null); const [dragOver, setDragOver] = useState(false); const uploadFile = async (file) => { if (!file || !file.type.startsWith("image/")) { setError("Only images are allowed"); return; } setUploading(true); setError(null); try { const form = new FormData(); form.append("file", file); const resp = await fetch("/api/upload", { method: "POST", body: form }); if (!resp.ok) { const err = await resp.json().catch(() => ({})); throw new Error(err.detail || "Upload failed"); } const { url } = await resp.json(); onChange(url); } catch (e) { setError(e.message); } finally { setUploading(false); } }; const handlePaste = useCallback((e) => { const items = e.clipboardData?.items; if (!items) return; for (const item of items) { if (item.type.startsWith("image/")) { e.preventDefault(); uploadFile(item.getAsFile()); return; } } }, []); useEffect(() => { document.addEventListener("paste", handlePaste); return () => document.removeEventListener("paste", handlePaste); }, [handlePaste]); const handleDrop = (e) => { e.preventDefault(); setDragOver(false); const file = e.dataTransfer.files[0]; if (file) uploadFile(file); }; return (