import { doctor_api } from "@/features/doctors/lib/api"; import { pharmacies_api } from "@/features/pharmacies/lib/api"; import { plans_api } from "@/features/plans/lib/api"; import type { PlanCreateReq, PlanListData, PlanUpdateReq, } from "@/features/plans/lib/data"; import { createPlanFormData } from "@/features/plans/lib/form"; import { user_api } from "@/features/users/lib/api"; import formatDate from "@/shared/lib/formatDate"; import { cn } from "@/shared/lib/utils"; import { Button } from "@/shared/ui/button"; import { Calendar } from "@/shared/ui/calendar"; 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 { Textarea } from "@/shared/ui/textarea"; import { zodResolver } from "@hookform/resolvers/zod"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import type { AxiosError } from "axios"; import { Check, ChevronDownIcon, ChevronsUpDown, Loader2 } from "lucide-react"; import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import z from "zod"; interface Props { initialValues?: PlanListData | null; setDialogOpen: (open: boolean) => void; } const AddedPlan = ({ initialValues, setDialogOpen }: Props) => { const form = useForm>({ resolver: zodResolver(createPlanFormData), defaultValues: { name: initialValues?.title || "", description: initialValues?.description || "", user: initialValues ? String(initialValues.user.id) : "", date: initialValues ? initialValues?.date : "", }, }); const [type, setType] = useState<"DOCTOR" | "PHARM">("DOCTOR"); const [long, setLong] = useState(41.233); const [lat, setLat] = useState(63.233); const [searchUser, setSearchUser] = useState(""); const [openUser, setOpenUser] = useState(false); const [searchDoctor, setSearchDoctor] = useState(""); const [openDoctor, setOpenDoctor] = useState(false); const [searchPharm, setSearchPharm] = useState(""); const [openPharm, setOpenPharm] = useState(false); const queryClient = useQueryClient(); const [open, setOpen] = useState(false); const { data: user, isLoading: isUserLoading } = useQuery({ queryKey: ["user_list", searchUser], queryFn: () => { const params: { limit?: number; offset?: number; search?: string; is_active?: boolean | string; region_id?: number; } = { limit: 8, search: searchUser, }; return user_api.list(params); }, select(data) { return data.data.data; }, }); const user_id = form.watch("user"); const { data: doctor, isLoading: isDoctorLoading } = useQuery({ queryKey: ["doctor_list", searchDoctor, user_id], queryFn: () => { const params: { limit?: number; offset?: number; user_id?: number; full_name?: string; } = { limit: 8, full_name: searchDoctor, user_id: Number(user_id), }; return doctor_api.list(params); }, select(data) { return data.data.data; }, }); const { data: pharm, isLoading: isPharmLoading } = useQuery({ queryKey: ["pharm_list", searchPharm, user_id], queryFn: () => { const params: { limit?: number; offset?: number; user_id?: number; name?: string; } = { limit: 8, name: searchPharm, user_id: Number(user_id), }; return pharmacies_api.list(params); }, select(data) { return data.data.data; }, }); const { mutate, isPending } = useMutation({ mutationFn: (body: PlanCreateReq) => plans_api.create(body), onSuccess: () => { setDialogOpen(false); toast.success("Reja qo'shildi"); queryClient.refetchQueries({ queryKey: ["plan_list"] }); }, 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: edit, isPending: editPending } = useMutation({ mutationFn: ({ body, id }: { body: PlanUpdateReq; id: number }) => plans_api.update({ body, id }), onSuccess: () => { setDialogOpen(false); toast.success("Reja tahrirlandi"); queryClient.refetchQueries({ queryKey: ["plan_list"] }); }, 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", }); }, }); function onSubmit(data: z.infer) { if (initialValues) { edit({ body: { date: formatDate.format(data.date, "YYYY-MM-DD"), description: data.description, extra_location: { latitude: initialValues.latitude, longitude: initialValues.longitude, }, latitude: initialValues.latitude, longitude: initialValues.longitude, title: data.name, }, id: initialValues.id, }); } else { mutate({ date: formatDate.format(data.date, "YYYY-MM-DD"), description: data.description, extra_location: { latitude: lat, longitude: long, }, latitude: lat, longitude: long, title: data.name, doctor_id: data.doctor_id ? Number(data.doctor_id) : null, pharmacy_id: data.pharmacy_id ? Number(data.pharmacy_id) : null, user_id: Number(data.user), }); } } return (
{ const selectedUser = user?.results.find( (u) => String(u.id) === field.value, ); return ( {isUserLoading ? (
) : user && user.results.length > 0 ? ( {user.results.map((u) => ( { field.onChange(String(u.id)); setOpenUser(false); }} > {u.first_name} {u.last_name} {u.region?.name} ))} ) : ( Foydalanuvchi topilmadi )}
); }} />
{type === "DOCTOR" && ( { const selectedUser = doctor?.results.find( (u) => String(u.id) === field.value, ); return ( {isDoctorLoading ? (
) : doctor && doctor.results.length > 0 ? ( {doctor.results.map((u) => ( { field.onChange(String(u.id)); setOpenDoctor(false); setLat(u.latitude); setLong(u.longitude); form.setValue("pharmacy_id", undefined); }} > {u.first_name} {u.last_name} ))} ) : ( Shifokor topilmadi )}
); }} /> )} {type === "PHARM" && ( { const selectedUser = pharm?.results.find( (u) => String(u.id) === field.value, ); return ( {isPharmLoading ? (
) : pharm && pharm.results.length > 0 ? ( {pharm.results.map((u) => ( { field.onChange(String(u.id)); setOpenPharm(false); setLat(u.latitude); setLong(u.longitude); form.setValue("doctor_id", undefined); }} > {u.name} ))} ) : ( Dorixona topilmadi )}
); }} /> )} ( )} /> (