"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 { TargetChannel, ExternalChannel, Creative } from "@/lib/types/api"; export default function CreatePurchasePage() { const router = useRouter(); const [channels, setChannels] = useState([]); 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({ target_channel_id: "", external_channel_id: "", creative_id: "", scheduled_date: "", cost: "", comment: "", post_link: "", invite_link_type: "public" as "public" | "private", }); useEffect(() => { loadData(); }, []); const loadData = async () => { try { const [channelsRes, externalChannelsRes, creativesRes] = await Promise.all([ channelsApi.list({ is_active: true }), externalChannelsApi.list(), creativesApi.list(), ]); setChannels(channelsRes.data); setExternalChannels(externalChannelsRes.data); setCreatives(creativesRes.data.filter((c) => !c.is_archived)); } catch (err) { console.error("Error loading data:", err); } }; // Фильтр креативов по выбранному целевому каналу const filteredCreatives = formData.target_channel_id ? creatives.filter( (c) => c.target_channel_id === formData.target_channel_id ) : creatives; const selectedCreative = creatives.find((c) => c.id === formData.creative_id); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); // Validation if (!formData.target_channel_id) { setError("Выберите целевой канал"); return; } if (!formData.external_channel_id) { setError("Выберите внешний канал"); return; } if (!formData.creative_id) { setError("Выберите креатив"); return; } if (!formData.scheduled_date) { setError("Укажите дату размещения"); return; } if (!formData.cost || parseFloat(formData.cost) <= 0) { setError("Укажите корректную стоимость"); return; } try { setIsLoading(true); const result = await purchasesApi.create({ target_channel_id: formData.target_channel_id, external_channel_id: formData.external_channel_id, creative_id: formData.creative_id, scheduled_date: formData.scheduled_date, cost: parseFloat(formData.cost), comment: formData.comment || undefined, post_link: 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 ( <>
Закуп успешно создан! Используйте ссылку и готовое сообщение для размещения