"use client"; import { useMemo } from "react"; import Image from "next/image"; import type { InfoScreenDefinition, DefaultTexts, FunnelAnswers } from "@/lib/funnel/types"; import { TemplateLayout } from "../layouts/TemplateLayout"; import { cn } from "@/lib/utils"; import { createTemplateLayoutProps } from "@/lib/funnel/templateHelpers"; import { substituteVariables } from "@/lib/funnel/variableSubstitution"; interface InfoTemplateProps { screen: InfoScreenDefinition; onContinue: () => void; canGoBack: boolean; onBack: () => void; screenProgress?: { current: number; total: number }; defaultTexts?: DefaultTexts; answers: FunnelAnswers; } export function InfoTemplate({ screen, onContinue, canGoBack, onBack, screenProgress, defaultTexts, answers, }: InfoTemplateProps) { // Подставляем переменные в title и subtitle const processedScreen = useMemo(() => { if (!screen.variables || screen.variables.length === 0) { return screen; } return { ...screen, title: { ...screen.title, text: substituteVariables(screen.title.text, screen.variables, answers), }, subtitle: screen.subtitle ? { ...screen.subtitle, text: substituteVariables(screen.subtitle.text, screen.variables, answers), } : screen.subtitle, }; }, [screen, answers]); const iconSizeClasses = useMemo(() => { const size = processedScreen.icon?.size ?? "xl"; switch (size) { case "sm": return "text-4xl"; case "md": return "text-5xl"; case "lg": return "text-6xl"; case "xl": default: return "text-8xl"; } }, [processedScreen.icon?.size]); // Функция для проверки валидности URL const isValidUrl = (value: string): boolean => { if (!value || value.trim() === '') return false; try { new URL(value); return true; } catch { // Проверяем относительные пути (начинаются с /) и API пути return value.startsWith('/') || value.startsWith('/api/'); } }; // Создаем иконку для передачи в childrenAboveTitle const iconElement = processedScreen.icon ? (