/** * Step 4: AI Sitemap Review * Review and edit AI-generated sitemap */ import { useState, useEffect, useCallback } from 'react'; import { useBuilderWorkflowStore } from '../../../../store/builderWorkflowStore'; import { PageBlueprint, updatePageBlueprint, regeneratePageBlueprint, } from '../../../../services/api'; import { siteBuilderApi } from '../../../../services/siteBuilder.api'; import { Card, CardDescription, CardTitle } from '../../../../components/ui/card'; import ButtonWithTooltip from '../../../../components/ui/button/ButtonWithTooltip'; import Button from '../../../../components/ui/button/Button'; import Alert from '../../../../components/ui/alert/Alert'; import Input from '../../../../components/form/input/InputField'; import { useToast } from '../../../../components/ui/toast/ToastContainer'; interface SitemapReviewStepProps { blueprintId: number; } export default function SitemapReviewStep({ blueprintId }: SitemapReviewStepProps) { const { context, completeStep, blockingIssues, refreshContext } = useBuilderWorkflowStore(); const toast = useToast(); const [pages, setPages] = useState([]); const [loading, setLoading] = useState(true); const [editingId, setEditingId] = useState(null); const [editForm, setEditForm] = useState<{ title: string; slug: string; type: string } | null>(null); const [regeneratingId, setRegeneratingId] = useState(null); const sitemapBlocking = blockingIssues.find(issue => issue.step === 'sitemap'); useEffect(() => { loadPages(); }, [blueprintId]); const loadPages = async () => { try { setLoading(true); const pagesList = await siteBuilderApi.listPages(blueprintId); setPages(pagesList.sort((a, b) => a.order - b.order)); } catch (error: any) { toast.error(`Failed to load pages: ${error.message}`); } finally { setLoading(false); } }; const handleEdit = (page: PageBlueprint) => { setEditingId(page.id); setEditForm({ title: page.title, slug: page.slug, type: page.type, }); }; const handleSaveEdit = async (pageId: number) => { if (!editForm) return; try { await updatePageBlueprint(pageId, { title: editForm.title, slug: editForm.slug, type: editForm.type, }); toast.success('Page updated successfully'); setEditingId(null); setEditForm(null); await loadPages(); await refreshContext(); } catch (error: any) { toast.error(`Failed to update page: ${error.message}`); } }; const handleCancelEdit = () => { setEditingId(null); setEditForm(null); }; const handleRegenerate = async (pageId: number) => { try { setRegeneratingId(pageId); await regeneratePageBlueprint(pageId); toast.success('Page regeneration started'); await loadPages(); await refreshContext(); } catch (error: any) { toast.error(`Failed to regenerate page: ${error.message}`); } finally { setRegeneratingId(null); } }; const getStatusBadge = (status: string) => { const variants: Record = { draft: 'bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200', pending: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200', generating: 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200', ready: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200', published: 'bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-200', }; return variants[status] || variants.draft; }; const getTypeBadge = (type: string) => { const variants: Record = { homepage: 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200', landing: 'bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-200', blog: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200', product: 'bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-200', category: 'bg-pink-100 text-pink-800 dark:bg-pink-900 dark:text-pink-200', about: 'bg-indigo-100 text-indigo-800 dark:bg-indigo-900 dark:text-indigo-200', }; return variants[type] || 'bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200'; }; return ( AI Sitemap Review Review and adjust the AI-generated site structure. Edit page details or regenerate pages as needed. {sitemapBlocking && ( {sitemapBlocking.message} )} {context?.sitemap_summary && (
Total Pages: {context.sitemap_summary.pages_total || 0}
By Status:
{Object.entries(context.sitemap_summary.pages_by_status || {}).map(([status, count]) => ( {status}: {count} ))}
By Type:
{Object.entries(context.sitemap_summary.pages_by_type || {}).map(([type, count]) => ( {type}: {count} ))}
)} {loading ? (
Loading pages...
) : pages.length === 0 ? ( No pages found. Generate a sitemap first. ) : (
{pages.map((page) => (
{editingId === page.id ? (
setEditForm({ ...editForm!, title: e.target.value })} placeholder="Page title" /> setEditForm({ ...editForm!, slug: e.target.value })} placeholder="page-slug" /> setEditForm({ ...editForm!, type: e.target.value })} placeholder="homepage, landing, blog, etc." />
) : ( <>

{page.title}

{page.status} {page.type}

/{page.slug}

)}
))}
)}
completeStep('sitemap')} disabled={!!sitemapBlocking} variant="primary" tooltip={sitemapBlocking?.message} > Continue
); }