import { createOfferta, deleteOfferta, getAllOfferta, getOneOfferta, updateOfferta, } from "@/pages/site-page/lib/api"; import { Button } from "@/shared/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/shared/ui/card"; import { Dialog, DialogContent, DialogDescription, DialogTitle, DialogTrigger, } from "@/shared/ui/dialog"; import { Input } from "@/shared/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/shared/ui/select"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { Edit2, Trash2 } from "lucide-react"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import ReactQuill from "react-quill-new"; import "react-quill-new/dist/quill.snow.css"; import { toast } from "sonner"; export default function OmmaviyOfertaCRUD() { const { t } = useTranslation(); const [deleteOpen, setDeleteOpen] = useState(false); const queryClient = useQueryClient(); const [editing, setEditing] = useState(null); const [form, setForm] = useState<{ title: string; content: string; audience: string; active: boolean; }>({ title: "", audience: "Jismoniy shaxslar", content: "", active: true, }); const [errors, setErrors] = useState>({}); function resetForm() { setForm({ title: "", audience: "Jismoniy shaxslar", content: "", active: true, }); setErrors({}); setEditing(null); } const { mutate: create } = useMutation({ mutationFn: (body: { title: string; content: string; person_type: "individual" | "legal_entity"; is_active: boolean; }) => createOfferta({ body }), onSuccess: () => { resetForm(); queryClient.refetchQueries({ queryKey: ["all_offerta"] }); queryClient.refetchQueries({ queryKey: ["detail_offerta"] }); toast.success(t("Muvaffaqiyatli yaratildi"), { position: "top-center", richColors: true, }); }, onError: () => { toast.error(t("Xatolik yuz berdi"), { position: "top-center", richColors: true, }); }, }); const { mutate: update } = useMutation({ mutationFn: ({ body, id, }: { body: { title?: string; content?: string; person_type?: "individual" | "legal_entity"; is_active?: boolean; }; id: number; }) => updateOfferta({ body, id }), onSuccess: () => { resetForm(); setEditing(null); queryClient.refetchQueries({ queryKey: ["all_offerta"] }); queryClient.refetchQueries({ queryKey: ["detail_offerta"] }); toast.success(t("Muvaffaqiyatli yangilandi"), { position: "top-center", richColors: true, }); }, onError: () => { toast.error(t("Xatolik yuz berdi"), { position: "top-center", richColors: true, }); }, }); const { mutate: removeOfferta } = useMutation({ mutationFn: ({ id }: { id: number }) => deleteOfferta(id), onSuccess: () => { resetForm(); queryClient.refetchQueries({ queryKey: ["all_offerta"] }); queryClient.refetchQueries({ queryKey: ["detail_offerta"] }); toast.success(t("Muvaffaqiyatli o'chirildi"), { position: "top-center", richColors: true, }); }, onError: () => { toast.error(t("Xatolik yuz berdi"), { position: "top-center", richColors: true, }); }, }); const { data: allOfferta } = useQuery({ queryKey: ["all_offerta"], queryFn: () => { return getAllOfferta({ page: 1, page_size: 99 }); }, select(data) { return data.data.data; }, }); const { data: detailOfferta } = useQuery({ queryKey: ["detail_offerta", editing], queryFn: () => { return getOneOfferta(editing!); }, select(data) { return data.data.data; }, enabled: !!editing, }); useEffect(() => { if (editing && detailOfferta) { setForm({ active: detailOfferta.is_active, audience: detailOfferta.person_type === "individual" ? "Jismoniy shaxslar" : "Yuridik shaxslar", content: detailOfferta.content, title: detailOfferta.title, }); } }, [detailOfferta, editing]); function handleCreateOrUpdate() { const newErrors: Record = {}; if (!form.title.trim()) { newErrors.title = "Sarlavha kiritish majburiy"; } else if (form.title.trim().length < 3) { newErrors.title = "Sarlavha kamida 3 ta belgidan iborat bo'lishi kerak"; } const plainText = form.content.replace(/<[^>]+>/g, "").trim(); if (!plainText) { newErrors.content = "Kontent kiritish majburiy"; } else if (plainText.length < 10) { newErrors.content = "Kontent kamida 10 ta belgidan iborat bo'lishi kerak"; } if (!form.audience) { newErrors.audience = "Kimlar uchun degan maydonni tanlang"; } setErrors(newErrors); if (Object.keys(newErrors).length > 0) { toast.error(t("Iltimos, barcha majburiy maydonlarni to'ldiring"), { position: "top-center", }); return; } if (editing === null) { create({ content: form.content, is_active: form.active, person_type: form.audience === "Jismoniy shaxslar" ? "individual" : "legal_entity", title: form.title, }); } else if (editing) { update({ body: { content: form.content, is_active: form.active, person_type: form.audience === "Jismoniy shaxslar" ? "individual" : "legal_entity", title: form.title, }, id: editing, }); } } function startEdit(item: number) { setEditing(item); } function removeItem(id: number) { removeOfferta({ id }); } function toggleActive(id: number, currentStatus: boolean) { update({ id: id, body: { is_active: !currentStatus, }, }); } return (

{t("Ommaviy oferta")}

{editing ? t("Tahrirlash") : t("Yangi oferta yaratish")}
setForm((s) => ({ ...s, title: e.target.value })) } placeholder={t("Ommaviy oferta sarlavhasi")} className="mt-1" /> {errors.title && (

{t(errors.title)}

)}
setForm((s) => ({ ...s, content: value })) } className="bg-gray-900 h-48" placeholder={t("Oferta matnini kiriting...")} />
{errors.content && (

{t(errors.content)}

)}
{errors.audience && (

{t(errors.audience)}

)}
{allOfferta && allOfferta?.results.length === 0 && (

{t("Natija topilmadi.")}

)} {allOfferta?.results.map((it) => (

{it.title}

{it.person_type == "individual" ? t("Jismoniy shaxslar uchun") : t("Yuridik shaxslar uchun")}

{it.content}

{t("O'chirish tasdiqlash")} {t( "Haqiqatan ham bu ofertani o'chirmoqchimisiz? Bu amalni bekor qilib bo'lmaydi.", )}
))}
); }