import { discrit_api } from "@/features/districts/lib/api"; import type { DistrictListData } from "@/features/districts/lib/data"; import { addDistrict } from "@/features/districts/lib/form"; import { user_api } from "@/features/users/lib/api"; import { cn } from "@/shared/lib/utils"; import { Button } from "@/shared/ui/button"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "@/shared/ui/command"; import { Form, FormControl, FormField, FormItem, FormMessage, } from "@/shared/ui/form"; import { Input } from "@/shared/ui/input"; import { Label } from "@/shared/ui/label"; import { Popover, PopoverContent, PopoverTrigger } from "@/shared/ui/popover"; import { zodResolver } from "@hookform/resolvers/zod"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import type { AxiosError } from "axios"; import { Check, ChevronsUpDown, Loader2 } from "lucide-react"; import { useState, type Dispatch, type SetStateAction } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import z from "zod"; type FormValues = z.infer; interface Props { initialValues: DistrictListData | null; setDialogOpen: Dispatch>; } export default function AddDistrict({ initialValues, setDialogOpen }: Props) { const [openUser, setOpenUser] = useState(false); const [userSearch, setUserSearch] = useState(""); const queryClient = useQueryClient(); const { data: user, isLoading: isUserLoading } = useQuery({ queryKey: ["user_list", userSearch], queryFn: () => user_api.list({ search: userSearch }), select(data) { return data.data.data.results; }, }); const { mutate, isPending } = useMutation({ mutationFn: (body: { name: string; user_id: number }) => discrit_api.create(body), onSuccess: () => { queryClient.refetchQueries({ queryKey: ["discrit_list"] }); toast.success(`Tuman qo'shildi`); setDialogOpen(false); }, onError: (err: AxiosError) => { const errMessage = err.response?.data as { message: string }; const messageText = errMessage.message; toast.error(messageText || "Xatolik yuz berdi", { richColors: true, position: "top-center", }); }, }); const { mutate: update, isPending: updatePending } = useMutation({ mutationFn: ({ body, id, }: { id: number; body: { name: string; user: number }; }) => discrit_api.update({ body, id }), onSuccess: () => { queryClient.refetchQueries({ queryKey: ["discrit_list"] }); toast.success(`Tuman qo'shildi`); setDialogOpen(false); }, onError: (err: AxiosError) => { const errMessage = err.response?.data as { message: string }; const messageText = errMessage.message; toast.error(messageText || "Xatolik yuz berdi", { richColors: true, position: "top-center", }); }, }); const form = useForm({ resolver: zodResolver(addDistrict), defaultValues: { name: initialValues?.name ?? "", userId: initialValues ? String(initialValues.user.id) : "", }, }); function onSubmit(values: FormValues) { if (initialValues) { update({ id: initialValues.id, body: { name: values.name, user: Number(values.userId), }, }); } else { mutate({ name: values.name, user_id: Number(values.userId) }); } } return (
( )} /> { const selectedUser = user?.find( (u) => String(u.id) === field.value, ); return ( {isUserLoading ? (
) : user && user.length > 0 ? ( {user.map((u) => ( { field.onChange(String(u.id)); setOpenUser(false); }} > {u.first_name} {u.last_name} {u.region.name} ))} ) : ( Foydalanuvchi topilmadi )}
); }} /> ); }