import { useState, useRef, useCallback } from "react"; import { Image, X, Upload } from "lucide-react"; import { uploadFile } from "@/client/lib/uploads"; import { toast } from "@/client/components/toast-store"; import { Button } from "@/client/components/ui/button"; import { Dialog } from "@/client/components/ui/dialog"; import { UPLOAD_MIME_SET } from "@/shared/constants"; import { GRADIENT_PRESETS } from "@/shared/page-cover"; export function CoverPicker({ currentCover, onSelect, workspaceId, pageId, disabled = false, title, }: { currentCover: string | null; onSelect: (cover: string | null) => void; workspaceId: string; pageId: string; disabled?: boolean; title?: string; }) { const [open, setOpen] = useState(false); const [uploading, setUploading] = useState(false); const fileInputRef = useRef(null); const handleUpload = useCallback( async (file: File) => { if (!UPLOAD_MIME_SET.has(file.type) || !file.type.startsWith("image/")) return; setUploading(true); try { const url = await uploadFile(workspaceId, file, pageId); onSelect(url); setOpen(false); } catch { toast.error("Failed to upload cover"); } finally { setUploading(false); } }, [workspaceId, pageId, onSelect], ); return ( <> {currentCover ? ( ) : ( )} setOpen(false)} ariaLabelledBy="cover-picker-title" className="w-full max-w-sm p-4" >

Cover

{currentCover && ( )}
Gradients
{GRADIENT_PRESETS.map((gradient) => (
Upload image { const file = e.target.files?.[0]; if (file) handleUpload(file); e.target.value = ""; }} />
); }