// components/forms/PlanForm/CreatePlanForm.tsx 'use client'; import { useRouter } from "next/navigation"; import { useToast } from "@/hooks/use-toast"; import { useEffect, useState, useTransition } from "react"; import { useForm, FormProvider } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { planSchema, type PlanFormValues } from '@/schemas/plan'; import { AdminLayout } from '@/components/admin/AdminLayout'; import { Button } from '@/components/ui/button'; import { BasicInfoSection } from './sections/BasicInfoSection'; import { IncludesSection } from './sections/IncludesSection'; import { ItinerarySection } from './sections/ItinerarySection'; import { PricingSection } from './sections/PricingSection'; import { VideoSection } from './sections/VideoSection'; import { createDraftPlanAction } from '@/app/actions/plan-actions'; import { Loader2, FileText, MapPin, DollarSign, Video, List, ArrowLeft } from 'lucide-react'; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible'; import { ChevronsUpDown } from 'lucide-react'; // Este componente ahora obtendrá los datos del lado del cliente export function CreatePlanForm() { const router = useRouter(); const { toast } = useToast(); const [isCreatingDraft, startTransition] = useTransition(); const form = useForm({ resolver: zodResolver(planSchema), defaultValues: { mainTitle: '', promotionalText: '', itinerary: [], priceOptions: [], }, }); const { formState: { isDirty } } = form; const handleGoBack = () => { router.push('/admin/dashboard/templates/tourism'); }; useEffect(() => { // Si el formulario ha sido modificado y no estamos ya creando un borrador... if (isDirty && !isCreatingDraft) { startTransition(async () => { let toastId: string | undefined; try { toastId = toast({ title: 'Creando borrador...', description: 'Espera un momento, estamos preparando todo para el autoguardado.', }).id; const formData = form.getValues(); const result = await createDraftPlanAction(formData); if (result.success && result.planId) { toast({ title: '¡Borrador creado!', description: 'Ahora todos tus cambios se guardarán automáticamente.', }); // Redirigir a la página de edición del nuevo borrador router.push(`/admin/dashboard/templates/tourism/edit/${result.planId}`); } else { throw new Error(result.error || 'No se pudo inicializar el plan.'); } } catch (error) { toast({ variant: 'destructive', title: 'Error al crear el borrador', description: error instanceof Error ? error.message : 'Error desconocido', }); } finally { if (toastId) { // Opcional: cerrar el toast de "Creando..." si es necesario } } }); } }, [isDirty, isCreatingDraft, startTransition, router, toast]); // Mientras se crea el borrador, mostramos un estado de carga para evitar interacción. if (isCreatingDraft) { return (

Creando borrador y activando autoguardado...

); } return (
{/* Clean editorial background */}
{/* Header */}

Crear Nuevo Plan Turístico

Comienza a escribir para activar el autoguardado

{/* Main Content */}
{/* Información Básica */}

1. Información Básica

Título, descripción y detalles principales

{/* Incluye y No Incluye */}

2. Incluye / No Incluye

Servicios incluidos y exclusiones

{/* Itinerario */}

3. Itinerario Detallado

Actividades día a día

{/* Precios */}

4. Precios y Opciones

Opciones de precios por persona

{/* Video Promocional */}

5. Video Promocional

Video de YouTube (opcional)

); }