"use client"; import { bannerDelete, createBanner, getBanner, getBannerDetail, updateBanner, } from "@/pages/site-banner/lib/api"; import TicketsImagesModel from "@/pages/tours/ui/TicketsImagesModel"; import { Badge } from "@/shared/ui/badge"; import { Button } from "@/shared/ui/button"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "@/shared/ui/dialog"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/shared/ui/form"; import { Input } from "@/shared/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/shared/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/shared/ui/table"; import { Textarea } from "@/shared/ui/textarea"; import { zodResolver } from "@hookform/resolvers/zod"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { AlertTriangle, ChevronLeft, ChevronRight, Edit2, Loader2, Plus, Trash2, } from "lucide-react"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useSearchParams } from "react-router-dom"; import { toast } from "sonner"; import { z } from "zod"; const fileSchema = z.union([ z.instanceof(File, { message: "Rasm faylini yuklang" }), z.string().min(1, { message: "Rasm faylini yuklang" }), ]); const bannerSchema = z.object({ title: z .string() .min(3, "Sarlavha kamida 3 ta belgidan iborat bo‘lishi kerak"), title_ru: z .string() .min(3, "Sarlavha kamida 3 ta belgidan iborat bo‘lishi kerak"), description: z .string() .min(5, "Tavsif kamida 5 ta belgidan iborat bo‘lishi kerak"), description_ru: z .string() .min(5, "Tavsif kamida 5 ta belgidan iborat bo‘lishi kerak"), image: fileSchema, link: z.string().url("Yaroqli havola URL manzili kiriting"), position: z.string().min(1, "Pozitsiyani tanlang"), }); type BannerFormData = z.infer; const positions = [ { value: "banner1", label: "Asosiy" }, { value: "banner2", label: "Kun taklifi" }, { value: "banner3", label: "Mashhur yo‘nalishlar" }, { value: "banner4", label: "Reytingi baland turlar" }, ]; const SiteBannerAdmin = () => { const [searchParams, setSearchParams] = useSearchParams(); const initialPage = Number(searchParams.get("page")) || 1; const [page, setPage] = useState(initialPage); const updatePage = (newPage: number) => { setPage(newPage); setSearchParams({ page: newPage.toString() }); }; const { data: banner, isLoading, isError, refetch, } = useQuery({ queryKey: ["all_banner", page], queryFn: () => getBanner({ page, page_size: 20 }), select(data) { return data.data.data; }, }); const { t } = useTranslation(); const queryClient = useQueryClient(); const [open, setOpen] = useState(false); const [editingBanner, setEditingBanner] = useState(null); const [deleteId, setDeleteId] = useState(null); const form = useForm({ resolver: zodResolver(bannerSchema), defaultValues: { title: "", description: "", image: "", link: "", position: "banner1", }, }); const { data: bannerDetail } = useQuery({ queryKey: ["detail_banner", editingBanner], queryFn: () => getBannerDetail(editingBanner!), select(data) { return data.data.data; }, enabled: !!editingBanner, }); useEffect(() => { if (editingBanner && bannerDetail) { form.setValue("title", bannerDetail.title_uz); form.setValue("title_ru", bannerDetail.title_ru); form.setValue("description", bannerDetail.description_uz); form.setValue("description_ru", bannerDetail.description_ru); form.setValue("image", bannerDetail.image); form.setValue("link", bannerDetail.link); form.setValue("position", bannerDetail.position); } }, [bannerDetail, editingBanner]); const { mutate: create, isPending } = useMutation({ mutationFn: (body: FormData) => createBanner(body), onSuccess: () => { queryClient.refetchQueries({ queryKey: ["all_banner"] }); queryClient.refetchQueries({ queryKey: ["detail_banner"] }); setOpen(false); form.reset(); }, onError: () => { toast.error(t("Xatolik yuz berdi"), { richColors: true, position: "top-center", }); }, }); const { mutate: update, isPending: updatePending } = useMutation({ mutationFn: ({ body, id }: { id: number; body: FormData }) => updateBanner({ body, id }), onSuccess: () => { queryClient.refetchQueries({ queryKey: ["all_banner"] }); queryClient.refetchQueries({ queryKey: ["detail_banner"] }); setOpen(false); form.reset(); }, onError: () => { toast.error(t("Xatolik yuz berdi"), { richColors: true, position: "top-center", }); }, }); const { mutate: deletBanner, isPending: deletePending } = useMutation({ mutationFn: ({ id }: { id: number }) => bannerDelete(id), onSuccess: () => { queryClient.refetchQueries({ queryKey: ["all_banner"] }); queryClient.refetchQueries({ queryKey: ["detail_banner"] }); }, onError: () => { toast.error(t("Xatolik yuz berdi"), { richColors: true, position: "top-center", }); }, }); const handleOpen = (banner: number) => { setOpen(true); setEditingBanner(banner); }; const onSubmit = (values: BannerFormData) => { const formData = new FormData(); formData.append("title", values.title); formData.append("title_ru", values.title_ru); formData.append("description", values.description); formData.append("description_ru", values.description_ru); if (values.image instanceof File) { formData.append("image", values.image); } formData.append("link", values.link); formData.append("position", values.position); if (editingBanner) { update({ body: formData, id: editingBanner, }); } else { create(formData); } }; const handleDelete = (id: number) => { deletBanner({ id }); setDeleteId(id); }; if (isLoading) { return (

{t("Ma'lumotlar yuklanmoqda...")}

); } if (isError) { return (

{t("Ma'lumotlarni yuklashda xatolik yuz berdi.")}

); } return (

{t("Sayt Bannerlari")}

{t("Bannerlarni boshqarish")}

ID {t("Rasm")} {t("Sarlavha")} {t("Tavsif")} {t("Joylashuvi")} {t("Amallar")} {banner && banner.results.length === 0 ? (

{t("Hozircha bannerlar mavjud emas")}

) : ( banner && banner.results.map((item) => ( {item.id} {item.title} {item.title} {item.description} {t( positions.find((p) => p.value === item.position) ?.label ?? "", )} )) )}
{[...Array(banner?.total_pages)].map((_, i) => { const pageNum = i + 1; return ( ); })}
{editingBanner ? t("Bannerni tahrirlash") : t("Yangi banner qo'shish")}
( {t("Sarlavha")} )} /> ( {t("Sarlavha")} (ru) )} /> ( {t("Tavsif")}