"use client"; import { useId, useRef } from "react"; import { Button } from "@/components/ui/button"; import { serializeBuilderState, deserializeFunnelDefinition } from "@/lib/admin/builder/utils"; import { useBuilderDispatch, useBuilderState } from "@/lib/admin/builder/context"; import type { BuilderState } from "@/lib/admin/builder/context"; interface BuilderTopBarProps { onNew: () => void; onExport: (json: string) => void; onLoadError?: (message: string) => void; } export function BuilderTopBar({ onNew, onExport, onLoadError }: BuilderTopBarProps) { const dispatch = useBuilderDispatch(); const state = useBuilderState(); const fileInputId = useId(); const fileInputRef = useRef(null); const handleExport = () => { const json = JSON.stringify(serializeBuilderState(state), null, 2); onExport(json); }; const handleFileChange = async (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (!file) { return; } try { const text = await file.text(); const parsed = JSON.parse(text); const builderState = deserializeFunnelDefinition(parsed); dispatch({ type: "reset", payload: builderState as BuilderState }); } catch (error) { onLoadError?.(error instanceof Error ? error.message : "Не удалось загрузить JSON"); } finally { if (fileInputRef.current) { fileInputRef.current.value = ""; } } }; return (

Funnel Builder

Соберите воронку, редактируйте экраны и экспортируйте JSON для рантайма.

); }