"use client"; import { useCallback, useEffect, useMemo, useState } from "react"; import { ListTemplate } from "@/components/funnel/templates/ListTemplate"; import { InfoTemplate } from "@/components/funnel/templates/InfoTemplate"; import { DateTemplate } from "@/components/funnel/templates/DateTemplate"; import { FormTemplate } from "@/components/funnel/templates/FormTemplate"; import { CouponTemplate } from "@/components/funnel/templates/CouponTemplate"; import { useBuilderSelectedScreen } from "@/lib/admin/builder/context"; import type { ListScreenDefinition, InfoScreenDefinition, DateScreenDefinition, FormScreenDefinition, CouponScreenDefinition } from "@/lib/funnel/types"; import { mergeScreenWithOverrides } from "@/lib/admin/builder/variants"; export function BuilderPreview() { const selectedScreen = useBuilderSelectedScreen(); const [selectedIds, setSelectedIds] = useState([]); const [formData, setFormData] = useState>({}); const [previewVariantIndex, setPreviewVariantIndex] = useState(null); useEffect(() => { if (!selectedScreen) { setSelectedIds([]); setFormData({}); setPreviewVariantIndex(null); return; } setSelectedIds((prev) => { if (prev.length === 0) { return prev; } return []; }); }, [selectedScreen]); const handleSelectionChange = useCallback((ids: string[]) => { setSelectedIds((prev) => { if (prev.length === ids.length && prev.every((value, index) => value === ids[index])) { return prev; } return ids; }); }, []); const handleFormChange = useCallback((data: Record) => { setFormData(data); }, []); const variants = useMemo(() => selectedScreen?.variants ?? [], [selectedScreen]); useEffect(() => { setPreviewVariantIndex(null); }, [selectedScreen]); const previewScreen = useMemo(() => { if (!selectedScreen) { return null; } if (previewVariantIndex === null) { return selectedScreen; } const variant = variants[previewVariantIndex]; if (!variant) { return selectedScreen; } return mergeScreenWithOverrides(selectedScreen, variant.overrides ?? {}); }, [previewVariantIndex, selectedScreen, variants]); const renderScreenPreview = useCallback(() => { if (!previewScreen) return null; const commonProps = { showGradient: false, canGoBack: false, onBack: () => {}, onContinue: () => {}, // Mock continue handler for preview }; switch (previewScreen.template) { case "list": return ( ); case "info": return ( ); case "date": return ( {}} /> ); case "form": return ( ); case "coupon": return ( ); default: return (
Предпросмотр для данного типа экрана не поддерживается.
); } }, [previewScreen, selectedIds, formData, handleSelectionChange, handleFormChange]); const preview = useMemo(() => { if (!previewScreen) { return (
Выберите экран для предпросмотра
); } // Используем пропорции современных iPhone (19.5:9 = ~2.17:1) const PREVIEW_WIDTH = 320; const PREVIEW_HEIGHT = Math.round(PREVIEW_WIDTH * 2.17); // ~694px return (
{variants.length > 0 && (
Вариант предпросмотра
)} {/* Mobile Frame - Simple Border */}
{/* Screen Content - Scrollable */}
{renderScreenPreview()}
); }, [previewScreen, renderScreenPreview, variants, previewVariantIndex]); return preview; }