"use client"; // ============================================================================ // Create Purchase Page // ============================================================================ import React, { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; import { DashboardHeader } from "@/components/layout/dashboard-header"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Label } from "@/components/ui/label"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { purchasesApi, channelsApi, externalChannelsApi, creativesApi, } from "@/lib/api"; import { AlertCircle, Loader2, ArrowLeft, Info, Copy, Check, } from "lucide-react"; import type { ExternalChannel, Creative } from "@/lib/types/api"; import { useTargetChannel } from "@/components/providers/target-channel-provider"; export default function CreatePurchasePage() { const router = useRouter(); const { selectedChannel } = useTargetChannel(); const [externalChannels, setExternalChannels] = useState( [] ); const [creatives, setCreatives] = useState([]); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const [inviteLink, setInviteLink] = useState(""); const [copied, setCopied] = useState(false); const [formData, setFormData] = useState({ external_channel_id: "", creative_id: "", placement_date: "", cost: "", comment: "", post_link: "", invite_link_type: "public" as "public" | "approval", }); useEffect(() => { if (selectedChannel) { loadData(); } }, [selectedChannel]); const loadData = async () => { if (!selectedChannel) return; try { const [externalChannelsRes, creativesRes] = await Promise.all([ externalChannelsApi.list(selectedChannel.id), creativesApi.list({ target_channel_id: selectedChannel.id }), ]); setExternalChannels(externalChannelsRes.external_channels); setCreatives( creativesRes.creatives.filter((c) => c.status === "active") ); } catch (err) { console.error("Error loading data:", err); } }; const selectedCreative = creatives.find((c) => c.id === formData.creative_id); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); // Validation if (!selectedChannel) { setError("Выберите целевой канал в верхнем меню"); return; } if (!formData.external_channel_id) { setError("Выберите внешний канал"); return; } if (!formData.creative_id) { setError("Выберите креатив"); return; } if (!formData.placement_date) { setError("Укажите дату размещения"); return; } if (!formData.cost || parseFloat(formData.cost) <= 0) { setError("Укажите корректную стоимость"); return; } try { setIsLoading(true); const result = await purchasesApi.create({ target_channel_id: selectedChannel.id, external_channel_id: formData.external_channel_id, creative_id: formData.creative_id, placement_date: formData.placement_date, cost: parseFloat(formData.cost), comment: formData.comment || undefined, ad_post_url: formData.post_link || undefined, invite_link_type: formData.invite_link_type, }); // Показываем сгенерированную ссылку setInviteLink(result.invite_link); } catch (err: any) { setError(err?.error?.message || "Ошибка создания закупа"); } finally { setIsLoading(false); } }; const handleCopyLink = () => { navigator.clipboard.writeText(inviteLink); setCopied(true); setTimeout(() => setCopied(false), 2000); }; const handleCopyMessage = () => { if (!selectedCreative) return; const message = selectedCreative.text.replace("{link}", inviteLink); navigator.clipboard.writeText(message); setCopied(true); setTimeout(() => setCopied(false), 2000); }; if (inviteLink) { const messageText = selectedCreative ? selectedCreative.text.replace("{link}", inviteLink) : ""; return ( <>
Закуп успешно создан! Используйте ссылку и готовое сообщение для размещения