"use client"; import { district_api } from "@/features/district/lib/api"; import { doctor_api } from "@/features/doctor/lib/api"; import { location_api, type CreateLocation } from "@/features/home/lib/api"; import { object_api } from "@/features/object/lib/api"; import { pharmacy_api } from "@/features/phamarcy/lib/api"; import { Button } from "@/shared/ui/button"; import { Card, CardDescription, CardHeader, CardTitle } from "@/shared/ui/card"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/shared/ui/dialog"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/shared/ui/table"; import { DashboardLayout } from "@/widgets/dashboard-layout/ui"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from "@tanstack/react-table"; import { AxiosError } from "axios"; import { Loader2, MapPin, Send } from "lucide-react"; import React, { useState } from "react"; import { toast } from "sonner"; import { columns } from "../lib/column"; const MyLocation: React.FC = () => { const [showMainModal, setShowMainModal] = useState(false); const queryClinent = useQueryClient(); const [showSelectModal, setShowSelectModal] = useState(false); const [selectType, setSelectType] = useState< "district" | "object" | "doctor" | "pharm" | null >(null); const [loadingButtonId, setLoadingButtonId] = useState(null); const mutation = useMutation({ mutationFn: (body: CreateLocation) => location_api.create_location(body), onSuccess: () => { toast.success("Lokatsiya jo'natildi"); setShowSelectModal(false); setLoadingButtonId(null); queryClinent.refetchQueries({ queryKey: ["location_list"] }); }, onError: (error: AxiosError) => { const data = error.response?.data as { message?: string }; const errorData = error.response?.data as { messages?: { token_class: string; token_type: string; message: string; }[]; }; const errorName = error.response?.data as { data?: { name: string[]; }; }; const message = Array.isArray(errorName.data?.name) && errorName.data.name.length ? errorName.data.name[0] : data?.message || (Array.isArray(errorData?.messages) && errorData.messages.length ? errorData.messages[0].message : undefined) || "Xatolik yuz berdi"; toast.error(message); }, }); const { data: location } = useQuery({ queryKey: ["location_list"], queryFn: () => location_api.list_location(), select(data) { return data.data.data; }, }); const { data: districts, isLoading: isDistrictsLoading } = useQuery({ queryKey: ["my_disctrict"], queryFn: () => district_api.getDiscrict(), select: (data) => data.data.data, }); const { data: objects, isLoading: isObjectsLoading } = useQuery({ queryKey: ["object_list"], queryFn: () => object_api.getAll({}), select: (data) => data.data.data, }); const { data: doctors, isLoading: isDoctorsLoading } = useQuery({ queryKey: ["doctor_list"], queryFn: () => doctor_api.list(), select: (data) => data.data.data, }); const { data: pharm, isLoading: isPharmLoading } = useQuery({ queryKey: ["pharmacy_list"], queryFn: () => pharmacy_api.list(), select: (data) => data.data.data, }); const getOptions = () => { if (selectType === "district") return districts; if (selectType === "object") return objects; if (selectType === "doctor") return doctors; if (selectType === "pharm") return pharm; return []; }; const isLoading = () => { if (selectType === "district") return isDistrictsLoading; if (selectType === "object") return isObjectsLoading; if (selectType === "doctor") return isDoctorsLoading; if (selectType === "pharm") return isPharmLoading; return false; }; const typeLabel = (type: "district" | "object" | "doctor" | "pharm") => { if (type === "district") return "Tuman"; if (type === "object") return "Obyekt"; if (type === "doctor") return "Shifokor"; if (type === "pharm") return "Dorixona"; }; const handleAddLocation = (id: number) => { if (!selectType) return; setLoadingButtonId(id); // faqat shu button loading navigator.geolocation.getCurrentPosition( (position) => { const latitude = position.coords.latitude; const longitude = position.coords.longitude; const body: CreateLocation = { latitude, longitude, }; switch (selectType) { case "district": body.district_id = id; break; case "object": body.place_id = id; break; case "doctor": body.doctor_id = id; break; case "pharm": body.pharmacy_id = id; break; } mutation.mutate(body); }, () => { toast.error("Geolokatsiya olinmadi"); setLoadingButtonId(null); }, { enableHighAccuracy: true, timeout: 15000, maximumAge: 0 }, ); }; const table = useReactTable({ data: location || [], columns: columns, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), getSortedRowModel: getSortedRowModel(), getFilteredRowModel: getFilteredRowModel(), }); return (
Lokatsiya Tizimi {"Manzil jo'natish va tarix"}
{/* Main Modal */} {"Nimani jo'natasiz?"}
{(["district", "object", "doctor", "pharm"] as const).map( (type) => ( ), )}
{/* Select Modal */} Mavjud {selectType && typeLabel(selectType)}lar
{isLoading() ? (

Yuklanmoqda...

) : getOptions()?.length === 0 ? (

Ma'lumot topilmadi

) : ( getOptions()?.map((item) => { const id = item.id; const label = "name" in item ? item.name : `${item.first_name} ${item.last_name}`; const isButtonLoading = loadingButtonId === id; return ( ); }) )}
{/* Table */}
{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(), )} ))} )) ) : ( Hech qanday lokatsiya jo'natilmagan )}
); }; export default MyLocation;