"use client"; import { useState } from "react"; import { ChevronDown, ChevronRight } from "lucide-react"; import { TextAreaInput } from "@/components/ui/TextAreaInput/TextAreaInput"; import type { TrialChoiceScreenDefinition, ArrowHintPosition, AccentedOptionSetting } from "@/lib/funnel/types"; import type { BuilderScreen } from "@/lib/admin/builder/types"; interface TrialChoiceScreenConfigProps { screen: BuilderScreen & { template: "trialChoice" }; onUpdate: (updates: Partial) => void; } const ARROW_POSITION_OPTIONS: { value: ArrowHintPosition; label: string }[] = [ { value: "bottom-right", label: "Снизу справа" }, { value: "bottom-left", label: "Снизу слева" }, { value: "top-right", label: "Сверху справа" }, { value: "top-left", label: "Сверху слева" }, ]; const ACCENTED_OPTION_OPTIONS: { value: AccentedOptionSetting; label: string }[] = [ { value: "server", label: "С сервера (по умолчанию)" }, { value: 1, label: "Вариант 1" }, { value: 2, label: "Вариант 2" }, { value: 3, label: "Вариант 3" }, { value: 4, label: "Вариант 4" }, ]; function CollapsibleSection({ title, children, defaultExpanded = false, }: { title: string; children: React.ReactNode; defaultExpanded?: boolean; }) { const storageKey = `trial-choice-section-${title.toLowerCase().replace(/\s+/g, "-")}`; const [isExpanded, setIsExpanded] = useState(() => { if (typeof window === "undefined") return defaultExpanded; const stored = sessionStorage.getItem(storageKey); return stored !== null ? JSON.parse(stored) : defaultExpanded; }); const handleToggle = () => { const newExpanded = !isExpanded; setIsExpanded(newExpanded); if (typeof window !== "undefined") { sessionStorage.setItem(storageKey, JSON.stringify(newExpanded)); } }; return (
{isExpanded &&
{children}
}
); } export function TrialChoiceScreenConfig({ screen, onUpdate, }: TrialChoiceScreenConfigProps) { const trialChoiceScreen = screen as TrialChoiceScreenDefinition; const arrowHint = trialChoiceScreen.arrowHint; // Для корректной работы с вариантами, передаем полный объект arrowHint // чтобы diff/merge функции корректно обрабатывали изменения const handleArrowHintTextChange = (text: string) => { onUpdate({ arrowHint: { text, position: arrowHint?.position ?? "bottom-right", }, }); }; const handleArrowHintPositionChange = (position: ArrowHintPosition) => { onUpdate({ arrowHint: { text: arrowHint?.text ?? "", position, }, }); }; return (
{/* Текст подсказки */}
handleArrowHintTextChange(event.target.value)} rows={3} className="resize-y" placeholder="Введите текст подсказки..." />

Доступные переменные:

{"{{maxTrialPrice}}"} — максимальная цена триала

Переменная автоматически заменяется на форматированную цену самого дорогого варианта триала.

{/* Позиция стрелки */}

Определяет на какой угол сетки вариантов указывает стрелка. При выборе позиции сверху стрелка и текст отображаются над сеткой.

Выберите какой вариант триала будет подсвечен. Если выбранный номер больше количества вариантов с сервера, будет использована серверная логика.

); }