second commit
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -11,17 +11,6 @@ export const metadata: Metadata = {
|
||||
title: pages_titles.doctors['fa'] + ' | ' +'بیمارستان شمال',
|
||||
description: "Shomal Hospital IPD Doctors page",
|
||||
};
|
||||
async function getDoctorsData() {
|
||||
const res = await fetch(`http://localhost:4000/doctors`, {cache: "no-cache"});
|
||||
if (!res.ok) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const data = await res.json();
|
||||
|
||||
// console.log(data)
|
||||
return data;
|
||||
}
|
||||
|
||||
export default async function DoctorsPage({
|
||||
params,
|
||||
@@ -32,11 +21,10 @@ export default async function DoctorsPage({
|
||||
}) {
|
||||
const {lang} = await params;
|
||||
const {name = "", expertise = ""} = await searchParams;
|
||||
const data = await getDoctorsData();
|
||||
const {our_doctors,license_number,search_by_name,search,select_this}=await getDictionary(lang)
|
||||
const filteredData = data.filter((doctor:DoctorDataType) => {
|
||||
const {our_doctors,license_number,search_by_name,search,select_this,doctors}=await getDictionary(lang)
|
||||
const filteredData = doctors.filter((doctor) => {
|
||||
const nameMatch = name
|
||||
? Object.values(doctor.fullname)
|
||||
? Object.values(doctor.fullname.toString())
|
||||
.join(" ")
|
||||
.toLowerCase()
|
||||
.includes(name.toLowerCase())
|
||||
@@ -68,7 +56,7 @@ export default async function DoctorsPage({
|
||||
dict={{search,search_by_name,select_this}}
|
||||
/>
|
||||
<div className="grid grid-cols-4 gap-10 mt-10 ">
|
||||
{filteredData?.map((doctor: DoctorDataType) => (
|
||||
{filteredData?.map((doctor) => (
|
||||
<div
|
||||
key={doctor.id}
|
||||
className="lg:col-span-1 col-span-3 rounded-2xl border-[1px] border-neutral-200 overflow-hidden relative"
|
||||
@@ -81,12 +69,12 @@ export default async function DoctorsPage({
|
||||
className="object-fill"
|
||||
/>
|
||||
<span className="absolute top-2 right-2 p-2 rounded-full text-center text-xs font-semibold bg-blue-primary text-white flex items-center whitespace-nowrap">
|
||||
{doctor.category.name[lang]}
|
||||
{doctor.category.name.toString()}
|
||||
</span>
|
||||
</div>
|
||||
<div className=" h-full px-6 py-10 space-y-2 bg-white">
|
||||
<h3 className="lg:text-xl text-lg font-black text-black">
|
||||
{doctor.fullname[lang]}
|
||||
{doctor.fullname.toString()}
|
||||
</h3>
|
||||
|
||||
<div>
|
||||
@@ -97,7 +85,7 @@ export default async function DoctorsPage({
|
||||
key={item.id}
|
||||
className="list-inside list-disc md:text-base text-sm font-medium"
|
||||
>
|
||||
{item.name[lang]}
|
||||
{item.name.toString()}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
|
||||
@@ -1,20 +1,8 @@
|
||||
import { sub_packages_data_type } from "@/types";
|
||||
import Accordion from "@/ui/components/global/Accordion";
|
||||
import PageHeaderSlider from "@/ui/page-header-slider/PageHeaderSlider";
|
||||
import {notFound} from "next/navigation";
|
||||
import React from "react";
|
||||
|
||||
async function getData(slug: string) {
|
||||
const res = await fetch(
|
||||
`http://localhost:4000/medical_packages?slug=${slug}`
|
||||
);
|
||||
if (!res.ok) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const data = await res.json();
|
||||
return data;
|
||||
}
|
||||
import {getDictionary} from "../../dictionaries";
|
||||
|
||||
export default async function SingleMedicalService({
|
||||
params,
|
||||
@@ -22,9 +10,11 @@ export default async function SingleMedicalService({
|
||||
params: Promise<{slug: string; lang: "fa" | "en"}>;
|
||||
}) {
|
||||
const {slug, lang} = await params;
|
||||
const data = (await getData(slug)) || [];
|
||||
const {medical_packages_data} = await getDictionary(lang);
|
||||
|
||||
if (!data || !data.length) {
|
||||
const data = medical_packages_data.find((p) => p.slug.toString() === slug);
|
||||
|
||||
if (!data) {
|
||||
return notFound();
|
||||
}
|
||||
|
||||
@@ -32,26 +22,26 @@ export default async function SingleMedicalService({
|
||||
<>
|
||||
<PageHeaderSlider
|
||||
lang={lang}
|
||||
pageTitle={data[0].title[lang]}
|
||||
pageTitle={data.title.toString()}
|
||||
imageSrc="/header-slider-1.webp"
|
||||
/>
|
||||
<section className="mt-16 container">
|
||||
<div className="bg-[#F8F9FA] rounded-4xl px-20 py-16">
|
||||
<h3 className="text-[3em] font-black text-blue-primary text-center relative before:absolute before:w-[100px] before:block before:bg-secondary before:-bottom-5 before:h-[2px] before:left-[50%] before:translate-x-[-50%] ">
|
||||
انواع خدمات پزشکی {data[0]?.title[lang]}
|
||||
انواع خدمات پزشکی {data?.title.toString()}
|
||||
</h3>
|
||||
<div className="mt-10 space-y-6">
|
||||
{data[0].sub_packages.map((item:sub_packages_data_type, index: number) =>
|
||||
item?.description?.[lang] ? (
|
||||
{data.sub_packages.map((item, index: number) =>
|
||||
item?.description?.toString() ? (
|
||||
<Accordion
|
||||
key={item.id}
|
||||
title={item.title[lang]}
|
||||
title={item.title.toString()}
|
||||
index={index}
|
||||
description={item?.description?.[lang] ?? ""}
|
||||
services={item?.services?.[lang] ?? ""}
|
||||
price={item?.price?.[lang] ?? ""}
|
||||
description={item?.description?.toString() ?? ""}
|
||||
services={item?.services?.toString() ?? ""}
|
||||
price={item?.price?.toString() ?? ""}
|
||||
thumbnail={item?.thumbnail ?? ""}
|
||||
notes={item?.notes?.[lang] ?? ""}
|
||||
notes={item?.notes?.toString() || ""}
|
||||
/>
|
||||
) : (
|
||||
""
|
||||
|
||||
@@ -9,25 +9,15 @@ export const metadata: Metadata = {
|
||||
title: pages_titles.medical_services['fa'] + ' | ' +'بیمارستان شمال',
|
||||
description: "Shomal Hospital IPD medical services page",
|
||||
};
|
||||
async function getHeadPackages() {
|
||||
const res = await fetch(
|
||||
`http://localhost:4000/medical_packages?is_parent=true`
|
||||
);
|
||||
if (!res.ok) {
|
||||
return [];
|
||||
}
|
||||
const data = await res.json();
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
export default async function MedicalServices({
|
||||
params,
|
||||
}: {
|
||||
params: Promise<{lang: "fa" | "en"}>;
|
||||
}) {
|
||||
const packages = await getHeadPackages();
|
||||
const {lang} = await params;
|
||||
const {medical_packages_headTitle,our_medical_packages} =await getDictionary(lang)
|
||||
const {medical_packages_headTitle,our_medical_packages,medical_packages_data} =await getDictionary(lang)
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -48,7 +38,7 @@ export default async function MedicalServices({
|
||||
<br /> */}
|
||||
<div className="introduction_description_subText" dangerouslySetInnerHTML={{__html:our_medical_packages}}/>
|
||||
<div className="w-full mt-20 grid grid-cols-12 gap-6">
|
||||
{packages.map((item: packages_types) => {
|
||||
{medical_packages_data.map((item) => {
|
||||
const LazyComponent = lazy(
|
||||
() => import(`@/ui/components/icons/${item.svg}.tsx`)
|
||||
);
|
||||
@@ -67,7 +57,7 @@ export default async function MedicalServices({
|
||||
</Suspense>
|
||||
</span>
|
||||
<span className="text-xl font-medium mt-4">
|
||||
{item.title[lang]}
|
||||
{item.title.toString()}
|
||||
</span>
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
@@ -11,32 +11,7 @@ export interface packages_types {
|
||||
sub_packages: packages_types[];
|
||||
}
|
||||
export type languages_types = "fa" | "en" | "ar";
|
||||
export interface DoctorDataType {
|
||||
id: number;
|
||||
fullname: {
|
||||
fa: string;
|
||||
en: string;
|
||||
ar: string;
|
||||
};
|
||||
image: string;
|
||||
specialties: {
|
||||
id: number;
|
||||
name: {
|
||||
fa: string;
|
||||
en: string;
|
||||
ar: string;
|
||||
};
|
||||
}[];
|
||||
category: {
|
||||
id: number;
|
||||
name: {
|
||||
fa: string;
|
||||
en: string;
|
||||
ar: string;
|
||||
};
|
||||
};
|
||||
doctor_identify_number: number;
|
||||
}
|
||||
|
||||
export interface contact_us_form_types {
|
||||
[a: string]: {
|
||||
[b: string]: {
|
||||
@@ -49,26 +24,14 @@ export interface contact_us_form_types {
|
||||
export interface DoctorDataType {
|
||||
id: number;
|
||||
image: string;
|
||||
fullname: {
|
||||
fa: string;
|
||||
en: string;
|
||||
ar: string;
|
||||
};
|
||||
fullname: string;
|
||||
specialties: {
|
||||
id: number;
|
||||
name: {
|
||||
fa: string;
|
||||
en: string;
|
||||
ar: string;
|
||||
};
|
||||
name: string;
|
||||
}[];
|
||||
category: {
|
||||
id: number;
|
||||
name: {
|
||||
fa: string;
|
||||
en: string;
|
||||
ar: string;
|
||||
};
|
||||
name: string;
|
||||
};
|
||||
doctor_identify_number: number;
|
||||
}
|
||||
|
||||
@@ -23,8 +23,6 @@ export default function InsurancesSlider() {
|
||||
centerInsufficientSlides={true}
|
||||
spaceBetween={40}
|
||||
modules={[Navigation, Autoplay]}
|
||||
onSlideChange={() => console.log("slide change")}
|
||||
onSwiper={(swiper) => console.log(swiper)}
|
||||
className="h-[120px]"
|
||||
>
|
||||
<SwiperSlide className="h-full !w-[120px] rounded-xl overflow-hidden ">
|
||||
|
||||
@@ -10,7 +10,7 @@ interface AccordionProps {
|
||||
description: string;
|
||||
thumbnail: string;
|
||||
services: string;
|
||||
notes?: string;
|
||||
notes?: string | undefined;
|
||||
price: string;
|
||||
defaultOpen?: number;
|
||||
index: number;
|
||||
|
||||
@@ -3,7 +3,6 @@ import React, {useState} from "react";
|
||||
|
||||
export default function MobileMenu() {
|
||||
const [open, setOpen] = useState(false);
|
||||
console.log(open);
|
||||
return (
|
||||
<>
|
||||
<button
|
||||
|
||||
@@ -46,15 +46,6 @@ export default function DoctorsFilterBox({
|
||||
return (
|
||||
<>
|
||||
<div className="grid grid-cols-12 gap-4 mt-16">
|
||||
<div className="col-span-5">
|
||||
<input
|
||||
type="text"
|
||||
value={name}
|
||||
onChange={(e) => setName(e.target.value)}
|
||||
placeholder={dict.search_by_name}
|
||||
className="bg-white py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
|
||||
/>
|
||||
</div>
|
||||
<div className="col-span-4">
|
||||
<CustomSelect
|
||||
value={expertise} // must be string
|
||||
@@ -65,6 +56,16 @@ export default function DoctorsFilterBox({
|
||||
placeholder={dict.select_this}
|
||||
/>
|
||||
</div>
|
||||
<div className="col-span-5">
|
||||
{/* <input
|
||||
type="text"
|
||||
value={name}
|
||||
onChange={(e) => setName(e.target.value)}
|
||||
placeholder={dict.search_by_name}
|
||||
className="bg-white py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
|
||||
/> */}
|
||||
</div>
|
||||
|
||||
<div className="col-span-3">
|
||||
<button
|
||||
type="button"
|
||||
|
||||
@@ -18,8 +18,7 @@ export default function HomeHeaderSlider() {
|
||||
}}
|
||||
navigation={false}
|
||||
modules={[Pagination, Navigation, Autoplay]}
|
||||
onSlideChange={() => console.log("slide change")}
|
||||
onSwiper={(swiper) => console.log(swiper)}
|
||||
|
||||
className="lg:h-[75vh] h-[460px]"
|
||||
>
|
||||
{/* <div className="container absolute z-10 bottom-0">
|
||||
|
||||
@@ -28,8 +28,7 @@ export default function PageHeaderSlider({
|
||||
}}
|
||||
navigation={false}
|
||||
modules={[Pagination, Navigation, Autoplay]}
|
||||
onSlideChange={() => console.log("slide change")}
|
||||
onSwiper={(swiper) => console.log(swiper)}
|
||||
|
||||
className="lg:h-[50vh] h-[460px]"
|
||||
>
|
||||
<div
|
||||
|
||||
@@ -14,9 +14,7 @@ export function removeLangFromPathname(
|
||||
) {
|
||||
// بررسی میکنیم که pathname با /lang شروع میشود
|
||||
const prefix = `/${lang}`;
|
||||
console.log("prefix : ", prefix);
|
||||
if (pathname.startsWith(prefix)) {
|
||||
console.log("yes started");
|
||||
return pathname.slice(prefix.length) || "/"; // اگر مسیر خالی شد "/" برگردان
|
||||
}
|
||||
return pathname; // اگر prefix نبود، مسیر اصلی را برگردان
|
||||
|
||||
Reference in New Issue
Block a user