api ulandi

This commit is contained in:
Samandar Turgunboyev
2025-10-25 18:42:01 +05:00
parent 1a08775451
commit 05b752daf2
84 changed files with 11179 additions and 3724 deletions

188
src/pages/tours/lib/form.ts Normal file
View File

@@ -0,0 +1,188 @@
import z from "zod";
const fileSchema = z.instanceof(File, { message: "Rasm faylini yuklang" });
export const TourformSchema = z.object({
title: z.string().min(2, {
message: "Sarlavha kamida 2 ta belgidan iborat bo'lishi kerak",
}),
title_ru: z.string().min(2, {
message: "Sarlavha kamida 2 ta belgidan iborat bo'lishi kerak",
}),
hotel_info: z.string().min(2, {
message: "Sarlavha kamida 2 ta belgidan iborat bo'lishi kerak",
}),
hotel_info_ru: z.string(),
hotel_meals_info: z.string().min(2, {
message: "Sarlavha kamida 2 ta belgidan iborat bo'lishi kerak",
}),
hotel_meals_info_ru: z.string(),
price: z.number().min(1000, {
message: "Narx kamida 1000 UZS bo'lishi kerak.",
}),
passenger_count: z.number().min(1, {
message: "Kamida 1 yo'lovchi bo'lishi kerak.",
}),
min_person: z.number().min(1, {
message: "Kamida 1 yo'lovchi bo'lishi kerak.",
}),
max_person: z.number().min(1, {
message: "Kamida 1 yo'lovchi bo'lishi kerak.",
}),
departure: z.string().min(2, {
message: "Ketish joyi eng kamida 2 ta belgidan iborat bo'lishi kerak.",
}),
departure_ru: z.string().min(2, {
message: "Ketish joyi eng kamida 2 ta belgidan iborat bo'lishi kerak.",
}),
destination: z.string().min(2, {
message: "Borish joyi eng kamida 2 ta belgidan iborat bo'lishi kerak.",
}),
destination_ru: z.string().min(2, {
message: "Borish joyi eng kamida 2 ta belgidan iborat bo'lishi kerak.",
}),
location_name: z.string().min(2, {
message: "Eng kamida 2 ta belgidan iborat bo'lishi kerak.",
}),
location_name_ru: z.string().min(2, {
message: "Eng kamida 2 ta belgidan iborat bo'lishi kerak.",
}),
visa_required: z
.enum(["no", "yes"], { message: "Iltimos, visa talabliligini tanlang" })
.refine((val) => val === "no" || val === "yes", {
message: "Iltimos, visa talabliligini tanlang",
}),
departureDateTime: z.object({
date: z.date({ message: "Jonash vaqti majburiy" }),
time: z
.string()
.min(1, { message: "Jonash vaqti majburiy" })
.refine(
(val) => {
// HH:MM:SS formatini tekshirish
const parts = val.split(":");
if (parts.length !== 3) return false;
const [hour, minute, second] = parts.map(Number);
return (
!isNaN(hour) &&
!isNaN(minute) &&
!isNaN(second) &&
hour >= 0 &&
hour <= 23 &&
minute >= 0 &&
minute <= 59 &&
second >= 0 &&
second <= 59
);
},
{ message: "Yaroqli vaqt kiriting (masalan, 08:30:00)" },
),
}),
travelDateTime: z.object({
date: z.date({ message: "Jonash vaqti majburiy" }),
time: z
.string()
.min(1, { message: "Jonash vaqti majburiy" })
.refine(
(val) => {
// HH:MM:SS formatini tekshirish
const parts = val.split(":");
if (parts.length !== 3) return false;
const [hour, minute, second] = parts.map(Number);
return (
!isNaN(hour) &&
!isNaN(minute) &&
!isNaN(second) &&
hour >= 0 &&
hour <= 23 &&
minute >= 0 &&
minute <= 59 &&
second >= 0 &&
second <= 59
);
},
{ message: "Yaroqli vaqt kiriting (masalan, 08:30:00)" },
),
}),
languages: z.string().min(1, { message: "Majburiy maydon" }),
duration: z.number().min(1, { message: "Kamida 1kun bo'lishi kerak" }),
badges: z.array(z.number()).optional(),
tarif: z
.array(
z.object({
tariff: z.number().min(1, { message: "Transport ID majburiy" }),
price: z
.number()
.min(1000, { message: "Narx kamida 1000 UZS bo'lishi kerak" }),
}),
)
.min(1, { message: "Kamida bitta transport tanlang." }),
transport: z
.array(
z.object({
transport: z.number().min(1, { message: "Transport ID majburiy" }),
price: z
.number()
.min(1000, { message: "Narx kamida 1000 UZS bo'lishi kerak" }),
}),
)
.min(1, { message: "Kamida bitta transport tanlang." }),
banner: z.any().nullable(),
images: z
.array(z.union([z.instanceof(File), z.string()]))
.min(1, { message: "Kamida bitta rasm yuklang." }),
amenities: z
.array(
z.object({
name: z.string().min(1, { message: "Majburoy maydon" }),
name_ru: z.string().min(1, { message: "Majburoy maydon" }),
icon_name: z.string().min(1, { message: "Majburoy maydon" }),
}),
)
.min(1, { message: "Kamida bitta qulaylik kiriting." }),
hotel_services: z
.array(
z.object({
image: z.any().nullable(),
title: z.string().min(1, "Xizmat nomi majburiy"),
title_ru: z.string().min(1, { message: "Majburoy maydon" }),
description: z.string().min(1, "Tavsif majburiy"),
desc_ru: z.string().min(1, { message: "Majburoy maydon" }),
}),
)
.min(1, { message: "Kamida bitta xizmat kiriting." }),
hotel_meals: z
.array(
z.object({
image: z.any().nullable(),
title: z.string().min(1, "Xizmat nomi majburiy"),
title_ru: z.string().min(1, "Majburiy maydon"),
description: z.string().min(1, "Tavsif majburiy"),
desc_ru: z.string().min(1, "Majburiy maydon"),
}),
)
.min(1, { message: "Kamida bitta xizmat kiriting." }),
ticket_itinerary: z
.array(
z.object({
ticket_itinerary_image: z.array(
z.object({
image: fileSchema,
}),
),
title: z.string().min(1, "Sarlavha majburiy"),
title_ru: z.string().min(1, "Sarlavha (RU) majburiy"),
duration: z.number().min(1, { message: "Kamida 1 kun bo'lishi kerak" }),
ticket_itinerary_destinations: z.array(
z.object({
name: z.string().min(1, { message: "Majburiy maydon" }),
name_ru: z.string().min(1, { message: "Majburiy maydon" }),
}),
),
}),
)
.min(1, { message: "Kamida bitta xizmat kiriting." }),
});