Files
simple-admin/src/pages/tours/lib/form.ts
Samandar Turgunboyev 4e9b2f3bd8 bug fix
2025-11-01 16:18:36 +05:00

199 lines
6.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import z from "zod";
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) => {
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) => {
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 1 kun 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(0, { message: "Narx 0 dan kichik bo'lishi mumkin emas" }),
}),
)
.optional(),
transport: z
.array(
z.object({
transport: z.number().min(1, { message: "Transport ID majburiy" }),
price: z
.number()
.min(0, { message: "Narx 0 dan kichik bo'lishi mumkin emas" }),
}),
)
.optional(),
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.number()).optional(),
// 🔹 Quyidagilar endi ixtiyoriy (required emas)
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: "Majburiy maydon" }),
description: z.string().min(1, "Tavsif majburiy"),
desc_ru: z.string().min(1, { message: "Majburiy maydon" }),
}),
)
.optional(),
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: z.union([z.instanceof(File), z.string()]),
}),
),
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." }),
extra_service: z
.array(
z.object({
name: z.string().min(1, { message: "Xizmat nomi majburiy" }),
name_ru: z.string().min(1, { message: "Xizmat nomi (RU) majburiy" }),
}),
)
.optional(),
paid_extra_service: z
.array(
z.object({
name: z.string().min(1, { message: "Xizmat nomi majburiy" }),
name_ru: z.string().min(1, { message: "Xizmat nomi (RU) majburiy" }),
price: z
.number()
.min(0, { message: "Narx manfiy bo'lishi mumkin emas." }),
}),
)
.optional(),
});