import { useEffect, useMemo } from "react"; import { useNavigate } from "react-router-dom"; import { Card, CardDescription, CardTitle, } from "../../../components/ui/card"; import Button from "../../../components/ui/button/Button"; import PageMeta from "../../../components/common/PageMeta"; import SiteAndSectorSelector from "../../../components/common/SiteAndSectorSelector"; import Alert from "../../../components/ui/alert/Alert"; import { Loader2, PlayCircle, RefreshCw, Wand2, } from "lucide-react"; import { useSiteStore } from "../../../store/siteStore"; import { useSectorStore } from "../../../store/sectorStore"; import { useBuilderStore } from "../../../store/builderStore"; import { BusinessDetailsStep } from "./steps/BusinessDetailsStep"; import { BriefStep } from "./steps/BriefStep"; import { ObjectivesStep } from "./steps/ObjectivesStep"; import { StyleStep } from "./steps/StyleStep"; export default function SiteBuilderWizard() { const navigate = useNavigate(); const { activeSite } = useSiteStore(); const { activeSector } = useSectorStore(); const { form, currentStep, setStep, setField, updateStyle, addObjective, removeObjective, nextStep, previousStep, submitWizard, isSubmitting, error, activeBlueprint, refreshPages, pages, generationProgress, isGenerating, syncContextFromStores, } = useBuilderStore(); useEffect(() => { syncContextFromStores(); }, [activeSite?.id, activeSite?.name, activeSector?.id]); const steps = useMemo( () => [ { title: "Business context", component: ( ), }, { title: "Brand brief", component: , }, { title: "Objectives", component: ( ), }, { title: "Look & feel", component: ( ), }, ], [form, setField, updateStyle, addObjective, removeObjective], ); const isLastStep = currentStep === steps.length - 1; const missingContext = !activeSite || !activeSector; const handlePrimary = async () => { if (isLastStep) { await submitWizard(); } else { nextStep(); } }; return (

Sites / Create Site

Site Builder

Create a new site using IGNY8’s AI-powered wizard. Align the estate, strategy, and tone before publishing.

{missingContext && ( )}
{steps.map((step, index) => ( ))}
{steps[currentStep].component} {error && ( )}
Step {currentStep + 1} of {steps.length}
Latest blueprint Once the wizard finishes, the most recent blueprint appears here. {activeBlueprint ? (
Status {activeBlueprint.status}
Pages generated {pages.length}
) : (
Run the wizard to create your first blueprint.
)}
{generationProgress && ( Generation progress Tracking background tasks queued for this blueprint.
Pages queued {generationProgress.pagesQueued}

Task IDs

{generationProgress.taskIds.join(", ")}

{generationProgress.celeryTaskId && (

Celery task ID: {generationProgress.celeryTaskId}

)}
)} {isGenerating && ( )}
); }