import { useState } from "preact/hooks"; import { useSignal } from "@preact/signals"; import { Settings } from "lucide-preact"; interface ResumeSettingsModalProps { className?: string; } export default function ResumeSettingsModal({ className = "", }: ResumeSettingsModalProps) { const [tomlContent, setTomlContent] = useState(""); const [isGenerating, setIsGenerating] = useState(false); const [error, setError] = useState(null); const [activeTab, setActiveTab] = useState<"upload" | "edit">("upload"); const dragActive = useSignal(false); const modalOpen = useSignal(false); const openModal = () => { modalOpen.value = true; }; const closeModal = () => { modalOpen.value = false; setError(null); setTomlContent(""); setActiveTab("upload"); }; const handleFileUpload = (file: File) => { if (!file.name.endsWith(".toml")) { setError("Please upload a .toml file"); return; } const reader = new FileReader(); reader.onload = (e) => { const content = e.target?.result as string; setTomlContent(content); setError(null); setActiveTab("edit"); }; reader.onerror = () => { setError("Error reading file"); }; reader.readAsText(file); }; const handleDrop = (e: DragEvent) => { e.preventDefault(); dragActive.value = false; const files = e.dataTransfer?.files; if (files && files.length > 0) { handleFileUpload(files[0]); } }; const handleDragOver = (e: DragEvent) => { e.preventDefault(); dragActive.value = true; }; const handleDragLeave = (e: DragEvent) => { e.preventDefault(); dragActive.value = false; }; const handleFileInput = (e: Event) => { const target = e.target as HTMLInputElement; const files = target.files; if (files && files.length > 0) { handleFileUpload(files[0]); } }; const downloadTemplate = async () => { try { const response = await fetch("/api/resume/template"); if (!response.ok) { throw new Error("Failed to download template"); } const blob = await response.blob(); const url = window.URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; link.download = "resume-template.toml"; document.body.appendChild(link); link.click(); document.body.removeChild(link); window.URL.revokeObjectURL(url); } catch (err) { setError("Failed to download template"); } }; const generatePDF = async () => { if (!tomlContent.trim()) { setError("Please provide TOML content"); return; } setIsGenerating(true); setError(null); try { const response = await fetch("/api/resume/pdf", { method: "POST", headers: { "Content-Type": "text/plain", }, body: tomlContent, }); if (!response.ok) { const errorText = await response.text(); throw new Error( errorText || `Failed to generate PDF: ${response.status}`, ); } const blob = await response.blob(); const url = window.URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; link.download = "resume.pdf"; document.body.appendChild(link); link.click(); document.body.removeChild(link); window.URL.revokeObjectURL(url); } catch (err) { console.error("Error generating PDF:", err); setError(err instanceof Error ? err.message : "Failed to generate PDF"); } finally { setIsGenerating(false); } }; const loadTemplate = async () => { try { const response = await fetch("/api/resume/template"); if (!response.ok) { throw new Error("Failed to load template"); } const template = await response.text(); setTomlContent(template); setActiveTab("edit"); setError(null); } catch (err) { setError("Failed to load template"); } }; return ( <> {/* Floating Settings Button */} {/* Modal */}