import { useState, useEffect } from "react"; import { useNavigate } from "react-router"; import { Masthead } from "../components/Masthead"; import { TemplateEditor } from "../components/templates/TemplateEditor"; import { useAuth } from "../contexts/AuthContext"; import type { ContractTemplate } from "../types/templates"; import { DEFAULT_TEMPLATES } from "../types/templates"; const STORAGE_KEY = "makima_contract_templates"; export default function TemplatesPage() { const navigate = useNavigate(); const { isAuthenticated, isAuthConfigured, isLoading: authLoading } = useAuth(); const [templates, setTemplates] = useState(() => { const saved = localStorage.getItem(STORAGE_KEY); if (saved) { try { return JSON.parse(saved); } catch { return DEFAULT_TEMPLATES; } } return DEFAULT_TEMPLATES; }); const [editingTemplate, setEditingTemplate] = useState( null ); const [showNewTemplateForm, setShowNewTemplateForm] = useState(false); const [newTemplateName, setNewTemplateName] = useState(""); const [newTemplateDescription, setNewTemplateDescription] = useState(""); // Redirect to login if not authenticated useEffect(() => { if (!authLoading && isAuthConfigured && !isAuthenticated) { navigate("/login"); } }, [authLoading, isAuthConfigured, isAuthenticated, navigate]); const saveTemplates = (newTemplates: ContractTemplate[]) => { setTemplates(newTemplates); localStorage.setItem(STORAGE_KEY, JSON.stringify(newTemplates)); }; const handleSaveTemplate = (updatedTemplate: ContractTemplate) => { const newTemplates = templates.map((t) => t.id === updatedTemplate.id ? updatedTemplate : t ); saveTemplates(newTemplates); setEditingTemplate(null); }; const handleCreateTemplate = () => { if (!newTemplateName.trim()) return; const newTemplate: ContractTemplate = { id: `custom-${Date.now()}`, name: newTemplateName.trim(), description: newTemplateDescription.trim() || "Custom contract template", isBuiltIn: false, phases: [ { id: `phase-${Date.now()}`, name: "Execute", deliverables: [], }, ], }; saveTemplates([...templates, newTemplate]); setNewTemplateName(""); setNewTemplateDescription(""); setShowNewTemplateForm(false); }; const handleDeleteTemplate = (templateId: string) => { const template = templates.find((t) => t.id === templateId); if (template?.isBuiltIn) return; if (window.confirm(`Are you sure you want to delete "${template?.name}"?`)) { saveTemplates(templates.filter((t) => t.id !== templateId)); } }; const handleResetToDefaults = () => { if ( window.confirm( "Reset all templates to defaults? This will remove any custom templates." ) ) { saveTemplates(DEFAULT_TEMPLATES); } }; // Show loading state if (authLoading) { return (
Loading...
); } // Editor view if (editingTemplate) { return (
setEditingTemplate(null)} />
); } return (
{/* Header */}

Contract Templates

Manage contract types and their phase deliverables

{/* New Template Form */} {showNewTemplateForm && (
setNewTemplateName(e.target.value)} /> setNewTemplateDescription(e.target.value)} />
)} {/* Templates Grid */}
{templates.map((template) => (
{/* Card Header */}

{template.name}

{template.isBuiltIn ? ( Built-in ) : ( Custom )}
{/* Card Body */}

{template.description}

{/* Phases */}
{template.phases.map((phase, index) => (
{index < template.phases.length - 1 && ( )}
{phase.name} {phase.deliverables.length === 0 ? "(no deliverables)" : phase.deliverables.map((d) => d.name).join(", ")}
))}
{/* Card Footer */}
{!template.isBuiltIn && ( )}
))}
); }