"use client"; import { use, useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { CampaignForm, type CampaignData } from "@/components/campaign-form"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Play } from "lucide-react"; interface CampaignResponse { id: string; name: string; status: string; platforms: string; config: string | null; } export default function CampaignDetailsPage({ params, }: { params: Promise<{ id: string }>; }) { const { id } = use(params); const router = useRouter(); const [campaign, setCampaign] = useState(null); const [launching, setLaunching] = useState(false); const [saved, setSaved] = useState(false); useEffect(() => { fetch(`/api/campaigns/${id}`) .then((r) => r.json()) .then((data) => { setCampaign(data); setSaved(false); }) .catch(() => {}); }, [id]); async function handleLaunch() { setLaunching(true); await fetch(`/api/campaigns/${id}/launch`, { method: "POST" }); router.push(`/campaigns/${id}/pipeline`); } if (!campaign) { return

Loading...

; } const config = campaign.config ? JSON.parse(campaign.config) : {}; const platforms: string[] = JSON.parse(campaign.platforms); const isDraft = campaign.status === "draft"; const initialData: CampaignData = { id: campaign.id, name: campaign.name, platforms, config: { goal: config.goal || "app_downloads", keyMessage: config.keyMessage || "", socialProof: config.socialProof || "", targetAudience: config.targetAudience || "", visualDirection: config.visualDirection || "clean", competitorApps: config.competitorApps || "", variations: config.variations ?? 5, useTrendReport: config.useTrendReport || false, screenshots: config.screenshots || [], }, }; return (
{isDraft && (

Ready to launch?

Review your campaign details below, then launch the pipeline.

)} {!isDraft && (
{campaign.status} Campaign is {campaign.status} — fields are read-only.
)}
{isDraft ? ( ) : ( )}
); } function ReadOnlyDetails({ data }: { data: CampaignData }) { const goalLabels: Record = { app_downloads: "App Downloads", brand_awareness: "Brand Awareness", engagement: "Engagement", }; const visualLabels: Record = { clean: "Clean & Minimal", bold: "Bold & Vibrant", premium: "Premium & Dark", warm: "Warm & Friendly", tech: "Tech & Modern", }; const fields = [ { label: "Campaign Name", value: data.name }, { label: "Platforms", value: data.platforms.map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join(", ") }, { label: "Goal", value: goalLabels[data.config.goal] || data.config.goal }, { label: "Key Message", value: data.config.keyMessage }, { label: "Social Proof", value: data.config.socialProof }, { label: "Target Audience", value: data.config.targetAudience }, { label: "Visual Direction", value: visualLabels[data.config.visualDirection || ""] || data.config.visualDirection }, { label: "Competitor Apps", value: data.config.competitorApps }, { label: "Variations", value: String(data.config.variations ?? 5) }, ]; return (
{fields.map((field) => (
{field.label} {field.value || "—"}
))} {data.config.screenshots && data.config.screenshots.length > 0 && (
Screenshots
{data.config.screenshots.map((path, i) => ( {`Screenshot ))}
)}
); }