import { hotelFeatureCreate, hotelFeatureDelete, hotelFeatureDetail, hotelFeatureUpdate, } from "@/pages/tours/lib/api"; import { FeatureColumns } from "@/pages/tours/lib/column"; import type { HotelFeatures } from "@/pages/tours/lib/type"; import { Button } from "@/shared/ui/button"; import { Dialog, DialogContent } from "@/shared/ui/dialog"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/shared/ui/form"; import { Input } from "@/shared/ui/input"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/shared/ui/table"; import RealPagination from "@/widgets/real-pagination/ui/RealPagination"; import { zodResolver } from "@hookform/resolvers/zod"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { flexRender, getCoreRowModel, useReactTable, } from "@tanstack/react-table"; import { Loader, PlusIcon } from "lucide-react"; import { useEffect, useState, type Dispatch, type SetStateAction } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import z from "zod"; const formSchema = z.object({ name: z.string().min(1, { message: "Majburiy maydon" }), name_ru: z.string().min(1, { message: "Majburiy maydon" }), }); const FeaturesTable = ({ data, page, pageSize, setActiveTab, setFeatureId, }: { page: number; pageSize: number; setActiveTab: Dispatch>; setFeatureId: Dispatch>; data: | { links: { previous: string; next: string; }; total_items: number; total_pages: number; page_size: number; current_page: number; results: HotelFeatures[]; } | undefined; }) => { const { t } = useTranslation(); const [open, setOpen] = useState(false); const [editId, setEditId] = useState(null); const queryClient = useQueryClient(); const [types, setTypes] = useState<"edit" | "create">("create"); const handleEdit = (id: number) => { setTypes("edit"); setOpen(true); setEditId(id); }; const { data: badgeDetail } = useQuery({ queryKey: ["detail_feature", editId], queryFn: () => hotelFeatureDetail({ id: editId! }), enabled: !!editId, }); const { mutate: deleteMutate } = useMutation({ mutationFn: ({ id }: { id: number }) => hotelFeatureDelete({ id }), onSuccess: () => { queryClient.refetchQueries({ queryKey: ["detail_feature"] }); queryClient.refetchQueries({ queryKey: ["all_feature"] }); setOpen(false); form.reset(); }, onError: () => { toast.error(t("Xatolik yuz berdi"), { position: "top-center", richColors: true, }); }, }); const handleDelete = (id: number) => { deleteMutate({ id }); }; const columns = FeatureColumns( handleEdit, handleDelete, t, setActiveTab, setFeatureId, ); const { mutate: create, isPending } = useMutation({ mutationFn: ({ body, }: { body: { hotel_feature_type_name: string; hotel_feature_type_name_ru: string; }; }) => hotelFeatureCreate({ body }), onSuccess: () => { queryClient.refetchQueries({ queryKey: ["detail_feature"] }); queryClient.refetchQueries({ queryKey: ["all_feature"] }); setOpen(false); form.reset(); }, onError: () => { toast.error(t("Xatolik yuz berdi"), { position: "top-center", richColors: true, }); }, }); const { mutate: update, isPending: updatePending } = useMutation({ mutationFn: ({ body, id, }: { id: number; body: { hotel_feature_type_name: string; hotel_feature_type_name_ru: string; }; }) => hotelFeatureUpdate({ body, id }), onSuccess: () => { queryClient.refetchQueries({ queryKey: ["detail_feature"] }); queryClient.refetchQueries({ queryKey: ["all_feature"] }); setOpen(false); form.reset(); }, onError: () => { toast.error(t("Xatolik yuz berdi"), { position: "top-center", richColors: true, }); }, }); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { name: "", name_ru: "", }, }); useEffect(() => { if (badgeDetail) { form.setValue("name", badgeDetail.data.data.hotel_feature_type_name_uz); form.setValue( "name_ru", badgeDetail.data.data.hotel_feature_type_name_ru, ); } }, [editId, badgeDetail]); function onSubmit(values: z.infer) { if (types === "create") { create({ body: { hotel_feature_type_name: values.name, hotel_feature_type_name_ru: values.name_ru, }, }); } else if (types === "edit" && editId) { update({ id: editId, body: { hotel_feature_type_name: values.name, hotel_feature_type_name_ru: values.name_ru, }, }); } } const table = useReactTable({ data: data?.results ?? [], columns, getCoreRowModel: getCoreRowModel(), manualPagination: true, pageCount: data?.total_pages ?? 0, state: { pagination: { pageIndex: page - 1, pageSize: pageSize, }, }, }); return ( <>
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext(), )} ))} ))} {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender( cell.column.columnDef.cell, cell.getContext(), )} ))} )) ) : ( {t("Ma'lumot topilmadi")} )}

{types === "create" ? t("Saqlash") : t("Tahrirlash")}

( {t("Nomi")} )} /> ( {t("Nomi (ru)")} )} />
); }; export default FeaturesTable;