import { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import PageMeta from "../../../components/common/PageMeta"; import { Card } from "../../../components/ui/card"; import Button from "../../../components/ui/button/Button"; import { useToast } from "../../../components/ui/toast/ToastContainer"; import { FileText, Loader2, Plus, Trash2, CheckSquare, Square } from "lucide-react"; import { useSiteStore } from "../../../store/siteStore"; import { useBuilderStore } from "../../../store/builderStore"; import { siteBuilderApi } from "../../../services/siteBuilder.api"; import type { SiteBlueprint } from "../../../types/siteBuilder"; import { Modal } from "../../../components/ui/modal"; export default function SiteBuilderBlueprints() { const navigate = useNavigate(); const toast = useToast(); const { activeSite } = useSiteStore(); const { loadBlueprint, isLoadingBlueprint, activeBlueprint } = useBuilderStore(); const [blueprints, setBlueprints] = useState([]); const [loading, setLoading] = useState(false); const [selectedIds, setSelectedIds] = useState>(new Set()); const [deleteConfirm, setDeleteConfirm] = useState<{ isOpen: boolean; blueprint: SiteBlueprint | null; isBulk: boolean; }>({ isOpen: false, blueprint: null, isBulk: false }); useEffect(() => { if (activeSite?.id) { loadBlueprints(activeSite.id); } else { setBlueprints([]); } }, [activeSite?.id]); const loadBlueprints = async (siteId: number) => { try { setLoading(true); const results = await siteBuilderApi.listBlueprints(siteId); setBlueprints(results); } catch (error: any) { toast.error(error?.message || "Failed to load blueprints"); } finally { setLoading(false); } }; const handleOpenPreview = async (blueprintId: number) => { try { await loadBlueprint(blueprintId); toast.success("Loaded blueprint preview"); navigate("/sites/builder/preview"); } catch (error: any) { toast.error(error?.message || "Unable to open blueprint"); } }; const handleDeleteClick = (blueprint: SiteBlueprint) => { setDeleteConfirm({ isOpen: true, blueprint, isBulk: false }); }; const handleBulkDeleteClick = () => { if (selectedIds.size === 0) { toast.error("No blueprints selected"); return; } setDeleteConfirm({ isOpen: true, blueprint: null, isBulk: true }); }; const handleDeleteConfirm = async () => { try { if (deleteConfirm.isBulk) { // Bulk delete const ids = Array.from(selectedIds); const result = await siteBuilderApi.bulkDeleteBlueprints(ids); const count = result?.deleted_count || ids.length; toast.success(`${count} blueprint${count !== 1 ? 's' : ''} deleted successfully`); setSelectedIds(new Set()); } else if (deleteConfirm.blueprint) { // Single delete await siteBuilderApi.deleteBlueprint(deleteConfirm.blueprint.id); toast.success("Blueprint deleted successfully"); } setDeleteConfirm({ isOpen: false, blueprint: null, isBulk: false }); if (activeSite?.id) { await loadBlueprints(activeSite.id); } } catch (error: any) { toast.error(error?.message || "Failed to delete blueprint(s)"); } }; const toggleSelection = (id: number) => { setSelectedIds(prev => { const next = new Set(prev); if (next.has(id)) { next.delete(id); } else { next.add(id); } return next; }); }; const toggleSelectAll = () => { if (selectedIds.size === blueprints.length) { setSelectedIds(new Set()); } else { setSelectedIds(new Set(blueprints.map(b => b.id))); } }; return (

Sites / Blueprints

Blueprints

Review and preview structures generated for your active site.

{selectedIds.size > 0 && ( )}
{!activeSite ? (

Select a site using the header switcher to view its blueprints.

) : loading ? (
Loading blueprints…
) : blueprints.length === 0 ? (

No blueprints created yet for {activeSite.name}.

) : (
{blueprints.length > 0 && (
{selectedIds.size > 0 && ( {selectedIds.size} of {blueprints.length} selected )}
)}
{blueprints.map((blueprint) => (

Blueprint #{blueprint.id}

{blueprint.name}

{blueprint.description && (

{blueprint.description}

)}
Status {blueprint.status}
))}
)} setDeleteConfirm({ isOpen: false, blueprint: null, isBulk: false })} title={deleteConfirm.isBulk ? "Delete Blueprints" : "Delete Blueprint"} description={ deleteConfirm.isBulk ? `Are you sure you want to delete ${selectedIds.size} blueprint${selectedIds.size !== 1 ? 's' : ''}? This will also delete all associated page blueprints. This action cannot be undone.` : `Are you sure you want to delete "${deleteConfirm.blueprint?.name}"? This will also delete all associated page blueprints. This action cannot be undone.` } footer={ <> } />
); }