"use client"; import { useCallback, useEffect, useMemo, useState } from "react"; import { useBuilderSelectedScreen, useBuilderState } from "@/lib/admin/builder/context"; import { renderScreen } from "@/lib/funnel/screenRenderer"; import { mergeScreenWithOverrides } from "@/lib/admin/builder/variants"; export function BuilderPreview() { const selectedScreen = useBuilderSelectedScreen(); const builderState = useBuilderState(); const [selectedIds, setSelectedIds] = useState([]); const [previewVariantIndex, setPreviewVariantIndex] = useState(null); useEffect(() => { if (!selectedScreen) { setSelectedIds([]); 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 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; try { // Use the same renderer as FunnelRuntime for 1:1 accuracy return renderScreen({ screen: previewScreen, selectedOptionIds: selectedIds, onSelectionChange: handleSelectionChange, onContinue: () => {}, // Mock continue handler for preview canGoBack: true, // Show back button in preview onBack: () => {}, // Mock back handler for preview screenProgress: { current: 1, total: 10 }, // Mock progress for preview defaultTexts: builderState.defaultTexts, // Use real defaultTexts from builder }); } catch (error) { console.error('Error rendering preview:', error); return (
Ошибка при отображении превью: {error instanceof Error ? error.message : 'Неизвестная ошибка'}
); } }, [previewScreen, selectedIds, handleSelectionChange, builderState.defaultTexts]); const preview = useMemo(() => { if (!previewScreen) { return (
Выберите экран для предпросмотра
); } // Увеличим высоту чтобы кнопка поместилась полностью const PREVIEW_WIDTH = 320; const PREVIEW_HEIGHT = 750; // Увеличено с ~694px до 750px для BottomActionButton return (
{variants.length > 0 && (
Превью варианта
{previewVariantIndex !== null && (
⚠️ Превью принудительно показывает вариант. В реальной воронке он показывается только при выполнении условий.
)}
)} {/* Mobile Frame - Simple Border */}
{/* Screen Content with scroll */}
{renderScreenPreview()}
); }, [previewScreen, renderScreenPreview, variants, previewVariantIndex]); return preview; }