-
-
-
-
-
-
-
- {user.first_name} {user.last_name}
-
- {getRoleBadge(user.role)}
+ ) : (
+
+ {users.map((user) => (
+
+
+
+
+
-
-
-
-
{formatPhone(user.phone)}
+
+
+
+ {user.first_name} {user.last_name}
+
+ {getRoleBadge(user.role)}
-
-
-
ID: {user.id}
+
+
+
+
+
{formatPhone(user.phone)}
+
+
+
+ ID: {user.id}
+
-
- {/* Actions */}
-
- {/* Edit Confirm Dialog */}
-
-
- ))}
-
+ ))}
+
+ )}
);
diff --git a/src/pages/agencies/ui/EditAgecy.tsx b/src/pages/agencies/ui/EditAgecy.tsx
index 9dabf41..ac78fe4 100644
--- a/src/pages/agencies/ui/EditAgecy.tsx
+++ b/src/pages/agencies/ui/EditAgecy.tsx
@@ -40,7 +40,7 @@ const formSchema = z.object({
addres: z.string().min(1, "Manzil kiritish shart"),
email: z.string().email("Email noto‘g‘ri"),
phone: z.string().min(3, "Telefon raqami noto‘g‘ri"),
- web_site: z.string().url("URL noto‘g‘ri"),
+ web_site: z.string().min(1, "URL noto‘g‘ri"),
});
type FormData = z.infer
;
@@ -63,12 +63,12 @@ const EditAgency = () => {
});
const queryClient = useQueryClient();
- const { data, isPending } = useQuery({
+ const { data } = useQuery({
queryKey: ["detail_agency", params.id],
queryFn: () => getDetailAgency({ id: Number(params.id) }),
});
- const { mutate } = useMutation({
+ const { mutate, isPending } = useMutation({
mutationFn: (body: {
status: "pending" | "approved" | "cancelled";
custom_id?: string;
diff --git a/src/pages/news/ui/NewsCategory.tsx b/src/pages/news/ui/NewsCategory.tsx
index 44b6267..f42fbd6 100644
--- a/src/pages/news/ui/NewsCategory.tsx
+++ b/src/pages/news/ui/NewsCategory.tsx
@@ -95,7 +95,7 @@ const NewsCategory = () => {
setIsDialogOpen(true);
};
- const { mutate: added } = useMutation({
+ const { mutate: added, isPending } = useMutation({
mutationFn: (body: { name: string; name_ru: string }) =>
addNewsCategory(body),
onSuccess: () => {
@@ -111,7 +111,7 @@ const NewsCategory = () => {
},
});
- const { mutate: edit } = useMutation({
+ const { mutate: edit, isPending: editPending } = useMutation({
mutationFn: ({
body,
id,
@@ -349,7 +349,11 @@ const NewsCategory = () => {
type="submit"
className="bg-blue-600 px-5 py-5 hover:bg-blue-700 text-white mt-4 cursor-pointer"
>
- {t("Saqlash")}
+ {isPending || editPending ? (
+
+ ) : (
+ t("Saqlash")
+ )}
diff --git a/src/pages/news/ui/StepTwo.tsx b/src/pages/news/ui/StepTwo.tsx
index 959a4b9..695714c 100644
--- a/src/pages/news/ui/StepTwo.tsx
+++ b/src/pages/news/ui/StepTwo.tsx
@@ -16,7 +16,7 @@ import { Label } from "@/shared/ui/label";
import { Textarea } from "@/shared/ui/textarea";
import { zodResolver } from "@hookform/resolvers/zod";
import { useMutation, useQueryClient } from "@tanstack/react-query";
-import { ImagePlus, PlusCircle, Trash2 } from "lucide-react";
+import { ImagePlus, Loader2, PlusCircle, Trash2 } from "lucide-react";
import { useEffect, useRef } from "react";
import { useFieldArray, useForm } from "react-hook-form";
import { useTranslation } from "react-i18next";
@@ -134,7 +134,7 @@ const StepTwo = ({
if (file) form.setValue(`sections.${index}.image`, file);
};
- const { mutate: added } = useMutation({
+ const { mutate: added, isPending } = useMutation({
mutationFn: (body: FormData) => addNews(body),
onSuccess: () => {
queryClient.refetchQueries({ queryKey: ["all_news"] });
@@ -150,7 +150,7 @@ const StepTwo = ({
},
});
- const { mutate: update } = useMutation({
+ const { mutate: update, isPending: updatePending } = useMutation({
mutationFn: ({ body, id }: { id: number; body: FormData }) =>
updateNews({ id, body }),
onSuccess: () => {
@@ -404,7 +404,11 @@ const StepTwo = ({
type="submit"
className="mt-6 px-8 py-3 bg-blue-600 text-white rounded-md hover:bg-blue-700 cursor-pointer"
>
- {t("Saqlash")}
+ {isPending || updatePending ? (
+
+ ) : (
+ t("Saqlash")
+ )}
diff --git a/src/pages/tours/ui/StepOne.tsx b/src/pages/tours/ui/StepOne.tsx
index 68367a0..0c0bb68 100644
--- a/src/pages/tours/ui/StepOne.tsx
+++ b/src/pages/tours/ui/StepOne.tsx
@@ -35,7 +35,7 @@ import { RadioGroup, RadioGroupItem } from "@/shared/ui/radio-group";
import { Textarea } from "@/shared/ui/textarea";
import { zodResolver } from "@hookform/resolvers/zod";
import { useMutation, useQuery } from "@tanstack/react-query";
-import { ChevronDownIcon, SquareCheckBig, XIcon } from "lucide-react";
+import { ChevronDownIcon, Loader2, SquareCheckBig, XIcon } from "lucide-react";
import { useEffect, useState, type Dispatch, type SetStateAction } from "react";
import { useForm } from "react-hook-form";
import { useTranslation } from "react-i18next";
@@ -231,7 +231,7 @@ const StepOne = ({
const selectedDate = watch("departureDateTime.date");
const selectedDateTravel = watch("travelDateTime.date");
- const { mutate: create } = useMutation({
+ const { mutate: create, isPending } = useMutation({
mutationFn: (body: FormData) => {
return createTours({ body });
},
@@ -2204,7 +2204,7 @@ const StepOne = ({
type="submit"
className="mt-6 px-8 py-3 bg-blue-600 text-white rounded-md hover:bg-blue-600 cursor-pointer"
>
- {t("Saqlash")}
+ {isPending ?
: t("Saqlash")}
diff --git a/src/pages/tours/ui/Tours.tsx b/src/pages/tours/ui/Tours.tsx
index 9110971..e565c50 100644
--- a/src/pages/tours/ui/Tours.tsx
+++ b/src/pages/tours/ui/Tours.tsx
@@ -68,7 +68,7 @@ const Tours = ({ user }: { user: Role }) => {
getAllTours({ page: 1, page_size: 10, featured_tickets: true }),
});
- const { mutate } = useMutation({
+ const { mutate, isPending } = useMutation({
mutationFn: (id: number) => deleteTours({ id }),
onSuccess: () => {
queryClient.refetchQueries({ queryKey: ["all_tours"] });
@@ -270,8 +270,14 @@ const Tours = ({ user }: { user: Role }) => {
variant="destructive"
onClick={() => confirmDelete(deleteId!)}
>
-
- {t("O'chirish")}
+ {isPending ? (
+
+ ) : (
+ <>
+
+ {t("O'chirish")}
+ >
+ )}
diff --git a/src/pages/users/ui/Edit.tsx b/src/pages/users/ui/Edit.tsx
index 9a5e39c..6ff4884 100644
--- a/src/pages/users/ui/Edit.tsx
+++ b/src/pages/users/ui/Edit.tsx
@@ -19,7 +19,7 @@ import {
FormMessage,
} from "@/shared/ui/form";
import { Input } from "@/shared/ui/input";
-import { ArrowLeft, Mail, Phone, Save, User } from "lucide-react";
+import { ArrowLeft, Loader2, Mail, Phone, Save, User } from "lucide-react";
import { useEffect } from "react";
import { useTranslation } from "react-i18next";
import { useNavigate, useParams } from "react-router-dom";
@@ -250,8 +250,14 @@ export default function EditUser() {
disabled={isPending}
className="flex-1 h-11 rounded-lg bg-gradient-to-r from-emerald-600 to-teal-700 hover:from-emerald-700 hover:to-teal-800 text-white font-medium"
>
-
- {t("Yangilash")}
+ {isPending ? (
+
+ ) : (
+ <>
+
+ {t("Yangilash")}
+ >
+ )}
diff --git a/src/shared/config/i18n/locales/ru/translation.json b/src/shared/config/i18n/locales/ru/translation.json
index 66a8390..98c9119 100644
--- a/src/shared/config/i18n/locales/ru/translation.json
+++ b/src/shared/config/i18n/locales/ru/translation.json
@@ -8,6 +8,8 @@
"Foydalanuvchilar": "Пользователи",
"Tur firmalar": "Турфирмы",
"Xodimlar": "Сотрудники",
+ "Siz agentlikga yangi foydalanuvchi qo'shmoqchimisiz": "Вы хотите добавить нового пользователя в агентство",
+ "Foydalanuvchi qo'shish": "Добавить пользователя",
"Byudjet": "Бюджет",
"Turlar": "Туры",
"Tur sozlamalari": "Настройки туров",
diff --git a/src/shared/config/i18n/locales/uz/translation.json b/src/shared/config/i18n/locales/uz/translation.json
index 305c999..303186c 100644
--- a/src/shared/config/i18n/locales/uz/translation.json
+++ b/src/shared/config/i18n/locales/uz/translation.json
@@ -10,6 +10,8 @@
"Xodimlar": "Xodimlar",
"Byudjet": "Byudjet",
"Turlar": "Turlar",
+ "Siz agentlikga yangi foydalanuvchi qo'shmoqchimisiz": "Siz agentlikga yangi foydalanuvchi qo'shmoqchimisiz",
+ "Foydalanuvchi qo'shish": "Foydalanuvchi qo'shish",
"Tur sozlamalari": "Tur sozlamalari",
"Bronlar": "Bronlar",
"Yangiliklar": "Yangiliklar",