first commit

This commit is contained in:
2025-11-18 18:45:28 +03:30
commit acfea140a3
152 changed files with 15818 additions and 0 deletions

View File

@@ -0,0 +1,225 @@
import {languages_types} from "@/types";
import TelephoneSvg from "@/ui/components/icons/TelephoneSvg";
import PageHeaderSlider from "@/ui/page-header-slider/PageHeaderSlider";
import Image from "next/image";
import React from "react";
import {getDictionary} from "../dictionaries";
import PatientAcceptForm from "@/ui/forms/PatientAcceptForm";
import { default_info, pages_titles } from "@/constants";
import { Metadata } from "next";
export const metadata: Metadata = {
title: pages_titles.contact_us['fa'] + ' | ' +'بیمارستان شمال',
description: "Shomal Hospital IPD contact us page",
};
export default async function ContactUs({
params,
}: {
params: Promise<{lang: languages_types}>;
}) {
const {lang} = await params;
const {contact_us_page, about_page, footer, accept_request_form} =
await getDictionary(lang);
return (
<>
<PageHeaderSlider
lang={lang}
pageTitle={contact_us_page?.page_title}
imageSrc="/header-slider-1.webp"
/>
<section className="mt-16 container">
<div className="bg-[#F8F9FA] rounded-4xl px-20 py-16">
<div className="grid grid-cols-12 items-center">
<div className="col-span-8 grid grid-cols-12 gap-x-20">
<div className="col-span-3">
<div className="relative h-[200px] w-[200px] rounded-xl overflow-hidden">
<Image fill src={"/heidarnejad.jpg"} alt="doctor" />
</div>
</div>
<div className="col-span-9 h-full items-center">
<div className="flex flex-col items-start justify-center gap-y-4">
<h3 className="text-3xl font-black text-blue-primary">
{about_page?.heidarnejad?.name}
</h3>
<span className="text-secondary text-xl font-semibold">
{about_page?.heidarnejad?.expertise}
</span>
<span className="text-black text-lg">
{about_page?.heidarnejad?.position}
</span>
</div>
</div>
</div>
<div className="col-span-4 h-full">
<div className="bg-secondary p-8 rounded-xl h-full grid grid-cols-2 items-center">
<div className="col-span-1 flex flex-col justify-start items-center gap-y-4">
<span className="text-white">
<TelephoneSvg size="60" />
</span>
<span className="text-lg text-white font-semibold">
{footer?.contact_us?.ipd_technician_number}
</span>
</div>
<div className="col-span-1 flex flex-col justify-start items-center gap-y-4">
<span className="text-white">
<svg
width="60"
height="60"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M4 20C3.45 20 2.97917 19.8042 2.5875 19.4125C2.19583 19.0208 2 18.55 2 18V6C2 5.45 2.19583 4.97917 2.5875 4.5875C2.97917 4.19583 3.45 4 4 4H20C20.55 4 21.0208 4.19583 21.4125 4.5875C21.8042 4.97917 22 5.45 22 6V18C22 18.55 21.8042 19.0208 21.4125 19.4125C21.0208 19.8042 20.55 20 20 20H4ZM12 13L4 8V18H20V8L12 13ZM12 11L20 6H4L12 11ZM4 8V6V18V8Z"
fill="currentColor"
/>
</svg>
</span>
<span className="text-lg text-white font-semibold">
{default_info.email}
</span>
</div>
</div>
</div>
</div>
</div>
</section>
<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%] ">
{contact_us_page?.info_box_title}
</h3>
<div className="mt-16">
<div className="grid grid-cols-12 gap-x-4">
<div className="col-span-6 space-y-8">
<div className="flex items-center gap-x-4">
<div className="w-[70px] h-[70px] flex items-center justify-center rounded-2xl bg-secondary">
<span>
<svg
width="40"
height="40"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M11.9999 13.4304C13.723 13.4304 15.1199 12.0336 15.1199 10.3104C15.1199 8.5873 13.723 7.19043 11.9999 7.19043C10.2768 7.19043 8.87988 8.5873 8.87988 10.3104C8.87988 12.0336 10.2768 13.4304 11.9999 13.4304Z"
stroke="white"
strokeWidth="1.5"
/>
<path
d="M3.6202 8.49C5.5902 -0.169998 18.4202 -0.159997 20.3802 8.5C21.5302 13.58 18.3702 17.88 15.6002 20.54C13.5902 22.48 10.4102 22.48 8.3902 20.54C5.6302 17.88 2.4702 13.57 3.6202 8.49Z"
stroke="white"
strokeWidth="1.5"
/>
</svg>
</span>
</div>
<p className="text-xl">{footer?.contact_us?.address}</p>
</div>
<div className="flex items-center gap-x-4">
<div className="w-[70px] h-[70px] flex items-center justify-center rounded-2xl bg-secondary">
<span>
<svg
width="40"
height="40"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M4 20C3.45 20 2.97917 19.8042 2.5875 19.4125C2.19583 19.0208 2 18.55 2 18V6C2 5.45 2.19583 4.97917 2.5875 4.5875C2.97917 4.19583 3.45 4 4 4H20C20.55 4 21.0208 4.19583 21.4125 4.5875C21.8042 4.97917 22 5.45 22 6V18C22 18.55 21.8042 19.0208 21.4125 19.4125C21.0208 19.8042 20.55 20 20 20H4ZM12 13L4 8V18H20V8L12 13ZM12 11L20 6H4L12 11ZM4 8V6V18V8Z"
fill="white"
/>
</svg>
</span>
</div>
<a href={`mailto:${default_info.email}`} className="text-xl">
{default_info.email}
</a>
</div>
<div className="flex items-center gap-x-4">
<div className="w-[70px] h-[70px] flex items-center justify-center rounded-2xl bg-secondary">
<span className="text-white">
<TelephoneSvg size="40" />
</span>
</div>
<a href="tel:+989385745269" className="text-xl">
{footer?.contact_us?.ipd_technician_number} |{" "}
{footer?.contact_us?.hospital_number}
</a>
</div>
<span className="w-full inline-block h-[2px] bg-secondary/20"></span>
<div className="flex items-center gap-x-3">
<a
href="https://instagram.com/shomalhospital"
className="w-[70px] h-[70px] flex items-center justify-center rounded-2xl bg-secondary"
>
<span className="text-white">
<svg
width="40"
height="40"
viewBox="0 0 25 25"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M8.12467 2.08337H16.8747C20.208 2.08337 22.9163 4.79171 22.9163 8.12504V16.875C22.9163 18.4774 22.2798 20.0141 21.1468 21.1471C20.0137 22.2802 18.477 22.9167 16.8747 22.9167H8.12467C4.79134 22.9167 2.08301 20.2084 2.08301 16.875V8.12504C2.08301 6.52269 2.71954 4.98597 3.85257 3.85294C4.9856 2.71991 6.52232 2.08337 8.12467 2.08337ZM7.91634 4.16671C6.92178 4.16671 5.96795 4.5618 5.26469 5.26506C4.56143 5.96832 4.16634 6.92215 4.16634 7.91671V17.0834C4.16634 19.1563 5.84342 20.8334 7.91634 20.8334H17.083C18.0776 20.8334 19.0314 20.4383 19.7347 19.735C20.4379 19.0318 20.833 18.0779 20.833 17.0834V7.91671C20.833 5.84379 19.1559 4.16671 17.083 4.16671H7.91634ZM17.9684 5.72921C18.3138 5.72921 18.6449 5.86639 18.8891 6.11058C19.1333 6.35477 19.2705 6.68596 19.2705 7.03129C19.2705 7.37662 19.1333 7.70781 18.8891 7.952C18.6449 8.19619 18.3138 8.33337 17.9684 8.33337C17.6231 8.33337 17.2919 8.19619 17.0477 7.952C16.8035 7.70781 16.6663 7.37662 16.6663 7.03129C16.6663 6.68596 16.8035 6.35477 17.0477 6.11058C17.2919 5.86639 17.6231 5.72921 17.9684 5.72921ZM12.4997 7.29171C13.881 7.29171 15.2058 7.84044 16.1825 8.81719C17.1593 9.79394 17.708 11.1187 17.708 12.5C17.708 13.8814 17.1593 15.2061 16.1825 16.1829C15.2058 17.1596 13.881 17.7084 12.4997 17.7084C11.1183 17.7084 9.79358 17.1596 8.81683 16.1829C7.84007 15.2061 7.29134 13.8814 7.29134 12.5C7.29134 11.1187 7.84007 9.79394 8.81683 8.81719C9.79358 7.84044 11.1183 7.29171 12.4997 7.29171ZM12.4997 9.37504C11.6709 9.37504 10.876 9.70428 10.29 10.2903C9.70391 10.8764 9.37467 11.6712 9.37467 12.5C9.37467 13.3288 9.70391 14.1237 10.29 14.7097C10.876 15.2958 11.6709 15.625 12.4997 15.625C13.3285 15.625 14.1233 15.2958 14.7094 14.7097C15.2954 14.1237 15.6247 13.3288 15.6247 12.5C15.6247 11.6712 15.2954 10.8764 14.7094 10.2903C14.1233 9.70428 13.3285 9.37504 12.4997 9.37504Z"
fill="white"
/>
</svg>
</span>
</a>
<a
href="https://linkedin.com/shomalhospital"
className="w-[70px] h-[70px] flex items-center justify-center rounded-2xl bg-secondary"
>
<span className="text-white">
<svg
width="40"
height="40"
viewBox="0 0 25 25"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M7.88333 5.09347C7.88308 5.61528 7.68707 6.11561 7.33843 6.4844C6.98978 6.85319 6.51705 7.06023 6.02423 7.05997C5.53141 7.05971 5.05888 6.85217 4.71058 6.48301C4.36228 6.11385 4.16675 5.61331 4.16699 5.0915C4.16724 4.56969 4.36325 4.06936 4.71189 3.70057C5.06054 3.33178 5.53327 3.12474 6.02609 3.125C6.51891 3.12526 6.99144 3.3328 7.33974 3.70196C7.68804 4.07112 7.88357 4.57166 7.88333 5.09347ZM7.93907 8.51689H4.22274V20.8333H7.93907V8.51689ZM13.8109 8.51689H10.1131V20.8333H13.7737V14.3702C13.7737 10.7697 18.2054 10.4352 18.2054 14.3702V20.8333H21.8753V13.0323C21.8753 6.96258 15.316 7.18884 13.7737 10.1696L13.8109 8.51689Z"
fill="white"
/>
</svg>
</span>
</a>
</div>
</div>
<div className="col-span-6">
<iframe
src="https://www.google.com/maps/embed?pb=!1m14!1m8!1m3!1d6419.524849772638!2d52.347594!3d36.439127!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3f8fbd6849bf386b%3A0x26cbc9441b00f373!2sShomal%20Hospital!5e0!3m2!1sen!2sus!4v1762836982418!5m2!1sen!2sus"
width="100%"
height="450"
style={{border: "0"}}
allowFullScreen={false}
loading="lazy"
referrerPolicy="no-referrer-when-downgrade"
className="rounded-xl"
></iframe>
</div>
</div>
</div>
</div>
</section>
<section
id="request_accept"
className="lg:mb-24 mb-10 lg:mt-10 mt-4 container "
>
<div className="bg-[#F8F9FA] rounded-4xl lg:px-40 lg:py-16 p-2">
<h3 className="lg:text-[3em] text-3xl 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%] ">
{accept_request_form?.head_text}
</h3>
<p className="text-center lg:text-[1.2rem] leading-8 text-[#454547] mt-10">
{about_page?.form?.sub_text}
</p>
<PatientAcceptForm lang={lang} dict={about_page} />
</div>
</section>
</>
);
}

View File

@@ -0,0 +1,11 @@
import { languages_types } from "@/types";
import "server-only";
const dictionaries = {
en: () => import("./dictionaries/en.json").then((module) => module.default),
fa: () => import("./dictionaries/fa.json").then((module) => module.default),
ar: () => import("./dictionaries/ar.json").then((module) => module.default),
};
export const getDictionary = async (locale: languages_types) =>
dictionaries[locale]();

View File

@@ -0,0 +1,232 @@
{
"products": {
"cart": "أضف إلى السلة"
},
"about_page": {
"page_title": "من نحن",
"introduction": "مقدمة عن قسم المرضى الدوليين",
"introduction_description_headText": "تأسس مستشفى شُمَال التخصصي وفوق التخصصي عام 2013 بهدف رفع مستوى الرعاية الصحية والخدمات الطبية في مدينة آمل ومناطق شمال إيران. يُعد أحد أوائل المستشفيات الخاصة الحديثة في محافظة مازندران، حيث بدأ نشاطه بـ 150 سريراً وبنى تحتية متطورة. وخلال عقد من الزمن، استطاع مستشفى شُمَال من خلال تطوير أقسامه التخصصية والباراكلينيكية، واستقطاب الكوادر الطبية المتميزة، وتجهيزه بأحدث التقنيات الطبية، أن يصبح من أبرز المراكز العلاجية في المنطقة. اليوم، وبفضل غرف العمليات المجهزة، وأقسام العناية المركزة (ICU، CCU، NICU)، وقسم الطوارئ على مدار الساعة، والعيادات التخصصية، وخدمات التصوير والمختبرات، يلبي المستشفى احتياجات المرضى المتزايدة من آمل والمدن المجاورة وحتى المرضى الدوليين. يلتزم مستشفى شُمَال بمبادئ الجودة وكرامة الإنسان والمسؤولية والابتكار، ويواصل رؤيته ليكون من المؤسسات الطبية الرائدة في شمال البلاد.",
"introduction_description_subText": "<ul class='introduction_description_subText'><li>ترخيص رسمي من وزارة الصحة</li><li>اعتماد وطني من الدرجة الأولى</li><li>أكثر من 12 عامًا من الخبرة</li><li>فريق متعدد اللغات (الإنجليزية، العربية، التركية)</li><li>مرافقة شاملة من لحظة الوصول حتى الخروج</li><li>تكاليف مناسبة مع خدمات طبية عالية الجودة</li><li>خدمات مميزة تشمل النقل من المطار، غرف VIP، مترجمين، جولات سياحية، شواطئ بحر قزوين، غابات هيركاني، ومناطق جبلية مطلة على قمة دماوند</li></ul>",
"department_introduction": "فريق قسم المرضى الدوليين",
"department_introduction_subtitle": "هدفنا هو أن تشعروا بالراحة والأمان والمساندة في جميع مراحل علاجكم — من الاستشارة الأولى حتى العودة إلى وطنكم.",
"dr_jafarian": {
"name": "الدكتور محسن جعفريان",
"expertise": "دكتوراه في إدارة الخدمات الصحية",
"position": "مدير المستشفى / مدير قسم المرضى الدوليين"
},
"dr_motamedi": {
"name": "الدكتور حسن معتمدي مطلق",
"expertise": "اختصاصي طب الطوارئ",
"position": "طبيب المرضى الدوليين"
},
"heidarnejad": {
"name": "رويا حيدرنژاد",
"expertise": "فني الطوارئ الطبية",
"position": "منسقة المرضى الدوليين"
},
"form": {
"head_text": "هل تحتاج إلى استشارة طبية؟",
"sub_text": "يرجى إرسال معلومات حول حالتك الصحية، وسنتواصل معك في أقرب وقت ممكن.",
"fields": {
"first_name": "الاسم الأول",
"last_name": "اسم العائلة",
"email": "البريد الإلكتروني",
"sex": "الجنس",
"country": "بلدك",
"services": "اختر أحد باقات الخدمات الطبية",
"phone_number": "رقم الهاتف",
"age": "العمر",
"message": "صف حالتك الصحية"
},
"buttons": {
"send_whatsapp": "إرسال عبر واتساب",
"send_email": "إرسال عبر البريد الإلكتروني"
}
}
},
"pricing_page": {
"page_title": "قائمة الأسعار",
"table": {
"head": [
{"name": "اسم الباقة"},
{"name": "اسم الخدمة"},
{"name": "نطاق السعر (دولار أمريكي)"}
]
}
},
"patient_rights_charter": {
"page_title": "ميثاق حقوق المرضى",
"section_one": {
"title": "الحصول على خدمات صحية مثلى هو حق المريض",
"content": "<ul className='list-disc marker:text-secondary marker:text-2xl '>\n<li>تقديم خدمات كريمة ومحترمة تحترم قيمة الإنسان والمعتقدات الثقافية والدينية.</li>\n<li>تقديم الخدمات على أساس الصدق والإنصاف والاحترام واللطف.</li>\n<li>خالية من أي تمييز بما في ذلك العرقي أو الثقافي أو الديني أو نوع المرض أو الجنس.</li>\n<li>استنادًا إلى المعرفة الحديثة وإعطاء الأولوية لمصلحة المريض.</li>\n<li>تضمن عدالة توزيع الموارد الصحية وأولوية احتياجات علاج المرضى.</li>\n<li>تنسيق جميع جوانب الرعاية بما في ذلك الوقاية والتشخيص والعلاج وإعادة التأهيل.</li>\n<li>توفير المرافق الأساسية مع تجنب الألم والمعاناة أو القيود غير الضرورية.</li>\n<li>إيلاء اهتمام خاص لحقوق الفئات الضعيفة مثل الأطفال والنساء الحوامل وكبار السن والمرضى النفسيين والسجناء والمعاقين عقليًا وجسديًا والأفراد غير المصحوبين.</li>\n<li>تقديم الخدمات بسرعة مع احترام وقت المريض ومراعاة عوامل مثل اللغة والعمر والجنس.</li>\n<li>تقديم الرعاية الطارئة والعاجلة بغض النظر عن التكلفة؛ يجب أن تتبع الرعاية غير الطارئة اللوائح المحددة.</li>\n<li>إذا لم يكن من الممكن تقديم الخدمات المناسبة في حالات الطوارئ، يتم ترتيب النقل إلى وحدة مجهزة بعد تقديم الرعاية الضرورية والتوضيحات.</li>\n<li>في مراحل نهاية الحياة حيث يكون المرض غير قابل للشفاء والوفاة وشيكة، يجب تقديم الخدمات لضمان راحة المريض.</li>\n</ul>"
},
"section_two": {
"title": "يجب تزويد المريض بالمعلومات بشكل مناسب وكافٍ",
"content": "<ul className='list-disc marker:text-secondary marker:text-2xl'>\n<li>بنود ميثاق حقوق المرضى عند القبول.</li>\n<li>لوائح وتكاليف متوقعة للمستشفى، بما في ذلك الخدمات الطبية وغير الطبية، ولوائح التأمين، وتقديم نظم الدعم عند القبول.</li>\n<li>أسماء ومسؤوليات ورتبة أعضاء الفريق الطبي المسؤول عن تقديم الرعاية، بما في ذلك الأطباء والممرضين والطلاب، وتفاعلاتهم المهنية.</li>\n<li>طرق التشخيص والعلاج، نقاط القوة والضعف لكل طريقة، الآثار الجانبية المحتملة، تشخيص المرض، التنبؤ به، وكل المعلومات المؤثرة على اتخاذ قرار المريض.</li>\n<li>الوصول إلى الطبيب المعالج وأعضاء الفريق الطبي الرئيسيين أثناء العلاج، وتقديم التدريب الضروري لاستمرارية العلاج، وجميع الإجراءات ذات الطبيعة البحثية.</li>\n<li>يجب تقديم المعلومات في الوقت المناسب وبشكل مناسب وفقًا لظروف المريض، بما في ذلك القلق، الألم، والخصائص الفردية مثل اللغة والتعليم والقدرة على الفهم، ما لم يتسبب تأخير العلاج بسبب المعلومات في ضرر للمريض، أو إذا رفض المريض المعلومات رغم معرفته بحقوقه؛ في هذه الحالة يجب احترام إرادة المريض، ما لم يؤد عدم المعرفة إلى وضعه أو الآخرين في خطر جديد.</li>\n<li>يمكن للمريض الوصول إلى جميع المعلومات المسجلة في ملفه الطبي، والحصول على نسخة منها، وطلب تصحيح أي أخطاء.</li>\n</ul>"
},
"section_three": {
"title": "يجب احترام حق المريض في الاختيار واتخاذ القرارات بحرية",
"content": "<ul className='list-disc space-y-2 text-[1.2rem] marker:text-secondary marker:text-2xl text-[#454547]'>\n<li>اختيار الطبيب المعالج ومركز تقديم الخدمات الصحية ضمن الإطار التنظيمي، وكذلك استشارة طبيب ثانٍ كمستشار.</li>\n<li>المشاركة أو عدم المشاركة في أي بحث، مع التأكد من أن القرار لا يؤثر على استمرارية أو طريقة تلقي الخدمات الصحية.</li>\n<li>قبول أو رفض العلاجات المقترحة بعد فهم المخاطر المحتملة؛ باستثناء حالات الانتحار أو عندما يؤدي الرفض إلى تعريض شخص آخر للخطر.</li>\n<li>يجب تسجيل تصريحات المريض السابقة حول العلاجات المستقبلية عندما يكون قادرًا على اتخاذ القرار، واستخدامها كدليل للإجراءات الطبية في حالة فقدان القدرة، مع الالتزام بالأحكام القانونية.</li>\n<li>يجب أن يكون اختيار المريض واتخاذ القرار حرًا ومستنيرًا ومستندًا إلى معلومات كافية وشاملة (كما هو موضح أعلاه).</li>\n<li>بعد تقديم المعلومات، يجب منح المريض الوقت الكافي لاتخاذ قرارات مستنيرة.</li>\n</ul>"
},
"section_four": {
"title": "الوصول إلى نظام فعال لمعالجة الشكاوى هو حق المريض",
"content": "<ul className='list-disc space-y-2 text-[1.2rem] marker:text-secondary marker:text-2xl text-[#454547]'>\n<li>يحق لكل مريض تقديم شكوى إلى السلطات المختصة في حال الاشتباه بانتهاك حقوقه المنصوص عليها في هذا الميثاق، دون التأثير على جودة الخدمات الصحية المقدمة.</li>\n<li>يحق للمرضى معرفة كيفية معالجة شكواهم ونتائجها.</li>\n<li>يجب تعويض الأضرار الناجمة عن أخطاء مقدمي الخدمات الصحية بسرعة بعد المراجعة والتحقق، وفقًا للأنظمة.</li>\n</ul>"
}
},
"accept_request_form": {
"head_text": "نموذج القبول الأولي للمريض"
},
"contact_us_page": {
"page_title": "اتصل بنا",
"info_box_title": "ابق على تواصل معنا"
},
"footer": {
"under_logo_text": "يتكوّن فريق المرضى الدوليين في مستشفى شُمَال من مجموعة من المتخصصين في الرعاية الصحية والمترجمين الطبيين ومستشاري السفر العلاجي، الذين يقدمون الدعم للمرضى الدوليين على مدار الساعة وبعدة لغات. هدفنا أن تشعروا بالراحة والأمان والمساندة في جميع مراحل علاجكم — من الاستشارة الأولى حتى عودتكم سالمين إلى وطنكم.",
"our_address": "عنواننا",
"ipd_technician_number": "رقم فني قسم المرضى الدوليين",
"hospital_number": "رقم المستشفى",
"contact_us_text": "تواصل معنا",
"contact_us": {
"address": "إيران، مازندران، آمل، شارع المدرس، آفـتاب ٤٧، مستشفى شُمَال",
"ipd_technician_number": "09385745269",
"hospital_number": "011-4492"
}
},
"medical_packages": [
{
"package_name": "باقة الجهاز الهضمي",
"services": [
{"service_name": "تنظير علوي"},
{"service_name": "تنظير القولون الكامل"},
{"service_name": "تنظير و تنظير القولون في وقت واحد"}
]
},
{
"package_name": "باقة استئصال الرحم",
"services": [
{"service_name": "جراحة سرطان الرحم أو عنق الرحم"},
{"service_name": "جراحة سرطان المبيض"}
]
},
{
"package_name": "باقة القلب",
"services": [
{"service_name": "تصوير الأوعية القلبية"},
{"service_name": "توسيع الأوعية + تركيب دعامة"},
{"service_name": "اختبار تخطيط كهربية القلب"},
{"service_name": "استئصال القلب"},
{"service_name": "زرع أجهزة القلب (CRT)"},
{"service_name": "زرع أجهزة القلب (ICD)"},
{"service_name": "زرع أجهزة القلب (منظم ضربات القلب)"},
{"service_name": "جراحة تحويل مسار الشريان التاجي (CABG)"}
]
},
{
"package_name": "باقة التجميل",
"services": [
{"service_name": "شفط الدهون / ليبوماتيك (البطن، الجوانب، الفخذ)"},
{"service_name": "شد البطن (جراحة تجميلية للبطن)"},
{"service_name": "شد الجفون العليا والسفلى"},
{"service_name": "رفع الوجه والرقبة"},
{"service_name": "تكبير / رفع الثدي (مع غرسة)"},
{"service_name": "تكبير / رفع الثدي (بدون غرسة)"},
{"service_name": "زرع الشعر"},
{"service_name": "قص المعدة"},
{"service_name": "حقن الدهون للوجه أو الجسم"}
]
},
{
"package_name": "باقة العظام",
"services": [
{"service_name": "استبدال مفصل الورك"},
{"service_name": "استبدال مفصل الركبة"}
]
},
{
"package_name": "باقة جراحة المخ",
"services": [
{"service_name": "جراحة العمود الفقري (الدمج)"},
{"service_name": "جراحة العمود الفقري (استئصال الصفيحة)"},
{"service_name": "جراحة العمود الفقري (استئصال القرص)"},
{"service_name": "استئصال الجمجمة"},
{"service_name": "جراحة قاعدة الجمجمة"},
{"service_name": "جراحة أورام المخ"}
]
},
{
"package_name": "باقة الأنف والأذن والحنجرة",
"services": [
{"service_name": "تصحيح انحراف الحاجز الأنفي"},
{"service_name": "استئصال اللوزتين و/أو اللحمية"},
{"service_name": "استئصال السلائل الأنفية أو الجيوب"},
{"service_name": "جراحة تجميل الأنف"}
]
}
],
"our_medical_packages": "<ul><li>💼 التنسيق الكامل قبل الوصول: التنسيق مع مستشفى شمال لمراجعة السجلات الطبية، واستشارة الأطباء المتخصصين، وإرسال تقدير التكلفة</li><li>🛬 الاستقبال في المطار: نقل خاص من المطار إلى المستشفى أو الفندق</li><li>🌐 مترجم فوري: خدمات الترجمة باللغات الإنجليزية، العربية، الكردية، التركية، وغيرها</li><li>🏨 حجز الفندق والإقامة: التعاون مع فنادق بمستوى عالمي بالقرب من المستشفى</li><li>🧾 الإرشاد والدعم الإداري: إصدار دعوة للحصول على تأشيرة علاجية، الإرشاد في الجمارك والإقامة</li><li>👨‍⚕️ الوصول السريع إلى الأطباء المتخصصين: التنسيق الكامل مع مستشفى شمال؛ تحديد مواعيد فورية وإحالة مباشرة لأفضل الأطباء في كل تخصص</li><li>📋 المتابعة بعد الخروج: إرسال السجلات الطبية، التواصل مع الطبيب المعالج، والرد على استفسارات المريض بعد الخروج</li></ul>",
"our_doctors": "أطباؤنا",
"license_number": "رقم الترخيص الطبي",
"search_by_name": "البحث حسب اسم الطبيب",
"select_this": "اختر هذا",
"search": "البحث",
"medical_packages_headTitle": "خدماتنا الطبية",
"transfer_service_page": {
"page_title": "خدمات السياحة",
"introduction": {
"title": "تعريف فريق السياحة العلاجية",
"head_text": "<p>تم تشكيل فريق السياحة العلاجية في مستشفى شمال بالتعاون مع شركة راز نوای آسمان ألبرز بهدف توفير تجربة آمنة ومريحة ومهنية للمرضى الدوليين. يتولى هذا الفريق مهمة تقديم إمكانيات المستشفى وجذب المرضى من الدول الأخرى، ويعتبر حلقة وصل بين المستشفى والأسواق الدولية.</p>",
"mojgan_yaghoubi": {
"fullname": "مژگان يعقوبي",
"position": "قائدة الفريق ومنسقة الإقامة",
"phone_number": "989353093925",
"email": "yaqoubi.mozhgan@gmail.com"
},
"hassan_mozaffarzadeh": {
"fullname": "حسن مظفرزاده",
"position": "النقل والمرشد السياحي",
"phone_number": "989353093925",
"email": ""
},
"packages_list": "قائمة الباقات",
"our_serives_ipd": "خدماتنا للمرضى الدوليين",
"packages": [
{
"name": "الباقة الفاخرة",
"dsc": "<ul><li>استخراج التأشيرة</li><li>النقل من وإلى المطار وداخل المدينة</li><li>مترجم مرافق</li><li>إقامة كاملة في جناح رويال فندق أكسین (غرفة مزدوجة أو توأم)</li><li>جولة ليوم كامل إلى ينابيع لاريجان المعدنية أو غابات بِليرون (حسب اختيار المسافر)</li></ul>",
"price": "السعر المقترح: حوالي 1900 دولار"
},
{
"name": "الباقة العادية",
"dsc": "<ul><li>استخراج التأشيرة</li><li>النقل من وإلى المطار وداخل المدينة</li><li>مترجم مرافق</li><li>الإقامة في غرف قياسية في فندق أكسین (مزدوجة أو توأم) مع الإفطار</li><li>جولة نصف يوم في مدينة آمل</li></ul>",
"price": "السعر المقترح: حوالي 1500 دولار"
},
{
"name": "الباقة الاقتصادية",
"dsc": "<ul><li>استخراج التأشيرة</li><li>النقل من وإلى المطار وداخل المدينة</li><li>مترجم مرافق</li><li>الإقامة في فندق الأولمبيك مع الإفطار</li></ul>",
"price": "السعر المقترح: حوالي 900 دولار"
}
],
"image_headTitle": "جولة نصف يوم في مدينة آمل",
"amol_museum": "متحف آمل",
"grand_mosque": "الجامع الكبير في آمل",
"fire_temple": "معبد النار في آمل"
},
"jobs": "<ul><li>الرد على طلبات واستفسارات المرضى والوكلاء</li><li>استخراج التأشيرة العلاجية وتأمين السفر</li><li>حجز الإقامة المناسبة حسب ميزانية ورغبات المريض (فندق، نُزل، شقة)</li><li>النقل من المطار إلى المستشفى أو محل الإقامة</li><li>تنظيم الجولات الثقافية والترفيهية في آمل والمناطق المجاورة (في حال كانت حالة المريض تسمح)</li><li>مرافق مترجم سياحي عند الحاجة</li><li>تنسيق إقامة المرافقين وخدمات النقل</li></ul>",
"services": "<ul><li>تنسيق كامل قبل الوصول</li><li>التنسيق مع مستشفى شمال لمراجعة الملف الطبي والاستشارات الطبية وإرسال عرض التكلفة</li><li>الاستقبال في المطار</li><li>نقل خاص إلى المستشفى أو الفندق</li><li>مرافقة مرشد سياحي ومتحدث بلغات متعددة</li><li>حجز الفنادق بالتعاون مع فنادق بمعايير دولية بالقرب من المستشفى</li><li>الدعم في الإجراءات الإدارية (خطاب دعوة للتأشيرة العلاجية، المساعدة في الجمارك والإقامة)</li><li>تنسيق مباشر مع مستشفى شمال: تحديد المواعيد العاجلة وتحويل المرضى لأفضل الأطباء</li><li>المتابعة بعد الخروج (إرسال التقارير الطبية، التواصل مع الطبيب والإجابة على استفسارات المريض)</li></ul><p><strong>تكلفة الخدمات الأساسية:</strong> تشمل النقل، المرشد، إقامة في غرفة مزدوجة، التأشيرة 1500 دولار</p><p><strong>الجولات الاختيارية:</strong> في حال تسمح حالة المريض ينابيع لاريجان المعدنية مع إقامة كاملة</p>"
},
"package_price": "سعر الباقة",
"reserve_ipd": "حجز موعد واستشارة مجانية مع الطبيب وخبير خدمات المرضى الدوليين",
"phone_number": "رقم الهاتف المحمول",
"email": "البريد الإلكتروني",
"oxin_hotel_location": "موقع فندق اوكسين",
"olympic_hotel_location": "موقع فندق الأولمبيك",
"upload_documents": {
"head_text": "نموذج رفع المستندات الطبية",
"input_code_placeholder": "أدخل الرمز المستلم من الاختصاصي",
"input_files_label": "تحميل عدة ملفات من المستندات الطبية",
"input_dsc": "إذا كانت لديك أي ملاحظات حول المستندات، اكتبها هنا",
"sendbutton": "إرسال المستندات"
},
"related_links": "روابط ذات صلة"
}

View File

@@ -0,0 +1,232 @@
{
"products": {
"cart": "Add to Cart"
},
"about_page": {
"page_title": "About Us",
"introduction": "Introduction to the International Patients Department",
"introduction_description_headText": "The International Patients Unit at Shomal Hospital was established to provide healthcare services to international patients and Iranian expatriates according to international standards. With an experienced, multilingual, and professional team, we support you throughout every stage of your treatment, from initial consultation to returning to your home country.\n• Official license from the Ministry of Health\n• National accreditation, grade one\n• Over 12 years of experience\n• Multilingual team (English, Arabic, Turkish)\n• Full accompaniment from arrival to discharge\n• Cost-effective services with high quality\n• Special services including airport transfer, VIP rooms, interpreter and city tours, Caspian Sea beaches, Hyrcanian forests, and mountain resorts with views of Mount Damavand",
"introduction_description_subText": "<ul class='introduction_description_subText'><li>Official license from the Ministry of Health</li><li>National first-class accreditation</li><li>Over 12 years of experience</li><li>Multilingual team (English, Arabic, Turkish)</li><li>Comprehensive assistance from admission to discharge</li><li>Affordable pricing with premium healthcare quality</li><li>Exclusive services such as airport transfer, VIP rooms, translation, city tours, Caspian Sea beaches, Hyrcanian forests, and mountain resorts overlooking Mount Damavand</li></ul>",
"department_introduction": "International Patients Department Team",
"department_introduction_subtitle": "Our goal is to ensure that you feel comfortable, safe, and supported throughout every step of your treatment — from the initial consultation to your return home.",
"dr_jafarian": {
"name": "Dr. Mohsen Jafarian",
"expertise": "Ph.D. in Healthcare Management",
"position": "Hospital Director / Head of International Patients Department"
},
"dr_motamedi": {
"name": "Dr. Hassan Motamedi Motlagh",
"expertise": "Specialist in Emergency Medicine",
"position": "International Patients Physician"
},
"heidarnejad": {
"name": "Roya Heidarnejad",
"expertise": "Emergency Medical Technician",
"position": "International Patients Coordinator"
},
"form": {
"head_text": "Need Medical Consultation?",
"sub_text": "Please send us details about your medical condition. We will contact you as soon as possible.",
"fields": {
"first_name": "First Name",
"last_name": "Last Name",
"email": "Email",
"sex": "Gender",
"country": "Your Country",
"services": "Select one of the medical service packages",
"phone_number": "Phone Number",
"age": "Age",
"message": "Describe your condition"
},
"buttons": {
"send_whatsapp": "Send Request via WhatsApp",
"send_email": "Send Request via Email"
}
}
},
"pricing_page": {
"page_title": "Price List",
"table": {
"head": [
{"name": "Package Name"},
{"name": "Service Name"},
{"name": "Price Range (USD)"}
]
}
},
"accept_request_form": {
"head_text": "Initial Patient Admission Form"
},
"contact_us_page": {
"page_title": "Contact Us",
"info_box_title": "Get in Touch with Us"
},
"patient_rights_charter": {
"page_title": "Patient Rights Charter",
"section_one": {
"title": "Receiving Optimal Health Services is a Patient Right",
"content": "<ul className='list-disc marker:text-secondary marker:text-2xl '>\n<li>Provide dignified and respectful services that honor human value and cultural and religious beliefs.</li>\n<li>Offer services based on honesty, fairness, courtesy, and compassion.</li>\n<li>Be free from any discrimination, including ethnic, cultural, religious, disease type, or gender.</li>\n<li>Be evidence-based and prioritize the best interest of the patient.</li>\n<li>Ensure fair allocation of health resources and prioritize patient treatment needs.</li>\n<li>Coordinate all aspects of care, including prevention, diagnosis, treatment, and rehabilitation.</li>\n<li>Provide essential amenities while avoiding unnecessary pain, suffering, or restrictions.</li>\n<li>Pay special attention to the rights of vulnerable groups, including children, pregnant women, elderly, psychiatric patients, prisoners, mentally and physically disabled, and unaccompanied individuals.</li>\n<li>Provide services promptly while respecting patient time and considering factors such as language, age, and gender.</li>\n<li>Provide urgent and emergency care regardless of cost; non-urgent care should follow established regulations.</li>\n<li>If appropriate services cannot be provided in emergencies, arrange transfer to a equipped unit after essential care and explanations.</li>\n<li>In end-of-life stages where the disease is irreversible and death is imminent, provide services to ensure patient comfort.</li>\n</ul>"
},
"section_two": {
"title": "Information Must Be Provided to the Patient Adequately and Appropriately",
"content": "<ul className='list-disc marker:text-secondary marker:text-2xl'>\n<li>Patient rights charter provisions at the time of admission.</li>\n<li>Rules and foreseeable costs of the hospital, including medical and non-medical services, insurance regulations, and introduction of support systems at the time of admission.</li>\n<li>Names, responsibilities, and professional rank of medical team members responsible for patient care, including doctors, nurses, and students, and their professional interactions.</li>\n<li>Diagnostic and treatment methods, strengths and weaknesses of each method, potential side effects, disease diagnosis, prognosis, and all information affecting patient decision-making.</li>\n<li>Access to the attending physician and main medical team members during treatment, provision of necessary training for continuity of care, and all actions with research nature.</li>\n<li>Information must be provided timely and appropriately according to patient conditions, including anxiety, pain, individual characteristics such as language, education, and comprehension ability, unless delaying treatment due to this information would harm the patient, or the patient refuses information despite being aware of the right; in which case, the patients will should be respected, unless lack of information exposes the patient or others to new risks.</li>\n<li>The patient can access all information recorded in their clinical file, obtain a copy, and request correction of any errors.</li>\n</ul>"
},
"section_three": {
"title": "The Patient's Right to Choose and Make Informed Decisions Must Be Respected",
"content": "<ul className='list-disc space-y-2 text-[1.2rem] marker:text-secondary marker:text-2xl text-[#454547]'>\n<li>Choosing the attending physician and the health service center within regulatory framework, as well as consulting a second physician as an advisor.</li>\n<li>Participation or non-participation in any research, ensuring that the decision does not affect continuity or manner of receiving health services.</li>\n<li>Accepting or rejecting proposed treatments after understanding potential risks; except in cases of suicide or when refusal endangers another person.</li>\n<li>Patient's prior statements regarding future treatments, when capable of decision-making, should be recorded and guide medical actions in case of incapacity, following legal provisions.</li>\n<li>Patient's choice and decision-making must be free, informed, and based on sufficient and comprehensive information (as described above).</li>\n<li>After providing information, allow sufficient time for the patient to make informed decisions.</li>\n</ul>"
},
"section_four": {
"title": "Access to an Efficient Complaint Handling System is a Patient Right",
"content": "<ul className='list-disc space-y-2 text-[1.2rem] marker:text-secondary marker:text-2xl text-[#454547]'>\n<li>Every patient has the right to file a complaint with the relevant authorities in case of alleged violation of their rights under this charter, without affecting the quality of health services received.</li>\n<li>Patients have the right to be informed about the process and outcome of their complaint.</li>\n<li>Damages arising from errors by health service providers must be compensated promptly after review and verification, according to regulations.</li>\n</ul>"
}
},
"footer": {
"under_logo_text": "The International Patients Team at Shomal Hospital consists of professional healthcare specialists, medical interpreters, and medical travel consultants who provide multilingual, 24-hour support to international patients. Our mission is to ensure that you feel comfortable, safe, and supported throughout every stage of your treatment — from the initial consultation to your safe return home.",
"our_address": "Our Address",
"ipd_technician_number": "IPD Technician Contact",
"hospital_number": "Hospital Contact Number",
"contact_us_text": "Contact Us",
"contact_us": {
"address": "Iran, Mazandaran, Amol, Modarres Blvd, Aftab 47, Shomal Hospital",
"ipd_technician_number": "09385745269",
"hospital_number": "011-4492"
}
},
"medical_packages": [
{
"package_name": "Gastroenterology Package",
"services": [
{"service_name": "Upper Endoscopy"},
{"service_name": "Full Colonoscopy"},
{"service_name": "Combined Endoscopy and Colonoscopy"}
]
},
{
"package_name": "Hysterectomy Package",
"services": [
{"service_name": "Uterine or Cervical Cancer Surgery"},
{"service_name": "Ovarian Cancer Surgery"}
]
},
{
"package_name": "Cardiology Package",
"services": [
{"service_name": "Cardiac Angiography"},
{"service_name": "Angioplasty + Stenting"},
{"service_name": "Cardiac Electrophysiology Test"},
{"service_name": "Cardiac Ablation"},
{"service_name": "Cardiac Device Implantation (CRT)"},
{"service_name": "Cardiac Device Implantation (ICD)"},
{"service_name": "Cardiac Device Implantation (Pacemaker)"},
{"service_name": "Coronary Artery Bypass Grafting (CABG)"}
]
},
{
"package_name": "Cosmetic Package",
"services": [
{"service_name": "Liposuction / Lipomatic (Abdomen, Flanks, Thighs)"},
{"service_name": "Abdominoplasty (Tummy Tuck)"},
{"service_name": "Blepharoplasty (Upper and Lower Eyelids)"},
{"service_name": "Face and Neck Lift"},
{"service_name": "Breast Augmentation / Lift (With Implant)"},
{"service_name": "Breast Augmentation / Lift (Without Implant)"},
{"service_name": "Hair Transplant"},
{"service_name": "Sleeve"},
{"service_name": "Fat Injection to Face or Body"}
]
},
{
"package_name": "Orthopedic Package",
"services": [
{"service_name": "Hip Joint Replacement"},
{"service_name": "Knee Joint Replacement"}
]
},
{
"package_name": "Neurosurgery Package",
"services": [
{"service_name": "Spinal Surgery (Fusion)"},
{"service_name": "Spinal Surgery (Laminectomy)"},
{"service_name": "Spinal Surgery (Discectomy)"},
{"service_name": "Craniotomy"},
{"service_name": "Skull Base Surgery"},
{"service_name": "Brain Tumor Surgery"}
]
},
{
"package_name": "ENT Package",
"services": [
{"service_name": "Septoplasty (Correct Nasal Septum Deviation)"},
{"service_name": "Adenoidectomy and/or Tonsillectomy"},
{"service_name": "Nasal or Sinus Polyp (Polypectomy)"},
{"service_name": "Rhinoplasty (Nose Surgery)"}
]
}
],
"our_medical_packages": "<ul><li>💼 Full pre-arrival coordination: Coordination with Shomal Hospital to review medical records, consultation with specialist doctors, and sending a cost estimate</li><li>🛬 Airport reception and welcome: Private transfer from the airport to the hospital or hotel</li><li>🌐 Simultaneous interpreter: Translation services in English, Arabic, Kurdish, Turkish, etc.</li><li>🏨 Hotel and accommodation booking: Cooperation with hotels meeting international standards near the hospital</li><li>🧾 Administrative guidance and support: Issuance of invitation letter for medical visa, guidance on customs and residency</li><li>👨‍⚕️ Fast access to specialist doctors: Fully coordinated with Shomal Hospital; immediate appointments and direct referral to the best doctors in each specialty</li><li>📋 Post-discharge follow-up: Sending medical records, communication with the treating doctor, and answering patients follow-up questions</li></ul>",
"our_doctors": "Our Doctors",
"license_number": "Medical License Number",
"search_by_name": "Search by doctor's name",
"select_this": "Select ...",
"search": "Search",
"medical_packages_headTitle": "Our Medical Services",
"transfer_service_page": {
"page_title": "Tourism Services",
"introduction": {
"title": "Tourism Team Introduction",
"head_text": "<p>The medical tourism team of Shomal Hospital, in cooperation with Raz Navaye Aseman Alborz Company, has been established to provide a safe, comfortable, and professional experience for international patients. This team is responsible for presenting the hospitals capabilities and attracting patients from other countries. They serve as a communication bridge between the hospital and international markets.</p>",
"mojgan_yaghoubi": {
"fullname": "Mozhgan Yaghoubi",
"position": "Team Leader & Accommodation Coordinator",
"phone_number": "989353093925",
"email": "yaqoubi.mozhgan@gmail.com"
},
"hassan_mozaffarzadeh": {
"fullname": "Hassan Mozaffarzadeh",
"position": "Transfer & Tour Guide",
"phone_number": "989353093925",
"email": ""
},
"packages_list": "Package List",
"our_serives_ipd": "Our Services for International Patients",
"packages": [
{
"name": "Luxury Package",
"dsc": "<ul><li>Visa issuance</li><li>Airport and city transfer</li><li>Accompanying translator</li><li>Full-board stay in Oxin Royal Suite (double or twin room)</li><li>One-day excursion to Larijan hot springs or Beliron forest (based on travelers choice)</li></ul>",
"price": "Estimated price: around 1900 USD"
},
{
"name": "Standard Package",
"dsc": "<ul><li>Visa issuance</li><li>Airport and city transfer</li><li>Accompanying translator</li><li>Stay in Oxin Hotel standard rooms (double or twin) with breakfast</li><li>Half-day city tour of Amol</li></ul>",
"price": "Estimated price: around 1500 USD"
},
{
"name": "Economy Package",
"dsc": "<ul><li>Visa issuance</li><li>Airport and city transfer</li><li>Accompanying translator</li><li>Stay at Olympic Hotel with breakfast</li></ul>",
"price": "Estimated price: around 900 USD"
}
],
"image_headTitle": "Half-day Amol City Tour",
"amol_museum": "Amol Museum",
"grand_mosque": "Amol Grand Mosque",
"fire_temple": "Amol Fire Temple"
},
"jobs": "<ul><li>Responding to initial inquiries from patients and agents</li><li>Medical visa issuance and travel insurance</li><li>Booking accommodations based on patient budget and preferences (hotel, guesthouse, apartment)</li><li>Airport transfer to hospital or residence</li><li>Planning recreational and cultural tours in Amol and nearby areas (depending on patient health)</li><li>Accompanying tourist interpreter if needed</li><li>Arranging companion accommodation and transportation services</li></ul>",
"services": "<ul><li>Full coordination before arrival</li><li>Coordination with Shomal Hospital for medical records review, specialist consultation, and cost estimation</li><li>Airport pick-up and reception</li><li>Private transfer to hospital or hotel</li><li>Accompanying multilingual tour guide and interpreter</li><li>Hotel reservation in partnership with international-standard hotels near the hospital</li><li>Administrative support (medical visa invitation letter, customs and residency assistance)</li><li>Full coordination with Shomal Hospital: immediate appointments and referrals to the best specialists</li><li>Post-discharge follow-up (medical file delivery, communication with physician, and answering patient questions)</li></ul><p><strong>Basic Service Fee:</strong> Includes transfer, guide, shared double room accommodation, visa issuance 1500 USD</p><p><strong>Optional Tours:</strong> If patient is in good condition Larijan hot springs full-board stay</p>"
},
"package_price": "Package Price",
"reserve_ipd": "Book an appointment & free consultation with IPD expert and doctor",
"phone_number": "Phone Number",
"email": "Email",
"oxin_hotel_location": "Oxin Hotel Location",
"olympic_hotel_location": "Olympic Hotel Location",
"upload_documents": {
"head_text": "Medical Documents Upload Form",
"input_code_placeholder": "Enter the code received from the specialist",
"input_files_label": "Upload multiple medical document files",
"input_dsc": "If you have any notes about the documents, write them here",
"sendbutton": "Send Documents"
},
"related_links":"Related Links"
}

View File

@@ -0,0 +1,240 @@
{
"products": {
"cart": "افزودن به سبد خرید"
},
"accept_request_form": {
"head_text": "فرم اولیه پذیرش بیمار"
},
"about_page": {
"page_title": "درباره ما",
"introduction": "معرفی دپارتمان بیماران بین الملل",
"introduction_description_headText": "واحد بیماران بین‌الملل بیمارستان شمال با هدف ارائه خدمات درمانی با استانداردهای بین‌المللی به بیماران خارجی و ایرانیان مقیم خارج از کشور راه‌اندازی شده است. ما با تیمی متخصص، چندزبانه و با تجربه، همراه شما در تمامی مراحل درمان، از مشاوره اولیه تا بازگشت به کشور خود، خواهیم بود.\n• دارای مجوز رسمی از وزارت بهداشت کشور\n• درجه یک اعتباربخشی ملی\n• بیش از 12 سال تجربه\n• تیم چندزبانه (انگلیسی، عربی، ترکی)\n• همراهی کامل از زمان ورود تا ترخیص\n• هزینه‌های مقرون‌به‌صرفه با ارائه کیفیت عالی\n• خدمات ویژه مانند ترانسفر فرودگاهی، اتاق‌های VIP، مترجم و گشت شهری، سواحل دریای کاسپین، جنگل‌های هیرکانی و ييلاقات با نمای قله دماوند",
"introduction_description_subText": "<ul className='introduction_description_subText'><li>دارای مجوز رسمی از وزارت بهداشت کشور</li><li>درجه یک اعتباربخشی ملی</li><li>بیش از 12 سال تجربه</li><li>تیم چندزبانه (انگلیسی، عربی، ترکی)</li><li>همراهی کامل از زمان ورود تا ترخیص</li><li>هزینه‌های مقرون‌به‌صرفه با ارائه کیفیت عالی</li><li>خدمات ویژه مانند ترانسفر فرودگاهی، اتاق‌های VIP، مترجم و گشت شهری، سواحل دریای کاسپین، جنگل‌های هیرکانی و ییلاقات با نمای قله دماوند</li></ul>",
"department_introduction": "تیم دپارتمان بیماران بین الملل",
"department_introduction_subtitle": "هدف ما این است که شما در تمام مراحل درمان — از مشاوره اولیه تا بازگشت به کشور خود — احساس آرامش، امنیت و همراهی داشته باشید.",
"dr_jafarian": {
"name": "دکتر محسن جعفریان",
"expertise": "دکتری مدیریت خدمات بهداشتی و درمانی",
"position": "مدیر بیمارستان / مدیر دپارتمان بیماران بین الملل"
},
"dr_motamedi": {
"name": "دکتر حسن معتمدی مطلق",
"expertise": "متخصص طب اورژانس",
"position": "پزشک بیماران بین الملل"
},
"heidarnejad": {
"name": "رویا حیدرنژاد",
"expertise": "کارشناس فوریت پزشکی",
"position": "کارشناس بیماران بین الملل"
},
"form": {
"head_text": "آیا نیاز به مشاوره پزشکی دارید؟",
"sub_text": "اطلاعاتی درباره بیماری خود برای ما ارسال نمایید. در اسرع وقت با شما تماس خواهیم گرفت.",
"fields": {
"first_name": "نام شما",
"last_name": "نام خانوادگی شما",
"email": "ایمیل",
"sex": "جنسیت",
"country": "کشور شما",
"services": "یکی از پکیج های خدمات پزشکی را انتخاب کنید",
"phone_number": "شماره موبایل",
"age": "سن شما",
"message": "از بیماری تان برایمان بنویسید"
},
"buttons": {
"send_whatsapp": "ارسال درخواست از طریق واتساپ",
"send_email": "ارسال درخواست از طریق ایمیل"
}
}
},
"pricing_page": {
"page_title": "لیست قیمت ها",
"table": {
"head": [
{
"name": "نام پکیج"
},
{
"name": "نام خدمت"
},
{
"name": "حدود قیمت به دلار (آمریکا)"
}
]
}
},
"patient_rights_charter": {
"page_title": "منشور حقوق بیمار",
"section_one": {
"title": "دریافت مطلوب خدمات سلامت حق بیمار است",
"content": "<ul className='list-disc marker:text-secondary marker:text-2xl '>\n<li>خدمات شایسته و در شأن و منزلت انسان و با احترام به ارزش‌ها، اعتقادات فرهنگی و مذهبی باشد.</li>\n<li>ارائه خدمات بر پایه صداقت، انصاف، ادب و همراه با مهربانی باشد.</li>\n<li>فارغ از هرگونه تبعیض از جمله قومی، فرهنگی، مذهبی، نوع بیماری و جنسیتی باشد.</li>\n<li>بر اساس دانش روز و مبتنی بر برتری منافع بیمار باشد.</li>\n<li>در مورد توزیع منابع سلامت مبتنی بر عدالت و اولویت‌های درمانی بیماران باشد.</li>\n<li>مبتنی بر هماهنگی ارکان مراقبت اعم از پیشگیری، تشخیص، درمان و توانبخشی باشد.</li>\n<li>به همراه تأمین کلیه امکانات رفاهی پایه و ضروری و به دور از تحمیل درد، رنج و محدودیت‌های غیرضروری باشد.</li>\n<li>توجه ویژه به حقوق گروه‌های آسیب‌پذیر جامعه از جمله کودکان، زنان باردار، سالمندان، بیماران روانی، زندانیان، معلولان ذهنی و جسمی و افراد بدون سرپرست داشته باشد.</li>\n<li>در سریع‌ترین زمان ممکن و با احترام به وقت بیمار و با در نظر گرفتن متغیرهایی چون زبان، سن و جنس گیرندگان خدمت باشد.</li>\n<li>در مراقبت‌های ضروری و فوری (اورژانس)، بدون توجه به تأمین هزینه آن صورت گیرد و در موارد غیر فوری بر اساس ضوابط تعریف‌شده باشد.</li>\n<li>در مراقبت‌های ضروری و فوری (اورژانس)، در صورتی که ارائه خدمات مناسب ممکن نباشد، پس از ارائه خدمات ضروری و توضیحات لازم، زمینه انتقال بیمار به واحد مجهز فراهم گردد.</li>\n<li>در مراحل پایانی حیات که وضعیت بیماری غیرقابل برگشت و مرگ بیمار قریب‌الوقوع می‌باشد، خدمات با هدف حفظ آسایش وی ارائه گردد.</li>\n</ul>"
},
"section_two": {
"title": " اطلاعات باید به نحو مطلوب و به میزان کافی در اختیار بیمار قرارگیرد",
"content": "<ul className='list-disc marker:text-secondary marker:text-2xl'>\n<li>مفاد منشور حقوق بیمار در زمان پذیرش.</li>\n<li>ضوابط و هزینه‌های قابل پیش‌بینی بیمارستان اعم از خدمات درمانی و غیر درمانی و ضوابط بیمه و معرفی سیستم‌های حمایتی در زمان پذیرش.</li>\n<li>نام، مسئولیت و رتبه حرفه‌ای اعضای گروه پزشکی مسئول ارائه مراقبت از جمله پزشک، پرستار و دانشجو و ارتباط حرفه‌ای آن‌ها با یکدیگر.</li>\n<li>روش‌های تشخیصی و درمانی و نقاط ضعف و قوت هر روش و عوارض احتمالی آن، تشخیص بیماری، پیش‌آگهی و عوارض آن و نیز کلیه اطلاعات تأثیرگذار در روند تصمیم‌گیری بیمار.</li>\n<li>نحوه دسترسی به پزشک معالج و اعضای اصلی گروه پزشکی در طول درمان و ارائه آموزش‌های ضروری برای استمرار درمان و کلیه اقداماتی که ماهیت پژوهشی دارند.</li>\n<li>اطلاعات باید در زمان مناسب و متناسب با شرایط بیمار از جمله اضطراب و درد و ویژگی‌های فردی وی از جمله زبان، تحصیلات و توان درک در اختیار وی قرار گیرد؛ مگر اینکه تأخیر در شروع درمان به واسطه ارائه اطلاعات فوق سبب آسیب به بیمار گردد، یا بیمار علیرغم اطلاع از حق دریافت اطلاعات، از این امر امتناع نماید که در این صورت باید خواست بیمار محترم شمرده شود؛ مگر اینکه عدم اطلاع بیمار، وی یا سایرین را در معرض خطر جدید قرار دهد.</li>\n<li>بیمار می‌تواند به کلیه اطلاعات ثبت‌شده در پرونده بالینی خود دسترسی داشته باشد، تصویر آن را دریافت نموده و تصحیح اشتباهات مندرج در آن را درخواست نماید.</li>\n</ul>"
},
"section_three": {
"title": " حق انتخاب و تصمیم گیری آزادانه بیمار در دریافت خدمات سلامت باید محترم شمرده شود.",
"content": "<ul className='list-disc space-y-2 text-[1.2rem] marker:text-secondary marker:text-2xl text-[#454547]'>\n<li>انتخاب پزشک معالج و مرکز ارائه‌کننده خدمات سلامت در چارچوب ضوابط و همچنین انتخاب و نظرخواهی از پزشک دوم به‌عنوان مشاور.</li>\n<li>شرکت یا عدم شرکت در هرگونه پژوهش، با اطمینان از اینکه تصمیم‌گیری وی تأثیری در تداوم و نحوه دریافت خدمات سلامت نخواهد داشت.</li>\n<li>قبول یا رد درمان‌های پیشنهادی پس از آگاهی از عوارض احتمالی ناشی از پذیرش یا رد آن؛ مگر در موارد خودکشی یا شرایطی که امتناع از درمان شخص دیگری را در معرض خطر جدی قرار می‌دهد.</li>\n<li>اعلام نظر قبلی بیمار در مورد اقدامات درمانی آتی، در زمانی که بیمار واجد ظرفیت تصمیم‌گیری می‌باشد ثبت و به‌عنوان راهنمای اقدامات پزشکی در زمان فقدان ظرفیت تصمیم‌گیری وی، با رعایت موازین قانونی مدنظر ارائه‌کنندگان خدمات سلامت و تصمیم‌گیرنده جایگزین بیمار قرار گیرد.</li>\n<li>انتخاب و تصمیم‌گیری بیمار باید آزادانه و آگاهانه و مبتنی بر دریافت اطلاعات کافی و جامع (مذکور در بند دوم) باشد.</li>\n<li>پس از ارائه اطلاعات، زمان لازم و کافی به بیمار جهت تصمیم‌گیری و انتخاب داده شود.</li>\n</ul>"
},
"section_four": {
"title": "دسترسی به نظام کارآمد رسیدگی به شکایات حق بیمار است.",
"content": "<ul className='list-disc space-y-2 text-[1.2rem] marker:text-secondary marker:text-2xl text-[#454547]'>\n<li>هر بیمار حق دارد در صورت ادعای نقض حقوق خود که موضوع این منشور است، بدون اختلال در کیفیت دریافت خدمات سلامت، به مقامات ذی‌صلاح شکایت نماید.</li>\n<li>بیماران حق دارند از نحوه رسیدگی و نتایج شکایت خود آگاه شوند.</li>\n<li>خسارت ناشی از خطای ارائه‌کنندگان خدمات سلامت باید پس از رسیدگی و اثبات، مطابق مقررات در کوتاه‌ترین زمان ممکن جبران شود.</li>\n</ul>"
}
},
"contact_us_page": {
"page_title": "ارتباط با ما",
"info_box_title": "با ما درارتباط باشید"
},
"footer": {
"under_logo_text": "تیم بیماران بین‌الملل در بیمارستان ما متشکل از گروهی حرفه‌ای از متخصصین مراقبت سلامت، مترجمین پزشکی، و مشاوران سفر درمانی است که به صورت ۲۴ ساعته و چندزبانه در خدمت بیماران خارجی هستند. هدف ما این است که شما در تمام مراحل درمان — از مشاوره اولیه تا بازگشت به کشور خود — احساس آرامش، امنیت و همراهی داشته باشید.",
"our_address": "آدرس ما",
"ipd_technician_number": "شماره تماس کارشناس",
"hospital_number": "شماره تماس بیمارستان",
"contact_us_text": "ارتباط با ما",
"contact_us": {
"address": " ایران ، مازندران ، آمل ، بلوار مدرس آفتاب 47 بیمارستان شمال",
"ipd_technician_number": "09385745269",
"hospital_number": "011-4492"
}
},
"medical_packages": [
{
"package_name": "پكيج گوارش",
"services": [
{"service_name": "آندوسکوپی فوقانی"},
{"service_name": "کولونوسکوپی کامل"},
{"service_name": "آندوسکوپی و کولونوسکوپی هم‌زمان"}
]
},
{
"package_name": "پكيج هيستركتومي",
"services": [
{"service_name": "جراحی سرطان رحم یا دهانه رحم"},
{"service_name": "جراحی سرطان تخمدان"}
]
},
{
"package_name": "پكيج قلب",
"services": [
{"service_name": "آنژیوگرافی قلب"},
{"service_name": "آنژیوپلاستی + استنت‌گذاری (فنر قلب)"},
{"service_name": "تست الکتروفیزیولوژی قلب"},
{"service_name": "ابلیشن قلبی"},
{"service_name": "نصب دستگاه‌های قلبی (CRT)"},
{"service_name": "نصب دستگاه‌های قلبی (ICD)"},
{"service_name": "نصب دستگاه‌های قلبی (Pacemaker)"},
{"service_name": "CABG"}
]
},
{
"package_name": "پكيج زيبايي",
"services": [
{"service_name": "لیپوساکشن / لیپوماتیک (شکم، پهلو، ران)"},
{"service_name": "ابدومینوپلاستی (جراحی زیبایی شکم)"},
{"service_name": "بلفاروپلاستی (جراحی پلک بالا و پایین)"},
{"service_name": "لیفت صورت و گردن"},
{"service_name": "پروتز سینه / لیفت سینه (با پروتز)"},
{"service_name": "پروتز سینه / لیفت سینه (بدون پروتز)"},
{"service_name": "کاشت مو"},
{"service_name": "اسليو"},
{"service_name": "تزریق چربی به صورت یا بدن"}
]
},
{
"package_name": "پكيج ارتوپدي",
"services": [
{"service_name": "تعويض مفصل ران"},
{"service_name": "تعويض مفصل زانو"}
]
},
{
"package_name": "پكيج جراحي مغز",
"services": [
{"service_name": "جراحي ستون فقرات (فيوژن)"},
{"service_name": "جراحي ستون فقرات (لامينكتومي)"},
{"service_name": "جراحي ستون فقرات (ديستكتومي)"},
{"service_name": "كرانيوتومي"},
{"service_name": "جراحي قاعده جمجمه"},
{"service_name": "جراحي تومورهاي مغزي"}
]
},
{
"package_name": "پكيج گوش و حلق و بيني",
"services": [
{"service_name": "سپتوپلاستی (اصلاح انحراف تیغه بینی)"},
{"service_name": "آدنوئیدکتومی و/یا لوزه ‌برداری"},
{"service_name": "پلیپ بینی یا سینوس (پولیپکتومی)"},
{"service_name": "رینوپلاستی (جراحی بینی)"}
]
}
],
"our_doctors":"پزشکان ما",
"license_number":"شماره نظام پزشکی",
"search_by_name":"جستجو بر اساس نام پزشک",
"select_this":"انتخاب کنید",
"search":"جستجو",
"our_medical_packages": "<ul><li>💼 هماهنگی کامل پیش از ورود: هماهنگی با بیمارستان شمال برای بررسی مدارک پزشکی، مشاوره با پزشکان متخصص و ارسال برآورد هزینه</li><li>🛬 پذیرش و استقبال از فرودگاه: ترانسفر اختصاصی از فرودگاه به بیمارستان یا هتل</li><li>🌐 مترجم همزمان: ارائه خدمات ترجمه به زبان‌های انگلیسی، عربی، کردی، ترکی و...</li><li>🏨 رزرو هتل و اقامتگاه: همکاری با هتل‌های هم‌سطح با استانداردهای بین‌المللی در نزدیکی بیمارستان</li><li>🧾 راهنمایی و پشتیبانی امور اداری: صدور دعوت‌نامه برای ویزای درمانی، راهنمایی در امور گمرکی و اقامت</li><li>👨‍⚕️ دسترسی سریع به پزشکان متخصص: کاملاً هماهنگ با بیمارستان شمال؛ نوبت‌دهی فوری و ارجاع مستقیم به بهترین پزشکان در هر تخصص</li><li>📋 پیگیری بعد از ترخیص: ارسال پرونده پزشکی، ارتباط با پزشک معالج و پاسخ به سوالات بعدی بیمار</li></ul>",
"medical_packages_headTitle":"خدمات پزشکی ما",
"transfer_service_page": {
"page_title": "خدمات گردشگری",
"introduction": {
"title": "معرفی تیم گردشگری",
"head_text": "<p>تیم گردشگری درمانی بیمارستان شمال با همکاری شرکت راز نوای آسمان البرز با هدف فراهم کردن تجربه‌ای ایمن، راحت و حرفه‌ای برای بیماران بین‌الملل شکل گرفته است. این تیم وظیفه معرفی قابلیت‌های بیمارستان و جذب بیماران از کشورهای دیگر را بر عهده دارد. آنها پل ارتباطی بین بیمارستان و بازارهای بین‌المللی هستند.</p>",
"mojgan_yaghoubi": {
"fullname": "مژگان یعقوبی",
"position": "سرتیم و هماهنگ کننده اقامت",
"phone_number": "989353093925",
"email": "yaqoubi.mozhgan@gmail.com"
},
"hassan_mozaffarzadeh": {
"fullname": "حسن مظفرزاده",
"position": "ترانسفر و راهنماي تور",
"phone_number": "989353093925",
"email": ""
},
"packages_list": "لیست پکیج ها",
"our_serives_ipd": "خدمات ما برای بیماران بین الملل",
"packages": [
{
"name": "پکیج لوکس",
"dsc": "<ul><li>اخذ ویزا</li><li>ترانسفر فرودگاهی و شهری</li><li>مترجم همراه</li><li>اقامت فولبورد در سوییت رویال هتل اکسین (اتاق دبل یا تویین)</li><li>گشت یک روزه چشمه‌های آب معدنی لاریجان یا جنگل بلیرون (انتخاب به عهده مسافر می‌باشد)</li></ul>",
"price": "قیمت پيشنهادي حدود ۱۹۰۰ دلار"
},
{
"name": "پکیج عادی",
"dsc": "<ul><li>اخذ ویزا</li><li>ترانسفر فرودگاهی و شهری</li><li>مترجم همراه</li><li>اقامت در اتاق‌های استاندارد هتل اکسین (اتاق دبل یا تویین) همراه با صبحانه</li><li>گشت نیم‌روزه شهر آمل</li></ul>",
"price": "قیمت پیشنهادی حدود ۱۵۰۰ دلار"
},
{
"name": "پکیج اقتصادی",
"dsc": "<ul><li>اخذ ویزا</li><li>ترانسفر فرودگاهی و شهری</li><li>مترجم همراه</li><li>اقامت در هتل المپیک با صبحانه</li></ul>",
"price": "قیمت پیشنهادی حدود ۹۰۰ دلار"
}
],
"image_headTitle": "گشت نیم‌روزه شهر آمل",
"amol_museum": "موزه آمل",
"grand_mosque": "مسجد جامع آمل",
"fire_temple": "آتشکده آمل"
},
"jobs_title": "وظایف این تیم",
"jobs": "<ul><li>پاسخگویی به استعلام‌ها و درخواست‌های اولیه بیماران و واسطه‌ها</li><li>اخذ ویزای درمانی و صدور بيمه گردشگري</li><li>رزرو اقامتگاه مناسب با بودجه و ترجیحات بیمار (هتل، مهمانسرا، آپارتمان)</li><li>ترانسفر فرودگاهی از فرودگاه به بیمارستان یا اقامتگاه</li><li>برنامه‌ریزی تورهای تفریحی و فرهنگی در آمل و شهرهای مجاور (در صورت سلامت بیمار)</li><li>همراهی مترجم گردشگری در صورت نیاز</li><li>هماهنگی اقامت همراهان بیمار و خدمات حمل و نقل</li></ul>",
"services": "<ul><li>هماهنگی کامل پیش از ورود</li><li>هماهنگی با بیمارستان شمال برای بررسی مدارک پزشکی، مشاوره با پزشکان متخصص و ارسال برآورد هزینه</li><li>پذیرش و استقبال از فرودگاه</li><li>ترانسفر اختصاصی از فرودگاه به بیمارستان یا هتل</li><li>همراهی تورلیدر مسلط به زبان به عنوان راهنما و مترجم</li><li>رزرو هتل و اقامتگاه (همکاری با هتل‌های هم‌سطح با استانداردهای بین‌المللی در نزدیکی بیمارستان)</li><li>راهنمایی و پشتیبانی امور اداری (صدور دعوت‌نامه برای ویزای درمانی، راهنمایی در امور گمرکی و اقامت)</li><li>کاملا هماهنگ با بیمارستان شمال: نوبت‌دهی فوری و ارجاع مستقیم به بهترین پزشکان در هر تخصص</li><li>پیگیری بعد از ترخیص (ارسال پرونده پزشکی، ارتباط با پزشک معالج و پاسخ به سوالات بعدی بیمار)</li></ul><p><strong>هزینه خدمات پایه:</strong> شامل ترنسفر، لیدر همراه، اقامت هر نفر در اتاق دو تخته، اخذ ویزا 1500 دلار</p><p><strong>تورهای آپشنال تفریحی:</strong> در صورت سلامت بیمار چشمه‌های آب معدنی لاریجان با اقامت فولبورد</p>"
},
"package_price": "قیمت پکیج",
"reserve_ipd": "رزرو نوبت و مشاوره رايگان با پزشك و كارشناس IPD",
"phone_number": "شماره موبایل",
"email": "ایمیل",
"oxin_hotel_location":"لوکیشن هتل اکسین",
"olympic_hotel_location":"لوکیشن هتل المپیک",
"upload_documents":{
"head_text":"فرم آپلود مدارک پزشکی",
"input_code_placeholder":"کد دریافتی از کارشناس را وارد کنید",
"input_files_label":"آپلود چندین فایل از مدارک پزشکی",
"input_dsc":"اگر توضیحی بابت مدارک وجود دارد برایمان بنویسید",
"sendbutton":"ارسال مدارک"
},
"related_links":"لینک های مرتبط"
}

View File

@@ -0,0 +1,124 @@
import {DoctorDataType, languages_types} from "@/types";
import DoctorsFilterBox from "@/ui/forms/DoctorsFilterBox";
import PageHeaderSlider from "@/ui/page-header-slider/PageHeaderSlider";
import {toPersianNumber} from "@/utils/functions";
import Image from "next/image";
import React from "react";
import { getDictionary } from "../dictionaries";
import { Metadata } from "next";
import { pages_titles } from "@/constants";
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,
searchParams,
}: {
params: Promise<{lang: languages_types}>;
searchParams: Promise<{page: string; name: string; expertise: string}>;
}) {
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 nameMatch = name
? Object.values(doctor.fullname)
.join(" ")
.toLowerCase()
.includes(name.toLowerCase())
: true;
const expertiseMatch = expertise
? doctor.category.id.toString() === expertise
: true;
return nameMatch && expertiseMatch;
});
return (
<>
<PageHeaderSlider
lang={lang}
pageTitle={our_doctors}
imageSrc="/header-slider-1.webp"
/>
<div className="my-16 container">
<div className="bg-[#F8F9FA] rounded-4xl lg:px-20 py-16">
<h3 className="lg:text-[3em] text-2xl 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%] ">
{our_doctors}
</h3>
<DoctorsFilterBox
lang={lang}
defaultName={name}
defaultExpertise={expertise}
dict={{search,search_by_name,select_this}}
/>
<div className="grid grid-cols-4 gap-10 mt-10 ">
{filteredData?.map((doctor: DoctorDataType) => (
<div
key={doctor.id}
className="lg:col-span-1 col-span-3 rounded-2xl border-[1px] border-neutral-200 overflow-hidden relative"
>
<div className="lg:h-[250px] h-[200px] relative before:absolute before:bottom-0 before:bg-gradient-to-t before:from-white before:to-transparent before:z-10 before:w-full before:h-full before:top-0 before:right-0">
<Image
src="/doctor.png"
fill
alt=""
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]}
</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]}
</h3>
<div>
<div className="text-secondary">
<ul className="space-y-[2px]">
{doctor.specialties.map((item) => (
<li
key={item.id}
className="list-inside list-disc md:text-base text-sm font-medium"
>
{item.name[lang]}
</li>
))}
</ul>
</div>
</div>
<div>
<span className="text-black text-sm font-medium">
{license_number} :{" "}
{lang === "en"
? doctor?.doctor_identify_number
: toPersianNumber(
String(doctor?.doctor_identify_number)
)}
</span>
</div>
</div>
</div>
))}
</div>
</div>
</div>
</>
);
}

154
src/app/[lang]/layout.tsx Normal file
View File

@@ -0,0 +1,154 @@
import type {Metadata} from "next";
import "../globals.css";
import {FontVazir} from "@/config/font.config";
import TopMenu from "@/ui/components/top-menu/TopMenu";
import TopNavbar from "@/ui/top-navbar";
import Image from "next/image";
import {FooterMenuLinks1} from "@/constants/menu/menu.const";
import CustomLink from "@/ui/components/global/CustomLink";
import {getHref} from "@/utils/functions";
import {languages_types} from "@/types";
import { getDictionary } from "./dictionaries";
export const metadata: Metadata = {
title: "Create Next App",
description: "Generated by create next app",
};
export async function generateStaticParams() {
return [{lang: "en"}, {lang: "fa"}, {lang: "ar"}];
}
export default async function RootLayout({
children,
params,
}: Readonly<{
children: React.ReactNode;
params: Promise<{lang: string}>;
}>) {
const {lang} = await params;
const dict = await getDictionary(lang as languages_types);
const {footer} = dict || {};
return (
<html lang={(await params).lang} dir={`${lang === "en" ? "ltr" : "rtl"}`}>
<body
className={`${FontVazir.variable} antialiased`}
style={{fontFamily: FontVazir.style.fontFamily}}
>
<TopNavbar lang={lang as languages_types} />
<TopMenu lang={lang as languages_types} />
{children}
<footer className="bg-blue-primary rounded-t-2xl py-20 container ">
<div className="grid lg:grid-cols-12 sm:grid-cols-2 grid-cols-1 w-full container lg:gap-x-10 gap-y-0 gap-y-10">
<div className="lg:col-span-3 col-span-12 flex flex-col items-center justify-start gap-x-3">
<div className="relative h-[140px] w-[140px]">
<Image
loading="lazy"
src="/main-logo.png"
fill
alt="shomal hospital"
style={{
color: "transparent",
fill: "red",
objectFit: "contain",
}}
/>
</div>
<p
className={`text-white leading-relaxed mt-4 text-sm ${
lang === "en" ? "text-left" : "text-right"
}`}
>
{footer?.under_logo_text}
</p>
</div>
<div className="lg:col-span-5 col-span-12 flex justify-center">
<div className="space-y-5">
<h4 className="text-white mb-10">{dict.related_links}</h4>
<ul className="space-y-4 text-neutral-300 transition-colors duration-300 mt-5">
{FooterMenuLinks1.map((link) => (
<li
key={link.id}
className="group cursor-pointer hover:text-secondary flex items-center text-menu-colors relative !h-full "
>
<span className="flex items-center gap-x-2 !h-full ">
<CustomLink
href={getHref(link.href, lang)}
label={link.label[lang]}
className={`font-medium transition-all `}
/>
</span>
</li>
))}
</ul>
</div>
</div>
<div className="lg:col-span-4 col-span-12">
<div className=" p-4 bg-white rounded-xl">
<h4 className="font-semibold text-secondary mb-4">
{footer?.contact_us_text}
</h4>
<p className="text-sm">
<strong className=" text-blue-primary">
{footer?.our_address}
</strong>{" "}
:{footer?.contact_us?.address}
</p>
<p className="mt-4 rtl text-sm">
<strong className=" text-blue-primary">
{footer?.ipd_technician_number}
</strong>{" "}
: &nbsp;
<span style={{direction: "ltr"}}>
{footer?.contact_us?.ipd_technician_number}
</span>
</p>
<p className="my-4 rtl text-sm">
<strong className=" text-blue-primary">
{footer?.hospital_number}
</strong>{" "}
: &nbsp;
<span style={{direction: "ltr"}}>
{footer?.contact_us?.hospital_number}
</span>
</p>
<div className="relative w-full pb-[56.25%] rounded-xl overflow-hidden">
<iframe
src="https://www.google.com/maps/embed?pb=!1m14!1m8!1m3!1d6419.524849772638!2d52.347594!3d36.439127!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3f8fbd6849bf386b%3A0x26cbc9441b00f373!2sShomal%20Hospital!5e0!3m2!1sen!2sus!4v1762836982418!5m2!1sen!2sus"
// width="100%"
style={{border: "0"}}
allowFullScreen={false}
loading="lazy"
referrerPolicy="no-referrer-when-downgrade"
className="absolute top-0 left-0 w-full h-full border-0"
></iframe>
</div>
</div>
</div>
</div>
</footer>
</body>
</html>
);
}
// import type {Metadata} from "next";
// import "../globals.css";
// import { languages_types } from "@/types";
// export const metadata: Metadata = {
// title: "Next.js App",
// description: "Generated by Next.js",
// };
// export default async function InsideLayout({
// children,
// params,
// }: {
// children: React.ReactNode;
// params:Promise<{lang:languages_types}>;
// }) {
// const {lang}=(await params)
// return (
// <html lang="en">
// <body>{children}</body>
// </html>
// );
// }

View File

@@ -0,0 +1,65 @@
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;
}
export default async function SingleMedicalService({
params,
}: {
params: Promise<{slug: string; lang: "fa" | "en"}>;
}) {
const {slug, lang} = await params;
const data = (await getData(slug)) || [];
if (!data || !data.length) {
return notFound();
}
return (
<>
<PageHeaderSlider
lang={lang}
pageTitle={data[0].title[lang]}
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]}
</h3>
<div className="mt-10 space-y-6">
{data[0].sub_packages.map((item:sub_packages_data_type, index: number) =>
item?.description?.[lang] ? (
<Accordion
key={item.id}
title={item.title[lang]}
index={index}
description={item?.description?.[lang] ?? ""}
services={item?.services?.[lang] ?? ""}
price={item?.price?.[lang] ?? ""}
thumbnail={item?.thumbnail ?? ""}
notes={item?.notes?.[lang] ?? ""}
/>
) : (
""
)
)}
</div>
</div>
</section>
</>
);
}

View File

@@ -0,0 +1,124 @@
import PageHeaderSlider from "@/ui/page-header-slider/PageHeaderSlider";
import Link from "next/link";
import React, {lazy, Suspense} from "react";
import {packages_types} from "@/types";
import { getDictionary } from "../dictionaries";
import { Metadata } from "next";
import { pages_titles } from "@/constants";
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)
return (
<>
<PageHeaderSlider
pageTitle={medical_packages_headTitle}
lang={lang}
imageSrc="/header-slider-1.webp"
/>
<section className="mb-24 mt-10 container ">
<div className="bg-[#F8F9FA] rounded-4xl px-40 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%] ">
{medical_packages_headTitle}
</h3>
<div className="mt-16">
{/* <p className="text-justify text-[1.2rem] leading-relaxed text-[#454547]">
</p>
<br />
<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) => {
const LazyComponent = lazy(
() => import(`@/ui/components/icons/${item.svg}.tsx`)
);
return (
<div className="col-span-4" key={item.id}>
<Link
href={`/medical-services/${item.slug}`}
className="flex flex-col items-center justify-center py-10 w-full h-full rounded-xl border-[1px] border-neutral-200 bg-white hover:border-secondary"
>
<span>
<Suspense
fallback={<div>در حال بارگذاری...</div>}
key={item.id}
>
<LazyComponent />
</Suspense>
</span>
<span className="text-xl font-medium mt-4">
{item.title[lang]}
</span>
</Link>
</div>
);
})}
{/* <div className="col-span-4 rounded-xl border-[1px] border-neutral-200 bg-white flex flex-col items-center justify-center py-10">
<span>
<HysterectomySvg />
</span>
<span className="text-xl font-medium mt-4">
پکیج هیسترکتومی
</span>
</div>
<div className="col-span-4 rounded-xl border-[1px] border-neutral-200 bg-white flex flex-col items-center justify-center py-10">
<span>
<CardiacSvg />
</span>
<span className="text-xl font-medium mt-4">پکیج قلب</span>
</div>
<div className="col-span-4 rounded-xl border-[1px] border-neutral-200 bg-white flex flex-col items-center justify-center py-10">
<span>
<BeautySvg />
</span>
<span className="text-xl font-medium mt-4">پکیج زیبایی</span>
</div>
<div className="col-span-4 rounded-xl border-[1px] border-neutral-200 bg-white flex flex-col items-center justify-center py-10">
<span className="text-blue-primary">
<OrthopedicSvg />
</span>
<span className="text-xl font-medium mt-4">پکیج ارتوپدی</span>
</div>
<div className="col-span-4 rounded-xl border-[1px] border-neutral-200 bg-white flex flex-col items-center justify-center py-10">
<span className="text-blue-primary">
<BrainSurgerySvg />
</span>
<span className="text-xl font-medium mt-4">پکیج جراحی مغز</span>
</div>
<div className="col-span-4 rounded-xl border-[1px] border-neutral-200 bg-white flex flex-col items-center justify-center py-10">
<span className="text-blue-primary">
<EntSvg />
</span>
<span className="text-xl font-medium mt-4">
پکیج گوش و حلق و بینی
</span>
</div> */}
{/* <Accordion items={PACKAGE_SERVICES} /> */}
</div>
</div>
</div>
</section>
</>
);
}

204
src/app/[lang]/page.tsx Normal file
View File

@@ -0,0 +1,204 @@
import React from "react";
import PageHeaderSlider from "@/ui/page-header-slider/PageHeaderSlider";
import Image from "next/image";
import PatientConsultantForm from "@/ui/forms/PatientConsultantForm";
import {getDictionary} from "./dictionaries";
export default async function Page({
params,
}: {
params: Promise<{lang: "en" | "fa" | "ar"}>;
}) {
const {lang} = await params;
const {about_page} = await getDictionary(lang);
return (
<>
{/* <Dropdown options={site_languages} /> */}
<PageHeaderSlider
lang={lang}
pageTitle={about_page?.page_title}
imageSrc="/header-slider-1.webp"
/>
<section className="lg:mb-24 mb-10 lg:mt-10 mt-4 container ">
<div className="bg-[#F8F9FA] rounded-4xl lg:px-40 lg:py-16 p-2">
{/* <div className="mb-5 flex items-center justify-center">
<div className="rounded-xl overflow-hidden relative w-[140px] h-[140px]">
<Image
src={"/shomalhospital-ipd-logo.jpg"}
alt="shomalhospital ipd logo"
className="object-cover"
fill
/>
</div>
</div> */}
<h3 className="lg:text-[3em] text-3xl 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%] ">
{about_page?.introduction}
</h3>
<div className="mt-16">
<p
className={`${
lang === "en" ? "text-left" : "text-right"
} lg:text-[1.2rem] leading-relaxed text-[#454547]`}
>
{about_page?.introduction_description_headText}
</p>
<br />
<br />
<ul className=" space-y-2 lg:text-[1.2rem] text-[#454547]">
<div
className="introduction_description_subText"
dangerouslySetInnerHTML={{
__html: about_page?.introduction_description_subText,
}}
/>
</ul>
</div>
</div>
{/* <div className="grid grid-cols-12 gap-5 mt-5">
<div className="col-span-5">
<div className="custom-shadow p-10 rounded-lg">
<form action="" className="space-y-4">
<div className="space-y-2 flex flex-col">
<label htmlFor="">نام شما</label>
<input
type="text"
placeholder=""
className="border-[1px] border-neutral-400 rounded-lg py-2 px-4"
/>
</div>
<div className="space-y-2 flex flex-col">
<label htmlFor="">ایمیل شما</label>
<input
type="text"
placeholder=""
className="border-[1px] border-neutral-400 rounded-lg py-2 px-4"
/>
</div>
<div className="space-y-2 flex flex-col">
<label htmlFor="">پیام شما</label>
<textarea
rows={4}
placeholder=""
className="border-[1px] border-neutral-400 rounded-lg py-2 px-4"
></textarea>
</div>
<div className="space-y-2 flex flex-col">
<button className="flex items-center justify-center py-4 rounded-lg text-center text-sm font-semibold bg-blue-primary text-white">
ارسال
</button>
</div>
</form>
</div>
</div>
<div className="col-span-7">
<div className="custom-shadow p-10 rounded-lg"></div>
</div>
</div> */}
</section>
<section className="lg:mb-24 mb-10 lg:mt-10 mt-4 container ">
<div className="rounded-4xl py-16">
<h3
className={`lg:text-[3em] text-3xl 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%] `}
>
{about_page?.department_introduction}
</h3>
<div className="mt-10">
{/* <p className="text-justify text-[1.2rem] leading-8 text-[#454547]">
تیم بیماران بین‌الملل در بیمارستان ما متشکل از گروهی حرفه‌ای از متخصصین مراقبت سلامت، مترجمین پزشکی، و مشاوران سفر درمانی است که به صورت ۲۴ ساعته و چندزبانه در خدمت بیماران خارجی هستند.
</p> */}
<p className="text-center lg:text-[1.2rem] leading-8 text-[#454547]">
{about_page?.department_introduction_subtitle}
</p>
</div>
<div className="grid grid-cols-3 gap-x-10 lg:gap-y-0 gap-y-4 mt-10 lg:h-[600px]">
<div className="lg:col-span-1 col-span-3 rounded-2xl border-[1px] border-neutral-200 overflow-hidden relative">
<div className="lg:h-[410px] h-[300px] relative before:absolute before:bottom-0 before:bg-gradient-to-t before:from-white before:to-transparent before:z-10 before:w-full before:h-full before:top-0 before:right-0">
<Image src="/doctor.png" fill alt="" className="object-fill" />
</div>
<div className=" h-full px-6 py-10 space-y-2 ">
<h3 className="lg:text-2xl text-lg font-black text-black">
{about_page?.dr_jafarian?.name}
</h3>
<div>
<span className="text-secondary lg:text-xl font-medium">
{about_page?.dr_jafarian?.expertise}
</span>
</div>
<div>
<span className="text-black lg:text-base text-sm font-medium">
{about_page?.dr_jafarian?.position}
</span>
</div>
</div>
</div>
<div className="lg:col-span-1 col-span-3 rounded-2xl border-[1px] border-neutral-200 overflow-hidden relative">
<div className="lg:h-[410px] h-[200px] relative before:absolute before:bottom-0 before:bg-gradient-to-t before:from-white before:to-transparent before:z-10 before:w-full before:h-full before:top-0 before:right-0">
<Image
src="/motamedi.jpg"
fill
alt=""
className="object-fill "
/>
</div>
<div className=" h-full px-6 py-10 space-y-2 ">
<h3 className="text-2xl font-black text-black">
{about_page?.dr_motamedi?.name}
</h3>
<div>
<span className="text-secondary text-xl font-medium">
{about_page?.dr_motamedi?.expertise}
</span>
</div>
<div>
<span className="text-black font-medium">
{about_page?.dr_motamedi?.position}
</span>
</div>
</div>
</div>
<div className="lg:col-span-1 col-span-3 rounded-2xl border-[1px] border-neutral-200 overflow-hidden relative">
<div className="lg:h-[410px] h-[200px] relative before:absolute before:bottom-0 before:bg-gradient-to-t before:from-white before:to-transparent before:z-10 before:w-full before:h-full before:top-0 before:right-0">
<Image
src="/heidarnejad.jpg"
fill
alt=""
className="object-cover "
/>
</div>
<div className=" h-full px-6 py-10 space-y-2 ">
<h3 className="text-2xl font-black text-black">
{about_page?.heidarnejad?.name}
</h3>
<div>
<span className="text-secondary text-xl font-medium">
{about_page?.heidarnejad?.expertise}
</span>
</div>
<div>
<span className="text-black font-medium">
{about_page?.heidarnejad?.position}
</span>
</div>
</div>
</div>
</div>
</div>
</section>
<section className="lg:mb-24 mb-10 lg:mt-10 mt-4 container ">
<div className="bg-[#F8F9FA] rounded-4xl lg:px-40 lg:py-16 p-2">
<h3 className="lg:text-[3em] text-3xl 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%] ">
{about_page?.form?.head_text}
</h3>
<p className="text-center lg:text-[1.2rem] leading-8 text-[#454547] mt-10">
{about_page?.form?.sub_text}
</p>
<PatientConsultantForm lang={lang} dict={about_page} />
</div>
</section>
</>
);
}

View File

@@ -0,0 +1,76 @@
import {languages_types} from "@/types";
import PageHeaderSlider from "@/ui/page-header-slider/PageHeaderSlider";
import React from "react";
import {getDictionary} from "../dictionaries";
import { pages_titles } from "@/constants";
import { Metadata } from "next";
export const metadata: Metadata = {
title: pages_titles.patient_rights_charter['fa'] + ' | ' +'بیمارستان شمال',
description: "Shomal Hospital IPD patient rights charter page",
};
export default async function PatientRights({
params,
}: {
params: Promise<{lang: languages_types}>;
}) {
const {lang} = await params;
const {patient_rights_charter} = await getDictionary(lang);
return (
<>
<PageHeaderSlider
lang={lang}
pageTitle={patient_rights_charter?.page_title}
imageSrc="/header-slider-1.webp"
/>
<section className="my-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%] ">
{patient_rights_charter?.page_title}
</h3>
<div className="mt-16">
<h4 className="text-justify text-[1.2rem] leading-relaxed text-secondary font-medium">
{patient_rights_charter?.section_one?.title}
</h4>
<br />
<br />
<div
className="introduction_description_subText "
dangerouslySetInnerHTML={{
__html: patient_rights_charter?.section_one?.content,
}}
/>
<h4 className="text-justify text-[1.2rem] leading-relaxed text-secondary font-medium my-10">
{patient_rights_charter?.section_two?.title}
</h4>
<div
className="introduction_description_subText"
dangerouslySetInnerHTML={{
__html: patient_rights_charter?.section_two?.content,
}}
/>
<h4 className="text-justify text-[1.2rem] leading-relaxed text-secondary font-medium my-10">
{patient_rights_charter?.section_three?.title}
</h4>
<div
className="introduction_description_subText"
dangerouslySetInnerHTML={{
__html: patient_rights_charter?.section_three?.content,
}}
/>
<h4 className="text-justify text-[1.2rem] leading-relaxed text-secondary font-medium my-10">
{patient_rights_charter?.section_four?.title}
</h4>
<div
className="introduction_description_subText"
dangerouslySetInnerHTML={{
__html: patient_rights_charter?.section_four?.content,
}}
/>
</div>
</div>
</section>
</>
);
}

View File

@@ -0,0 +1,271 @@
import PageHeaderSlider from "@/ui/page-header-slider/PageHeaderSlider";
import React from "react";
import {getDictionary} from "../dictionaries";
import {languages_types} from "@/types";
import {Metadata} from "next";
import {pages_titles} from "@/constants";
export const metadata: Metadata = {
title: pages_titles.pricing["fa"] + " | " + "بیمارستان شمال",
description: "Shomal Hospital IPD Pricing page",
};
export default async function PricingPage({
params,
}: {
params: Promise<{lang: languages_types}>;
}) {
const {lang} = await params;
const {pricing_page, medical_packages} = await getDictionary(lang);
return (
<>
<PageHeaderSlider
lang={lang}
pageTitle={pricing_page?.page_title}
imageSrc="/header-slider-1.webp"
/>
<div className="my-16 container">
<div className="bg-[#F8F9FA] rounded-4xl lg:px-20 py-16">
<h3 className="lg:text-[3em] text-2xl 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%] ">
{pricing_page?.page_title}
</h3>
<div className="overflow-x-auto mt-10">
<table className="min-w-full border border-gray-200 divide-y divide-gray-200 text-sm">
<thead className="bg-blue-100">
<tr>
<th className="px-4 py-2 text-center font-semibold">
{pricing_page.table.head[0].name}
</th>
<th className="px-4 py-2 text-center font-semibold">
{pricing_page.table.head[1].name}
</th>
<th className="px-4 py-2 text-center font-semibold">
{pricing_page.table.head[2].name}
</th>
</tr>
</thead>
<tbody className="bg-white divide-y divide-gray-200">
<tr>
<td rowSpan={3} className="px-4 py-2 font-medium text-center">
{medical_packages[0].package_name}
</td>
<td className="px-4 py-2">
{medical_packages[0].services[0].service_name}
</td>
<td className="px-4 py-2 text-center">350 600</td>
</tr>
<tr>
<td className="px-4 py-2 ">
{medical_packages[0].services[1].service_name}
</td>
<td className="px-4 py-2 text-center">450 800</td>
</tr>
<tr>
<td className="px-4 py-2 ">
{medical_packages[0].services[2].service_name}
</td>
<td className="px-4 py-2 text-center">750 1,200</td>
</tr>
<tr>
<td rowSpan={2} className="px-4 py-2 font-medium text-center">
{medical_packages[1].package_name}
</td>
<td className="px-4 py-2">
{medical_packages[1].services[0].service_name}
</td>
<td className="px-4 py-2 text-center">3,800 6,000</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[1].services[1].service_name}
</td>
<td className="px-4 py-2 text-center">4,500 7,000</td>
</tr>
<tr>
<td rowSpan={8} className="px-4 py-2 font-medium text-center">
{medical_packages[2].package_name}
</td>
<td className="px-4 py-2">
{medical_packages[2].services[0].service_name}
</td>
<td className="px-4 py-2 text-center">900 1,300</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[2].services[1].service_name}
</td>
<td className="px-4 py-2 text-center">3,200 4,200</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[2].services[2].service_name}
</td>
<td className="px-4 py-2 text-center">1,500 2,000</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[2].services[3].service_name}
</td>
<td className="px-4 py-2 text-center">3,000 6,000</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[2].services[4].service_name}
</td>
<td className="px-4 py-2 text-center">9,000 12,000</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[2].services[5].service_name}
</td>
<td className="px-4 py-2 text-center">7,000 10,000</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[2].services[6].service_name}
</td>
<td className="px-4 py-2 text-center">550 4,500</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[2].services[7].service_name}
</td>
<td className="px-4 py-2 text-center">5,500-9,000</td>
</tr>
<tr>
<td rowSpan={9} className="px-4 py-2 font-medium text-center">
{medical_packages[3].package_name}
</td>
<td className="px-4 py-2">
{medical_packages[3].services[0].service_name}
</td>
<td className="px-4 py-2 text-center">1,800 2,800</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[3].services[1].service_name}
</td>
<td className="px-4 py-2 text-center">2,500 3,500</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[3].services[2].service_name}
</td>
<td className="px-4 py-2 text-center">1,000 1,600</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[3].services[3].service_name}
</td>
<td className="px-4 py-2 text-center">3,500 5,000</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[3].services[4].service_name}
</td>
<td className="px-4 py-2 text-center">2,800 3,800</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[3].services[5].service_name}
</td>
<td className="px-4 py-2 text-center">2,500 3,200</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[3].services[6].service_name}
</td>
<td className="px-4 py-2 text-center">1,000 1,500</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[3].services[7].service_name}
</td>
<td className="px-4 py-2 text-center">4,500 - 7,000</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[3].services[8].service_name}
</td>
<td className="px-4 py-2 text-center">800 1,200</td>
</tr>
<tr>
<td
rowSpan={2}
className="px-4 py-2 font-medium text-center"
>
{medical_packages[4].package_name}
</td>
<td className="px-4 py-2">
{medical_packages[4].services[0].service_name}
</td>
<td className="px-4 py-2 text-center">6,600 - 11,700</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[4].services[1].service_name}
</td>
<td className="px-4 py-2 text-center">5,100 - 9,000</td>
</tr>
<tr>
<td rowSpan={6} className="px-4 py-2 font-medium text-center">
{medical_packages[5].package_name}
</td>
</tr>
<tr></tr>
<tr>
<td className="px-4 py-2">
{medical_packages[5].services[2].service_name}
</td>
<td className="px-4 py-2 text-center">4,500 - 9,000</td>
</tr>
<tr></tr>
<tr></tr>
<tr>
<td className="px-4 py-2">
{medical_packages[5].services[5].service_name}
</td>
<td className="px-4 py-2 text-center">10,000 - 35,000</td>
</tr>
<tr>
<td rowSpan={4} className="px-4 py-2 font-medium text-center">
{medical_packages[6].package_name}
</td>
<td className="px-4 py-2">
{medical_packages[6].services[0].service_name}
</td>
<td className="px-4 py-2 text-center">1,200 1,800</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[6].services[1].service_name}
</td>
<td className="px-4 py-2 text-center">1,000 1,500</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[6].services[2].service_name}
</td>
<td className="px-4 py-2 text-center">1,000 1,400</td>
</tr>
<tr>
<td className="px-4 py-2">
{medical_packages[6].services[3].service_name}
</td>
<td className="px-4 py-2 text-center">1,500 2,500</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</>
);
}

View File

@@ -0,0 +1,156 @@
import {languages_types} from "@/types";
import PageHeaderSlider from "@/ui/page-header-slider/PageHeaderSlider";
import React from "react";
import {getDictionary} from "../dictionaries";
import Image from "next/image";
import TransferServicesPackages from "@/ui/TransferServicesPackages";
import {toPersianNumber} from "@/utils/functions";
import { Metadata } from "next";
import { pages_titles } from "@/constants";
export const metadata: Metadata = {
title: pages_titles.transfer_services['fa'] + ' | ' +'بیمارستان شمال',
description: "Shomal Hospital IPD transfer services page",
};
export default async function TransferServicePage({
params,
}: {
params: Promise<{lang: languages_types}>;
}) {
const {lang} = await params;
const {transfer_service_page, package_price, phone_number, email,oxin_hotel_location,olympic_hotel_location} =
await getDictionary(lang);
return (
<>
<PageHeaderSlider
pageTitle={transfer_service_page.page_title}
imageSrc="/header-slider-1.webp"
lang={lang}
/>
<section className="lg:mb-24 mb-10 lg:mt-10 mt-4 container ">
<div className="bg-[#F8F9FA] rounded-4xl lg:px-40 lg:py-16 p-2">
<h3 className="mb-10 lg:text-[3em] text-3xl 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%] ">
{transfer_service_page.introduction?.title}
</h3>
<div
className={`${
lang === "en" ? "text-left" : "text-right"
} lg:text-[1.2rem] leading-relaxed text-[#454547]`}
dangerouslySetInnerHTML={{
__html: transfer_service_page.introduction?.head_text,
}}
/>
<div className="grid grid-cols-2 gap-x-10 lg:gap-y-0 gap-y-4 mt-10 lg:h-[600px]">
<div className="lg:col-span-1 col-span-3 rounded-2xl border-[1px] border-neutral-200 overflow-hidden relative">
<div className="lg:h-[410px] h-[300px] relative before:absolute before:bottom-0 before:bg-gradient-to-t before:from-white before:to-transparent before:z-10 before:w-full before:h-full before:top-0 before:right-0">
<Image src="/doctor.png" fill alt="" className="object-fill" />
</div>
<div className=" h-full px-6 py-10 space-y-2 ">
<h3 className="lg:text-2xl text-lg font-black text-black">
{
transfer_service_page.introduction?.mojgan_yaghoubi
?.fullname
}
</h3>
<div>
<span className="text-secondary lg:text-xl font-medium">
{
transfer_service_page.introduction?.mojgan_yaghoubi
?.position
}
</span>
</div>
<div>
<span className="text-black lg:text-base text-sm font-medium">
{phone_number}:{" "}
{lang === "en"
? transfer_service_page.introduction?.mojgan_yaghoubi
?.phone_number
: toPersianNumber(
transfer_service_page.introduction?.mojgan_yaghoubi
?.phone_number
)}
+
</span>
</div>
<div>
<span className="text-black lg:text-base text-sm font-medium">
{email} :{" "}
<a href="mailto:yaqoubi.mozhgan@gmail.com">
yaqoubi.mozhgan@gmail.com
</a>{" "}
</span>
</div>
</div>
</div>
<div className="lg:col-span-1 col-span-3 rounded-2xl border-[1px] border-neutral-200 overflow-hidden relative">
<div className="lg:h-[410px] h-[300px] relative before:absolute before:bottom-0 before:bg-gradient-to-t before:from-white before:to-transparent before:z-10 before:w-full before:h-full before:top-0 before:right-0">
<Image src="/doctor.png" fill alt="" className="object-fill" />
</div>
<div className=" h-full px-6 py-10 space-y-2 ">
<h3 className="lg:text-2xl text-lg font-black text-black">
{
transfer_service_page.introduction?.hassan_mozaffarzadeh
?.fullname
}
</h3>
<div>
<span className="text-secondary lg:text-xl font-medium">
{
transfer_service_page.introduction?.hassan_mozaffarzadeh
?.position
}
</span>
</div>
<div>
<span className="text-black lg:text-base text-sm font-medium">
{phone_number}:{" "}
{lang === "en"
? transfer_service_page.introduction?.hassan_mozaffarzadeh
?.phone_number
: toPersianNumber(
transfer_service_page.introduction
?.hassan_mozaffarzadeh?.phone_number
)}
+
</span>
</div>
<div>
<span className="text-black lg:text-base text-sm font-medium">
{email} : <a href="#"></a>{" "}
</span>
</div>
</div>
</div>
</div>
</div>
</section>
<section className="lg:mb-24 mb-10 lg:mt-10 mt-4 container ">
<div className=" rounded-4xl lg:px-40 lg:py-16 p-2">
<h3
className={`lg:text-[3em] text-3xl 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%] `}
>
{transfer_service_page.page_title}
</h3>
<div
className="mt-20 introduction_description_subText"
dangerouslySetInnerHTML={{__html: transfer_service_page.jobs}}
/>
</div>
</section>
<section className="lg:mb-24 mb-10 lg:mt-10 mt-4 container ">
<div className="bg-[#F8F9FA] rounded-4xl lg:px-40 lg:py-16 p-2">
<h3 className="mb-10 lg:text-[3em] text-3xl 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%] ">
{transfer_service_page.introduction.our_serives_ipd}
</h3>
<>
<div className="mt-20 introduction_description_subText" dangerouslySetInnerHTML={{__html:transfer_service_page.services}}/>
</>
<h3 className="my-10 lg:text-[3em] text-3xl 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%] ">
{transfer_service_page.introduction.packages_list}
</h3>
<TransferServicesPackages oxin_hotel_location={oxin_hotel_location} olympic_hotel_location={olympic_hotel_location} transfer_service_page={transfer_service_page} package_price={package_price} />
</div>
</section>
</>
);
}

View File

@@ -0,0 +1,30 @@
import UploadDocuments from "@/ui/forms/UploadDocuments";
import React from "react";
import {getDictionary} from "../dictionaries";
import {languages_types} from "@/types";
import { Metadata } from "next";
import { pages_titles } from "@/constants";
export const metadata: Metadata = {
title: pages_titles.upload_documents['fa'] + ' | ' +'بیمارستان شمال',
description: "Shomal Hospital IPD upload documents page",
};
export default async function UploadDocumentsPage({
params,
}: {
params: Promise<{lang: languages_types}>;
}) {
const {lang} = await params;
const {upload_documents} = await getDictionary(lang);
return (
<>
<section className="my-20 container">
<div className="bg-[#F8F9FA] rounded-4xl lg:px-40 lg:py-16 p-2">
<h3 className="mb-10 lg:text-[3em] text-3xl 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%] ">
{upload_documents.head_text}
</h3>
<UploadDocuments lang={lang} dict={upload_documents} />
</div>
</section>
</>
);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

BIN
src/app/favicon-16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 B

BIN
src/app/favicon-32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
src/app/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

131
src/app/globals.css Normal file
View File

@@ -0,0 +1,131 @@
@import "tailwindcss";
@theme {
--color-blue-primary: rgba(4, 61, 130, 1);
--color-secondary: rgba(0, 193, 211, 1);
--color-orange-primary: rgba(248, 138, 40, 1);
--color-blue-secondary: rgba(95, 164, 248, 1);
--color-title-primary: rgba(43, 43, 43, 1);
--color-text-body: rgba(99, 99, 99, 1);
--color-text-subtext: rgba(109, 109, 109, 1);
--color-subtitle-primary: rgba(128, 128, 128, 1);
--color-subtitle-secondary: rgba(116, 128, 145, 1);
--color-desc: rgba(89, 89, 89, 1);
}
:root {
--background: #ffffff;
--foreground: #171717;
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--font-sans: var(--font-geist-sans);
--font-mono: var(--font-geist-mono);
}
/*
@media (prefers-color-scheme: dark) {
:root {
--background: #0a0a0a;
--foreground: #ededed;
}
} */
body {
/* background: var(--background); */
/* color: var(--foreground); */
font-family: VazirMatn, Arial, Helvetica, sans-serif;
scroll-behavior: smooth;
}
@utility container {
margin-inline: auto;
padding-inline: 1rem;
@media (min-width: 768px) {
padding-inline: 2rem;
}
@media (min-width: 1024px) {
padding-inline: 4rem;
}
}
/* swiper customization */
.swiper-pagination-bullets {
background-color: rgba(255, 255, 255, 0.8);
width: fit-content !important;
margin: 0 auto !important;
border-radius: 10px;
padding: 4px;
position: absolute;
display: flex;
border: 1px solid rgba(255, 255, 255, 0.9);
backdrop-filter: blur(24px);
-webkit-backdrop-filter: blur(24px);
left: 50% !important; /* Move to the center along X-axis */
transform: translate(-50%, -50%) !important;
/* box-shadow: 1px 1px 1px 1px rgba(255, 255, 255, 0.7) !important; */
}
.swiper-button-next,
.swiper-button-prev {
background-color: rgba(255, 255, 255, 0.8) !important;
border-radius: 50% !important;
border: 1px solid rgba(255, 255, 255, 0.9) !important;
backdrop-filter: blur(24px) !important;
-webkit-backdrop-filter: blur(24px) !important;
/* box-shadow: 1px 1px 1px 1px rgba(255, 255, 255, 0.8) !important; */
}
.swiper-button-next .swiper-navigation-icon,
.swiper-button-prev .swiper-navigation-icon {
width: 25px !important;
height: 25px !important;
color: var(--color-blue-primary) !important;
}
.swiper-pagination-bullets .swiper-pagination-bullet {
background-color: black !important;
width: 10px;
height: 10px;
transition: all !important;
transition-duration: 4s;
}
.swiper-pagination-bullets .swiper-pagination-bullet-active {
background-color: var(--color-blue-primary) !important;
width: 30px !important;
border-radius: 12px !important;
height: 10px !important;
}
.custom-shadow {
box-shadow: 0px 0px 30px 0px rgba(0, 0, 0, 0.1);
}
/* header-slider */
.gradient-slider {
}
.introduction_description_subText ul {
@apply list-disc list-inside marker:text-secondary marker:text-2xl text-[1.2rem] space-y-2 text-[#454547];
}
.packages_subpackages_list ul {
@apply list-disc list-inside marker:text-secondary marker:text-2xl text-[1rem] space-y-1 text-[#454547];
}
.react-select-container .rs__control {
@apply bg-transparent py-4 px-6 rounded-2xl border border-neutral-200 w-full focus:outline-secondary focus:outline-1;
}
table {
border: 1px solid #ccc;
margin: 8px 0;
}
table th,
tr,
td {
border: 1px solid #ccc;
padding: 8px;
}
p {
@apply leading-relaxed my-4;
}

27
src/app/manifest.ts Normal file
View File

@@ -0,0 +1,27 @@
// import {EN_SITENAME, FA_SITENAME} from "@/constants/global/global.const";
import type {MetadataRoute} from "next";
export default function manifest(): MetadataRoute.Manifest {
return {
name: "بیماران بین الملل بیمارستان شمال آمل",
short_name: "بیماران بین الملل بیمارستان شمال",
description: `A Progressive Web App for shomal hospital international patient department`,
start_url: "/",
display: "standalone",
background_color: "#ffffff",
theme_color: "#043d82",
icons: [
{
src: "/android-chrome-192x192.png",
sizes: "192x192",
type: "image/png",
},
{
src: "/android-chrome-512x512.png",
sizes: "512x512",
type: "image/png",
},
],
};
}

3
src/app/robots.txt Normal file
View File

@@ -0,0 +1,3 @@
User-agent: *
Disallow: /

48
src/config/font.config.ts Normal file
View File

@@ -0,0 +1,48 @@
import localFont from "next/font/local";
export const FontVazir = localFont({
src: [
{
path: "../../public/fonts/vazir/Vazirmatn-Thin.woff2",
weight: "100",
style: "normal",
},
{
path: "../../public/fonts/vazir/Vazirmatn-ExtraLight.woff2",
weight: "200",
style: "normal",
},
{
path: "../../public/fonts/vazir/Vazirmatn-Light.woff2",
weight: "300",
style: "normal",
},
{
path: "../../public/fonts/vazir/Vazirmatn-Regular.woff2",
weight: "400",
style: "normal",
},
{
path: "../../public/fonts/vazir/Vazirmatn-Medium.woff2",
weight: "500",
style: "normal",
},
{
path: "../../public/fonts/vazir/Vazirmatn-SemiBold.woff2",
weight: "600",
style: "normal",
},
{
path: "../../public/fonts/vazir/Vazirmatn-Bold.woff2",
weight: "700",
style: "normal",
},
{
path: "../../public/fonts/vazir/Vazirmatn-ExtraBold.woff2",
weight: "800",
style: "normal",
},
],
variable: "--font-vazir", // اگر خواستی متغیر CSS بسازی برای Tailwind یا CSS مدول
display: "swap", // بهترین گزینه برای نمایش فونت
});

741
src/constants/index.ts Normal file
View File

@@ -0,0 +1,741 @@
import {contact_us_form_types} from "@/types";
export const site_languages = [
{
label: "English",
value: "en",
},
{
label: "فارسی",
value: "fa",
},
{
label: "Arabic",
value: "ar",
},
];
// src/constants/services.ts
export const SERVICES = [
{id: "stone", label: "سنگ‌شکن برون‌اندامی"},
{id: "endoscopy", label: "آندوسکوپی فوقانی"},
{id: "colonoscopy", label: "کولونوسکوپی کامل"},
{id: "endo-colono", label: "آندوسکوپی و کولونوسکوپی هم‌زمان"},
{id: "dialysis1", label: "دیالیز ویژه بیماران بین‌الملل (یک‌جلسه‌ای)"},
{id: "dialysis3", label: "دیالیز ویژه بیماران بین‌الملل کوتاه‌مدت (3 جلسه)"},
{id: "dialysis6", label: "دیالیز ویژه بیماران بین‌الملل هفتگی (6 جلسه)"},
{id: "dialysis12", label: "دیالیز ویژه بیماران بین‌الملل ماهانه (12 جلسه)"},
{id: "uterus", label: "جراحی سرطان رحم یا دهانه رحم"},
{id: "ovary", label: "جراحی سرطان تخمدان"},
{id: "women-screen", label: "غربالگری جامع زنان"},
{id: "breast-screen", label: "غربالگری بیماری‌های پستان"},
{id: "angiography", label: "آنژیوگرافی قلب"},
{id: "stent", label: "آنژیوپلاستی + استنت‌گذاری (فنر قلب)"},
{id: "ep-study", label: "تست الکتروفیزیولوژی قلب"},
{id: "ablation", label: "ابلیشن قلبی"},
{id: "crt", label: "نصب دستگاه‌های قلبی (CRT)"},
{id: "icd", label: "نصب دستگاه‌های قلبی (ICD)"},
{id: "pacemaker", label: "نصب دستگاه‌های قلبی (Pacemaker)"},
{id: "rhinoplasty", label: "رینوپلاستی (جراحی بینی)"},
{id: "lipo", label: "لیپوساکشن / لیپوماتیک (شکم، پهلو، ران)"},
{id: "abdominoplasty", label: "ابدومینوپلاستی (جراحی زیبایی شکم)"},
{id: "blepharoplasty", label: "بلفاروپلاستی (جراحی پلک بالا و پایین)"},
{id: "facelift", label: "لیفت صورت و گردن"},
{id: "breast-pro", label: "پروتز سینه / لیفت سینه (با پروتز)"},
{id: "breast-no-pro", label: "پروتز سینه / لیفت سینه (بدون پروتز)"},
{id: "hair", label: "کاشت مو"},
{id: "fat", label: "تزریق چربی به صورت یا بدن"},
{id: "septoplasty", label: "سپتوپلاستی (اصلاح انحراف تیغه بینی)"},
{id: "tonsil", label: "آدنوئیدکتومی و/یا لوزه‌برداری"},
{id: "polyp", label: "پولیپ بینی یا سینوس (پولیپکتومی)"},
{id: "path-bio", label: "پاتولوژی (نمونه‌های بافتی)"},
{id: "path-cyto1", label: "پاتولوژی (سیتولوژی - پاپ‌اسمیر ساده)"},
{id: "path-cyto2", label: "پاتولوژی (سیتولوژی - پاپ‌اسمیر + مایع پایه)"},
{id: "path-fna", label: "پاتولوژی (سیتولوژی - گزارش FNA+)"},
{id: "path-ihc1", label: "پاتولوژی (ایمونوهیستوشیمی - هر مارکر)"},
{
id: "path-ihc2",
label: "پاتولوژی (ایمونوهیستوشیمی - پکیج کامل سرطان پستان)",
},
{id: "path-slide", label: "پاتولوژی (بازخوانی اسلاید)"},
{id: "path-block", label: "پاتولوژی (تهیه بلوک و اسلاید اضافی)"},
];
// src/constants/packageServices.ts
export const PACKAGE_SERVICES = [
{
id: 1,
slug: "digestive-package",
title: "پکیج گوارش",
content: [
"آندوسکوپی فوقانی",
"کولونوسکوپی کامل",
"آندوسکوپی و کولونوسکوپی هم‌زمان",
],
},
{
id: 2,
slug: "hysterectomy",
title: "پکیج هیسترتومی",
content: ["جراحی سرطان رحم یا دهانه رحم", "جراحی سرطان تخمدان"],
},
{
id: 3,
slug: "cardiac",
title: "پکیج قلب",
content: [
"آنژیوگرافی قلب",
"آنژیوپلاستی + استنت‌گذاری (فنر قلب)",
"تست الکتروفیزیولوژی قلب",
"ابلیشن قلبی",
"نصب دستگاه‌های قلبی (CRT)",
"نصب دستگاه‌های قلبی (ICD)",
"نصب دستگاه‌های قلبی (Pacemaker)",
"CABG",
],
},
{
id: 4,
slug: "beauty",
title: "پکیج زیبایی",
content: [
"لیپوساکشن / لیپوماتیک (شکم، پهلو، ران)",
"ابدومینوپلاستی (جراحی زیبایی شکم)",
"بلفاروپلاستی (جراحی پلک بالا و پایین)",
"لیفت صورت و گردن",
"پروتز سینه / لیفت سینه (با پروتز)",
"پروتز سینه / لیفت سینه (بدون پروتز)",
"کاشت مو",
"اسلیو",
"تزریق چربی به صورت یا بدن",
],
},
{
id: 5,
slug: "orthopedic",
title: "پکیج ارتوپدی",
content: ["تعویض مفصل ران", "تعویض مفصل زانو"],
},
{
id: 6,
slug: "brain-surgery",
title: "پکیج جراحی مغز",
content: [
"جراحی ستون فقرات (فیوژن)",
"جراحی ستون فقرات (لامینکتومی)",
"جراحی ستون فقرات (دیستکتومی)",
"کرانيوتومی",
"جراحی قاعده جمجمه",
"جراحی تومورهای مغزی",
],
},
{
id: 7,
slug: "ent",
title: "پکیج گوش و حلق و بینی",
content: [
"سپتوپلاستی (اصلاح انحراف تیغه بینی)",
"آدنوئیدکتومی و/یا لوزه‌برداری",
"پلیپ بینی یا سینوس (پولیپکتومی)",
"رینوپلاستی (جراحی بینی)",
],
},
];
export const MEDICAL_PACKAGES = PACKAGE_SERVICES.map((item) => ({
id: item.id,
slug: item.slug,
title: item.title,
}));
export const PHONE_NUMBERS = Object.freeze({
ipd_technician: {
label: "09385745269",
href: "+989385745269",
},
hospital: {
label: "011-4492",
href: "+09811-4492",
},
});
export const Page_header_slider = Object.freeze({
hospital_name: {
fa: "بیمارستان فوق تخصصی شمال آمل",
en: "Shomal Super Specialty Hospital, Amol",
ar: "مستشفى شمال التخصصي الفائق آمل",
},
n1_authority_validation: {
fa: "کسب رتبه یک اعتباربخشی",
en: "Achieved Grade A National Accreditation",
ar: "الحصول على التصنيف الأول في الاعتماد الوطني",
},
});
export const contact_us_form: contact_us_form_types = Object.freeze({
fields: {
first_name: {
type: "text",
as: "input",
},
last_name: {
type: "text",
as: "input",
},
phone_number: {
type: "text",
as: "input",
},
email: {
type: "text",
as: "input",
},
age: {
type: "number",
as: "input",
},
sex: {
type: "select",
as: "select",
},
country: {
type: "select",
as: "select",
},
message: {
type: "text",
as: "textarea",
},
},
});
export const Expertises = [
{
id: 1,
name: {
fa: "ارتوپدی",
en: "Orthopedics",
ar: "جراحة العظام",
},
},
{
id: 2,
name: {
fa: "جراحی عمومی",
en: "General Surgery",
ar: "الجراحة العامة",
},
},
{
id: 3,
name: {
fa: "قلب و عروق",
en: "Cardiology",
ar: "أمراض القلب",
},
},
{
id: 4,
name: {
fa: "زنان و زایمان",
en: "Obstetrics and Gynecology",
ar: "أمراض النساء والتوليد",
},
},
{
id: 5,
name: {
fa: "مغز و اعصاب",
en: "Neurosurgery / Neurology",
ar: "جراحة الأعصاب / طب الأعصاب",
},
},
{
id: 6,
name: {
fa: "گوارش",
en: "Gastroenterology",
ar: "أمراض الجهاز الهضمي",
},
},
{
id: 7,
name: {
fa: "کلیه و مجاری ادراری",
en: "Urology",
ar: "أمراض الكلى والجهاز البولي",
},
},
{
id: 8,
name: {
fa: "گوش و حلق و بینی",
en: "ENT (Ear, Nose, and Throat)",
ar: "أمراض الأنف والأذن والحنجرة",
},
},
];
export const all_countries = [
{label: "Afghanistan", value: "afghanistan", code: "+93"},
{label: "Albania", value: "albania", code: "+355"},
{label: "Algeria", value: "algeria", code: "+213"},
{label: "American Samoa", value: "american-samoa", code: "+1-684"},
{label: "Andorra", value: "andorra", code: "+376"},
{label: "Angola", value: "angola", code: "+244"},
{label: "Anguilla", value: "anguilla", code: "+1-264"},
{label: "Antigua and Barbuda", value: "antigua-and-barbuda", code: "+1-268"},
{label: "Argentina", value: "argentina", code: "+54"},
{label: "Armenia", value: "armenia", code: "+374"},
{label: "Aruba", value: "aruba", code: "+297"},
{label: "Australia", value: "australia", code: "+61"},
{label: "Austria", value: "austria", code: "+43"},
{label: "Azerbaijan", value: "azerbaijan", code: "+994"},
{label: "Bahamas", value: "bahamas", code: "+1-242"},
{label: "Bahrain", value: "bahrain", code: "+973"},
{label: "Bangladesh", value: "bangladesh", code: "+880"},
{label: "Barbados", value: "barbados", code: "+1-246"},
{label: "Belarus", value: "belarus", code: "+375"},
{label: "Belgium", value: "belgium", code: "+32"},
{label: "Belize", value: "belize", code: "+501"},
{label: "Benin", value: "benin", code: "+229"},
{label: "Bhutan", value: "bhutan", code: "+975"},
{label: "Bolivia", value: "bolivia", code: "+591"},
{
label: "Bosnia and Herzegovina",
value: "bosnia-and-herzegovina",
code: "+387",
},
{label: "Botswana", value: "botswana", code: "+267"},
{label: "Brazil", value: "brazil", code: "+55"},
{label: "Brunei", value: "brunei", code: "+673"},
{label: "Bulgaria", value: "bulgaria", code: "+359"},
{label: "Burkina Faso", value: "burkina-faso", code: "+226"},
{label: "Burundi", value: "burundi", code: "+257"},
{label: "Cabo Verde", value: "cabo-verde", code: "+238"},
{label: "Cambodia", value: "cambodia", code: "+855"},
{label: "Cameroon", value: "cameroon", code: "+237"},
{label: "Canada", value: "canada", code: "+1"},
{
label: "Central African Republic",
value: "central-african-republic",
code: "+236",
},
{label: "Chad", value: "chad", code: "+235"},
{label: "Chile", value: "chile", code: "+56"},
{label: "China", value: "china", code: "+86"},
{label: "Colombia", value: "colombia", code: "+57"},
{label: "Comoros", value: "comoros", code: "+269"},
{label: "Congo", value: "congo", code: "+242"},
{
label: "Congo, Democratic Republic of the",
value: "congo-democratic-republic",
code: "+243",
},
{label: "Costa Rica", value: "costa-rica", code: "+506"},
{label: "Croatia", value: "croatia", code: "+385"},
{label: "Cuba", value: "cuba", code: "+53"},
{label: "Cyprus", value: "cyprus", code: "+357"},
{label: "Czech Republic", value: "czech-republic", code: "+420"},
{label: "Denmark", value: "denmark", code: "+45"},
{label: "Djibouti", value: "djibouti", code: "+253"},
{label: "Dominica", value: "dominica", code: "+1-767"},
{label: "Dominican Republic", value: "dominican-republic", code: "+1-809"},
{label: "Ecuador", value: "ecuador", code: "+593"},
{label: "Egypt", value: "egypt", code: "+20"},
{label: "El Salvador", value: "el-salvador", code: "+503"},
{label: "Equatorial Guinea", value: "equatorial-guinea", code: "+240"},
{label: "Eritrea", value: "eritrea", code: "+291"},
{label: "Estonia", value: "estonia", code: "+372"},
{label: "Eswatini", value: "eswatini", code: "+268"},
{label: "Ethiopia", value: "ethiopia", code: "+251"},
{label: "Fiji", value: "fiji", code: "+679"},
{label: "Finland", value: "finland", code: "+358"},
{label: "France", value: "france", code: "+33"},
{label: "Gabon", value: "gabon", code: "+241"},
{label: "Gambia", value: "gambia", code: "+220"},
{label: "Georgia", value: "georgia", code: "+995"},
{label: "Germany", value: "germany", code: "+49"},
{label: "Ghana", value: "ghana", code: "+233"},
{label: "Greece", value: "greece", code: "+30"},
{label: "Grenada", value: "grenada", code: "+1-473"},
{label: "Guatemala", value: "guatemala", code: "+502"},
{label: "Guinea", value: "guinea", code: "+224"},
{label: "Guinea-Bissau", value: "guinea-bissau", code: "+245"},
{label: "Guyana", value: "guyana", code: "+592"},
{label: "Haiti", value: "haiti", code: "+509"},
{label: "Honduras", value: "honduras", code: "+504"},
{label: "Hungary", value: "hungary", code: "+36"},
{label: "Iceland", value: "iceland", code: "+354"},
{label: "India", value: "india", code: "+91"},
{label: "Indonesia", value: "indonesia", code: "+62"},
{label: "Iran", value: "iran", code: "+98"},
{label: "Iraq", value: "iraq", code: "+964"},
{label: "Ireland", value: "ireland", code: "+353"},
{label: "Israel", value: "israel", code: "+972"},
{label: "Italy", value: "italy", code: "+39"},
{label: "Jamaica", value: "jamaica", code: "+1-876"},
{label: "Japan", value: "japan", code: "+81"},
{label: "Jordan", value: "jordan", code: "+962"},
{label: "Kazakhstan", value: "kazakhstan", code: "+7"},
{label: "Kenya", value: "kenya", code: "+254"},
{label: "Kiribati", value: "kiribati", code: "+686"},
{label: "Kuwait", value: "kuwait", code: "+965"},
{label: "Kyrgyzstan", value: "kyrgyzstan", code: "+996"},
{label: "Laos", value: "laos", code: "+856"},
{label: "Latvia", value: "latvia", code: "+371"},
{label: "Lebanon", value: "lebanon", code: "+961"},
{label: "Lesotho", value: "lesotho", code: "+266"},
{label: "Liberia", value: "liberia", code: "+231"},
{label: "Libya", value: "libya", code: "+218"},
{label: "Liechtenstein", value: "liechtenstein", code: "+423"},
{label: "Lithuania", value: "lithuania", code: "+370"},
{label: "Luxembourg", value: "luxembourg", code: "+352"},
{label: "Macau", value: "macau", code: "+853"},
{label: "North Macedonia", value: "north-macedonia", code: "+389"},
{label: "Madagascar", value: "madagascar", code: "+261"},
{label: "Malawi", value: "malawi", code: "+265"},
{label: "Malaysia", value: "malaysia", code: "+60"},
{label: "Maldives", value: "maldives", code: "+960"},
{label: "Mali", value: "mali", code: "+223"},
{label: "Malta", value: "malta", code: "+356"},
{label: "Marshall Islands", value: "marshall-islands", code: "+692"},
{label: "Mauritania", value: "mauritania", code: "+222"},
{label: "Mauritius", value: "mauritius", code: "+230"},
{label: "Mexico", value: "mexico", code: "+52"},
{label: "Micronesia", value: "micronesia", code: "+691"},
{label: "Moldova", value: "moldova", code: "+373"},
{label: "Monaco", value: "monaco", code: "+377"},
{label: "Mongolia", value: "mongolia", code: "+976"},
{label: "Montenegro", value: "montenegro", code: "+382"},
{label: "Morocco", value: "morocco", code: "+212"},
{label: "Mozambique", value: "mozambique", code: "+258"},
{label: "Myanmar", value: "myanmar", code: "+95"},
{label: "Namibia", value: "namibia", code: "+264"},
{label: "Nauru", value: "nauru", code: "+674"},
{label: "Nepal", value: "nepal", code: "+977"},
{label: "Netherlands", value: "netherlands", code: "+31"},
{label: "NewZealand", value: "new-zealand", code: "+64"},
{label: "Nicaragua", value: "nicaragua", code: "+505"},
{label: "Niger", value: "niger", code: "+227"},
{label: "Nigeria", value: "nigeria", code: "+234"},
{label: "Norway", value: "norway", code: "+47"},
{label: "Oman", value: "oman", code: "+968"},
{label: "Pakistan", value: "pakistan", code: "+92"},
{label: "Palau", value: "palau", code: "+680"},
{label: "Palestine", value: "palestine", code: "+970"},
{label: "Panama", value: "panama", code: "+507"},
{label: "Papua New Guinea", value: "papua-new-guinea", code: "+675"},
{label: "Paraguay", value: "paraguay", code: "+595"},
{label: "Peru", value: "peru", code: "+51"},
{label: "Philippines", value: "philippines", code: "+63"},
{label: "Poland", value: "poland", code: "+48"},
{label: "Portugal", value: "portugal", code: "+351"},
{label: "Qatar", value: "qatar", code: "+974"},
{label: "Romania", value: "romania", code: "+40"},
{label: "Russia", value: "russia", code: "+7"},
{label: "Rwanda", value: "rwanda", code: "+250"},
{label: "Samoa", value: "samoa", code: "+685"},
{label: "San Marino", value: "san-marino", code: "+378"},
{label: "Saudi Arabia", value: "saudi-arabia", code: "+966"},
{label: "Senegal", value: "senegal", code: "+221"},
{label: "Serbia", value: "serbia", code: "+381"},
{label: "Seychelles", value: "seychelles", code: "+248"},
{label: "Sierra Leone", value: "sierra-leone", code: "+232"},
{label: "Singapore", value: "singapore", code: "+65"},
{label: "Slovakia", value: "slovakia", code: "+421"},
{label: "Slovenia", value: "slovenia", code: "+386"},
{label: "Solomon Islands", value: "solomon-islands", code: "+677"},
{label: "Somalia", value: "somalia", code: "+252"},
{label: "South Africa", value: "south-africa", code: "+27"},
{label: "South Sudan", value: "south-sudan", code: "+211"},
{label: "Spain", value: "spain", code: "+34"},
{label: "Sri Lanka", value: "sri-lanka", code: "+94"},
{label: "Sudan", value: "sudan", code: "+249"},
{label: "Suriname", value: "suriname", code: "+597"},
{label: "Sweden", value: "sweden", code: "+46"},
{label: "Switzerland", value: "switzerland", code: "+41"},
{label: "Syria", value: "syria", code: "+963"},
{label: "Taiwan", value: "taiwan", code: "+886"},
{label: "Tajikistan", value: "tajikistan", code: "+992"},
{label: "Tanzania", value: "tanzania", code: "+255"},
{label: "Thailand", value: "thailand", code: "+66"},
{label: "TimorLeste", value: "timor-leste", code: "+670"},
{label: "Togo", value: "togo", code: "+228"},
{label: "Tonga", value: "tonga", code: "+676"},
{label: "Trinidad and Tobago", value: "trinidad-and-tobago", code: "+1-868"},
{label: "Tunisia", value: "tunisia", code: "+216"},
{label: "Turkey", value: "turkey", code: "+90"},
{label: "Turkmenistan", value: "turkmenistan", code: "+993"},
{label: "Tuvalu", value: "tuvalu", code: "+688"},
{label: "Uganda", value: "uganda", code: "+256"},
{label: "Ukraine", value: "ukraine", code: "+380"},
{label: "United Arab Emirates", value: "united-arab-emirates", code: "+971"},
{label: "United Kingdom", value: "united-kingdom", code: "+44"},
{label: "United States", value: "united-states", code: "+1"},
{label: "Uruguay", value: "uruguay", code: "+598"},
{label: "Uzbekistan", value: "uzbekistan", code: "+998"},
{label: "Vanuatu", value: "vanuatu", code: "+678"},
{
label: "Vatican City",
value: "vatican-city",
code: "+379" /* برخی منابع مختلف است */,
},
{label: "Venezuela", value: "venezuela", code: "+58"},
{label: "Vietnam", value: "vietnam", code: "+84"},
{label: "Yemen", value: "yemen", code: "+967"},
{label: "Zambia", value: "zambia", code: "+260"},
{label: "Zimbabwe", value: "zimbabwe", code: "+263"},
];
export const all_countries_code = [
{code: "+93", label: "Afghanistan"},
{code: "+355", label: "Albania"},
{code: "+213", label: "Algeria"},
{code: "+1-684", label: "American Samoa"},
{code: "+376", label: "Andorra"},
{code: "+244", label: "Angola"},
{code: "+1-264", label: "Anguilla"},
{code: "+1-268", label: "Antigua and Barbuda"},
{code: "+54", label: "Argentina"},
{code: "+374", label: "Armenia"},
{code: "+297", label: "Aruba"},
{code: "+61", label: "Australia"},
{code: "+43", label: "Austria"},
{code: "+994", label: "Azerbaijan"},
{code: "+1-242", label: "Bahamas"},
{code: "+973", label: "Bahrain"},
{code: "+880", label: "Bangladesh"},
{code: "+1-246", label: "Barbados"},
{code: "+375", label: "Belarus"},
{code: "+32", label: "Belgium"},
{code: "+501", label: "Belize"},
{code: "+229", label: "Benin"},
{code: "+975", label: "Bhutan"},
{code: "+591", label: "Bolivia"},
{code: "+387", label: "Bosnia and Herzegovina"},
{code: "+267", label: "Botswana"},
{code: "+55", label: "Brazil"},
{code: "+673", label: "Brunei"},
{code: "+359", label: "Bulgaria"},
{code: "+226", label: "Burkina Faso"},
{code: "+257", label: "Burundi"},
{code: "+238", label: "Cabo Verde"},
{code: "+855", label: "Cambodia"},
{code: "+237", label: "Cameroon"},
{code: "+1", label: "Canada"},
{code: "+236", label: "Central African Republic"},
{code: "+235", label: "Chad"},
{code: "+56", label: "Chile"},
{code: "+86", label: "China"},
{code: "+57", label: "Colombia"},
{code: "+269", label: "Comoros"},
{code: "+242", label: "Congo"},
{code: "+243", label: "Congo, Democratic Republic of the"},
{code: "+506", label: "Costa Rica"},
{code: "+385", label: "Croatia"},
{code: "+53", label: "Cuba"},
{code: "+357", label: "Cyprus"},
{code: "+420", label: "Czech Republic"},
{code: "+45", label: "Denmark"},
{code: "+253", label: "Djibouti"},
{code: "+1-767", label: "Dominica"},
{code: "+1-809", label: "Dominican Republic"},
{code: "+593", label: "Ecuador"},
{code: "+20", label: "Egypt"},
{code: "+503", label: "El Salvador"},
{code: "+240", label: "Equatorial Guinea"},
{code: "+291", label: "Eritrea"},
{code: "+372", label: "Estonia"},
{code: "+268", label: "Eswatini"},
{code: "+251", label: "Ethiopia"},
{code: "+679", label: "Fiji"},
{code: "+358", label: "Finland"},
{code: "+33", label: "France"},
{code: "+241", label: "Gabon"},
{code: "+220", label: "Gambia"},
{code: "+995", label: "Georgia"},
{code: "+49", label: "Germany"},
{code: "+233", label: "Ghana"},
{code: "+30", label: "Greece"},
{code: "+1-473", label: "Grenada"},
{code: "+502", label: "Guatemala"},
{code: "+224", label: "Guinea"},
{code: "+245", label: "Guinea-Bissau"},
{code: "+592", label: "Guyana"},
{code: "+509", label: "Haiti"},
{code: "+504", label: "Honduras"},
{code: "+36", label: "Hungary"},
{code: "+354", label: "Iceland"},
{code: "+91", label: "India"},
{code: "+62", label: "Indonesia"},
{code: "+98", label: "Iran"},
{code: "+964", label: "Iraq"},
{code: "+353", label: "Ireland"},
{code: "+972", label: "Israel"},
{code: "+39", label: "Italy"},
{code: "+1-876", label: "Jamaica"},
{code: "+81", label: "Japan"},
{code: "+962", label: "Jordan"},
{code: "+7", label: "Kazakhstan"},
{code: "+254", label: "Kenya"},
{code: "+686", label: "Kiribati"},
{code: "+965", label: "Kuwait"},
{code: "+996", label: "Kyrgyzstan"},
{code: "+856", label: "Laos"},
{code: "+371", label: "Latvia"},
{code: "+961", label: "Lebanon"},
{code: "+266", label: "Lesotho"},
{code: "+231", label: "Liberia"},
{code: "+218", label: "Libya"},
{code: "+423", label: "Liechtenstein"},
{code: "+370", label: "Lithuania"},
{code: "+352", label: "Luxembourg"},
{code: "+853", label: "Macau"},
{code: "+389", label: "North Macedonia"},
{code: "+261", label: "Madagascar"},
{code: "+265", label: "Malawi"},
{code: "+60", label: "Malaysia"},
{code: "+960", label: "Maldives"},
{code: "+223", label: "Mali"},
{code: "+356", label: "Malta"},
{code: "+692", label: "Marshall Islands"},
{code: "+222", label: "Mauritania"},
{code: "+230", label: "Mauritius"},
{code: "+52", label: "Mexico"},
{code: "+691", label: "Micronesia"},
{code: "+373", label: "Moldova"},
{code: "+377", label: "Monaco"},
{code: "+976", label: "Mongolia"},
{code: "+382", label: "Montenegro"},
{code: "+212", label: "Morocco"},
{code: "+258", label: "Mozambique"},
{code: "+95", label: "Myanmar"},
{code: "+264", label: "Namibia"},
{code: "+674", label: "Nauru"},
{code: "+977", label: "Nepal"},
{code: "+31", label: "Netherlands"},
{code: "+64", label: "NewZealand"},
{code: "+505", label: "Nicaragua"},
{code: "+227", label: "Niger"},
{code: "+234", label: "Nigeria"},
{code: "+47", label: "Norway"},
{code: "+968", label: "Oman"},
{code: "+92", label: "Pakistan"},
{code: "+680", label: "Palau"},
{code: "+970", label: "Palestine"},
{code: "+507", label: "Panama"},
{code: "+675", label: "Papua New Guinea"},
{code: "+595", label: "Paraguay"},
{code: "+51", label: "Peru"},
{code: "+63", label: "Philippines"},
{code: "+48", label: "Poland"},
{code: "+351", label: "Portugal"},
{code: "+1-787", label: "Puerto Rico"},
{code: "+974", label: "Qatar"},
{code: "+40", label: "Romania"},
{code: "+7", label: "Russia"},
{code: "+250", label: "Rwanda"},
{code: "+590", label: "Saint Barthélemy"},
{code: "+1-869", label: "Saint Kitts and Nevis"},
{code: "+1-758", label: "Saint Lucia"},
{code: "+508", label: "Saint Pierre and Miquelon"},
{code: "+1-784", label: "Saint Vincent and the Grenadines"},
{code: "+685", label: "Samoa"},
{code: "+378", label: "San Marino"},
{code: "+239", label: "Sao Tome and Principe"},
{code: "+966", label: "Saudi Arabia"},
{code: "+221", label: "Senegal"},
{code: "+381", label: "Serbia"},
{code: "+248", label: "Seychelles"},
{code: "+232", label: "Sierra Leone"},
{code: "+65", label: "Singapore"},
{code: "+421", label: "Slovakia"},
{code: "+386", label: "Slovenia"},
{code: "+677", label: "Solomon Islands"},
{code: "+27", label: "South Africa"},
{code: "+211", label: "South Sudan"},
{code: "+34", label: "Spain"},
{code: "+94", label: "Sri Lanka"},
{code: "+249", label: "Sudan"},
{code: "+597", label: "Suriname"},
{code: "+268", label: "Swaziland"},
{code: "+46", label: "Sweden"},
{code: "+41", label: "Switzerland"},
{code: "+963", label: "Syria"},
{code: "+886", label: "Taiwan"},
{code: "+992", label: "Tajikistan"},
{code: "+255", label: "Tanzania"},
{code: "+66", label: "Thailand"},
{code: "+670", label: "TimorLeste"},
{code: "+228", label: "Togo"},
{code: "+676", label: "Tonga"},
{code: "+1-868", label: "Trinidad and Tobago"},
{code: "+216", label: "Tunisia"},
{code: "+90", label: "Turkey"},
{code: "+993", label: "Turkmenistan"},
{code: "+688", label: "Tuvalu"},
{code: "+256", label: "Uganda"},
{code: "+380", label: "Ukraine"},
{code: "+971", label: "United Arab Emirates"},
{code: "+44", label: "United Kingdom"},
{code: "+1", label: "United States"},
{code: "+598", label: "Uruguay"},
{code: "+998", label: "Uzbekistan"},
{code: "+678", label: "Vanuatu"},
{code: "+3989", label: "Vatican City"},
{code: "+58", label: "Venezuela"},
{code: "+84", label: "Vietnam"},
{code: "+967", label: "Yemen"},
{code: "+260", label: "Zambia"},
{code: "+263", label: "Zimbabwe"},
];
export const default_info = {
phone_number: "+989385725269",
email: "ipd@shomal.hospital",
};
export const pages_titles = {
contact_us: {
fa: "تماس با ما",
en: "Contact Us",
ar: "اتصل بنا",
},
doctors: {
fa: "پزشکان",
en: "Doctors",
ar: "الأطباء",
},
medical_services: {
fa: "خدمات پزشکی",
en: "Medical Services",
ar: "الخدمات الطبية",
},
patient_rights_charter: {
fa: "منشور حقوق بیمار",
en: "Patient Rights Charter",
ar: "ميثاق حقوق المرضى",
},
pricing: {
fa: "قیمت‌ها",
en: "Pricing",
ar: "الأسعار",
},
transfer_services: {
fa: "خدمات ترانسفر",
en: "Transfer Services",
ar: "خدمات النقل",
},
upload_documents: {
fa: "آپلود مدارک",
en: "Upload Documents",
ar: "تحميل المستندات",
},
about_us: {
fa: "درباره ما",
en: "About Us",
ar: "معلومات عنا",
},
};

View File

@@ -0,0 +1,140 @@
import { MenuItemsTypes } from "@/types/global/menu.type";
export const DefaultMenuLinks: MenuItemsTypes[] = [
{
id: 1,
label: {
fa: "درباره ما",
en: "About Us",
ar: "معلومات عنا",
},
href: "/",
sub: [],
},
{
id: 4,
label: {
fa: "پزشکان",
en: "Doctors",
ar: "الأطباء",
},
href: "/doctors",
sub: [],
},
{
id: 5,
label: {
fa: "لیست قیمت‌ها",
en: "Pricing",
ar: "الأسعار",
},
href: "/pricing",
sub: [],
},
{
id: 6,
label: {
fa: "خدمات ما",
en: "Our Services",
ar: "خدماتنا",
},
href: "#",
sub: [
{
id: 1,
label: {
fa: "خدمات پزشکی",
en: "Medical Services",
ar: "الخدمات الطبية",
},
href: "/medical-services",
sub: [],
},
{
id: 2,
label: {
fa: "خدمات گردشگری",
en: "Tourism & Transfer Services",
ar: "خدمات النقل والسياحة",
},
href: "/transfer-services",
sub: [],
},
],
},
{
id: 7,
label: {
fa: "منشور حقوق بیمار",
en: "Patient Rights Charter",
ar: "ميثاق حقوق المريض",
},
href: "/patient-rights-charter",
sub: [],
},
{
id: 8,
label: {
fa: "تماس با ما",
en: "Contact Us",
ar: "اتصل بنا",
},
href: "/contact-us",
sub: [],
},
];
export const FooterMenuLinks1: MenuItemsTypes[] = [
{
id: 1,
label: {
fa: "پزشکان",
en: "Doctors",
ar: "الأطباء",
},
href: "/doctors",
sub: [],
},
{
id: 2,
label: {
fa: "لیست قیمت‌ها",
en: "Pricing",
ar: "الأسعار",
},
href: "/pricing",
sub: [],
},
{
id: 3,
label: {
fa: "خدمات پزشکی ما",
en: "Our Medical Services",
ar: "الخدمات الطبية",
},
href: "/medical-services",
sub: [],
},
{
id: 4,
label: {
fa: "خدمات گردشگری",
en: "Tourism & Transfer Services",
ar: "خدمات النقل والسياحة",
},
href: "/transfer-services",
sub: [],
},
];
export const Menu_buttons = {
upload_document: {
fa: "آپلود مدارک پزشکی",
en: "Upload Medical Documents",
ar: "تحميل المستندات الطبية",
},
request_to_accept: {
fa: "درخواست پذیرش بیمار",
en: "Patient Admission Request",
ar: "طلب قبول المريض",
},
};

12
src/data/doctors.json Normal file
View File

@@ -0,0 +1,12 @@
[
{
"id": 1,
"fullname": "اصغر محمدی",
"expertise": "متخصص قلب"
},
{
"id": 2,
"fullname": "علی احمدی",
"expertise": "متخصص گوش و حلق و بینی"
}
]

12
src/data/faq.json Normal file
View File

@@ -0,0 +1,12 @@
[
{
"id": 1,
"question": "بیمه های طرف قرارداد بیمارستان و درمانگاه کدامند ؟",
"answer": "لیست بیمه های طرف قرارداد را می‌توانید در لینک زیر مشاهده نمائید:\n\nhttps://shomalhospital.ir/departments/accepted-insurance/"
},
{
"id": 2,
"question": "بیمه تکمیلی دارم ، بیمه من چند درصد از هزینه هایم را پرداخت می کند؟",
"answer": "لیست بیمه های طرف قرارداد را می‌توانید در لینک زیر مشاهده نمائید:\n\nhttps://shomalhospital.ir/departments/accepted-insurance/"
}
]

32
src/middleware.js Normal file
View File

@@ -0,0 +1,32 @@
import {NextResponse} from "next/server";
const locales = ["en", "fa","ar"];
export function middleware(request) {
const {pathname} = request.nextUrl;
if (
pathname.startsWith("/_next") ||
pathname.startsWith("/favicon.ico") ||
pathname.startsWith("/robots.txt") ||
pathname.match(/^\/.*\.(png|jpg|jpeg|gif|svg|webp|ico)$/)
) {
return NextResponse.next();
}
const pathnameHasLocale = locales.some(
(locale) => pathname.startsWith(`/${locale}/`) || pathname === `/${locale}`
);
if (pathnameHasLocale) return NextResponse.next();
const locale = "fa";
const url = request.nextUrl.clone();
url.pathname = `/${locale}${pathname}`;
return NextResponse.redirect(url);
}
// export const config = {
// matcher: [
// "/((?!_next|favicon.ico|robots.txt|.*\\.(png|jpg|jpeg|gif|svg|webp|ico)).*)",
// ],
// };

View File

@@ -0,0 +1,8 @@
export interface MenuItemsTypes {
href: string;
label: {
[a:string]:string
};
id: number;
sub: MenuItemsTypes[] | [];
}

View File

@@ -0,0 +1,6 @@
export interface IconsProps {
color?: string;
size?: string;
width?: string;
height?: string;
}

105
src/types/index.ts Normal file
View File

@@ -0,0 +1,105 @@
export interface packages_types {
id: number;
slug: string;
svg: string;
title: {
[a: string]: string;
};
content: {
[a: string]: string;
};
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]: {
type: "text" | "select" | "number";
as: "input" | "select" | "textarea";
};
};
}
export interface DoctorDataType {
id: number;
image: string;
fullname: {
fa: string;
en: string;
ar: 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 sub_packages_data_type {
id: number;
slug: string;
svg: string;
title: {
fa: string;
en: string;
ar: string;
};
thumbnail: string;
description?: {
fa: string;
en: string;
ar: string;
};
services?: {
fa: string;
en: string;
ar: string;
};
price?: {
fa: string;
en: string;
ar: string;
};
notes?: {
fa: string;
en: string;
ar: string;
};
}

View File

@@ -0,0 +1,381 @@
"use client";
import React, {useState} from "react";
import ChevronLeftSvg from "./components/icons/ChevronLeftSvg";
import Image from "next/image";
interface AccordionProps {
defaultOpen?: number;
package_price: string;
transfer_service_page?: {
page_title: string;
introduction: {
title: string;
head_text: string;
mojgan_yaghoubi: {
fullname: string;
position: string;
phone_number: string;
email: string;
};
hassan_mozaffarzadeh: {
fullname: string;
position: string;
phone_number: string;
email: string;
};
packages_list: string;
our_serives_ipd: string;
packages: {
name: string;
dsc: string;
price: string;
}[];
image_headTitle: string;
amol_museum: string;
grand_mosque: string;
fire_temple: string;
};
jobs: string;
services: string;
};
oxin_hotel_location: string;
olympic_hotel_location: string;
}
export default function TransferServicesPackages({
defaultOpen,
package_price,
transfer_service_page,
oxin_hotel_location,
olympic_hotel_location,
}: AccordionProps) {
const [openIndex, setOpenIndex] = useState<number | null>(
defaultOpen ?? null
);
const toggle = (index: number) => {
setOpenIndex(openIndex === index ? null : index);
};
return (
<div className="w-full space-y-4 overflow-hidden">
<div key={1} className="p-4 bg-secondary rounded-2xl ">
<button
className="flex w-full items-center justify-between text-right h-full cursor-pointer"
onClick={() => toggle(1)}
>
<span className="text-lg font-semibold text-white">
{transfer_service_page?.introduction.packages[0].name}
</span>
<span
className={` text-white transition-all duration-300 ${
openIndex === 1 ? "rotate-90" : "-rotate-90"
}`}
>
<ChevronLeftSvg size="20" />
</span>
</button>
<div>
{openIndex === 1 && (
<div className="bg-white p-10 mt-10 space-y-10">
<div className="grid grid-cols-2 h-[300px]">
<div className="col-span-1 h-full">
<div className="h-full w-[100%] relative border-[1px] border-neutral-200 rounded-2xl overflow-hidden">
<Image
src={`/transfer-packages/Picture1.jpg`}
fill
className="object-cover"
alt=""
/>
</div>
</div>
<div className="col-span-1 h-full">
<div className="h-full w-[100%] relative border-[1px] border-neutral-200 rounded-2xl overflow-hidden">
<Image
src={`/transfer-packages/Picture2.jpg`}
fill
className="object-cover"
alt=""
/>
</div>
</div>
</div>
<div
className="overflow-hidden text-gray-600 mt-2 leading-relaxed text-base introduction_description_subText"
dangerouslySetInnerHTML={{
__html:
transfer_service_page?.introduction.packages[0].dsc || "",
}}
/>
<div className="mb-20 space-y-6">
<h4 className="font-bold text-lg">
{transfer_service_page?.introduction.image_headTitle}
</h4>
<div className="grid grid-cols-3 h-[300px]">
<div className="col-span-1 h-full space-y-2">
<div className="h-full w-[100%] relative border-[1px] border-neutral-200 rounded-2xl overflow-hidden">
<Image
src={`/transfer-packages/Picture3.jpg`}
fill
className="object-cover"
alt=""
/>
</div>
<div className="text-center w-full">
{transfer_service_page?.introduction.amol_museum}
</div>
</div>
<div className="col-span-1 h-full space-y-2">
<div className="h-full w-[100%] relative border-[1px] border-neutral-200 rounded-2xl overflow-hidden">
<Image
src={`/transfer-packages/Picture4.jpg`}
fill
className="object-cover"
alt=""
/>
</div>
<div className="text-center w-full">
{transfer_service_page?.introduction.grand_mosque}
</div>
</div>
<div className="col-span-1 h-full space-y-2">
<div className="h-full w-[100%] relative border-[1px] border-neutral-200 rounded-2xl overflow-hidden">
<Image
src={`/transfer-packages/Picture5.jpg`}
fill
className="object-cover"
alt=""
/>
</div>
<div className="text-center w-full">
{transfer_service_page?.introduction.fire_temple}
</div>
</div>
</div>
</div>
<>
<h4 className="font-bold text-lg">{package_price}</h4>
<div className="overflow-hidden text-gray-600 leading-relaxed text-base packages_subpackages_list">
{transfer_service_page?.introduction.packages[0].price}
</div>
</>
<>
<h4 className="font-bold text-lg">{oxin_hotel_location}</h4>
<div className="overflow-hidden text-gray-600 leading-relaxed text-base w-full h-[500px]">
<iframe
src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3210.9190090955594!2d52.34268797608069!3d36.41115477236057!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3f8fbdddbc457a2f%3A0xd1386b78426bdbbe!2z2YfYqtmEINin2qnYs9uM2YYg2KLZhdmE!5e0!3m2!1sen!2s!4v1763448385341!5m2!1sen!2s"
className="h-full w-full"
style={{border: "0"}}
allowFullScreen={false}
loading="lazy"
referrerPolicy="no-referrer-when-downgrade"
></iframe>
</div>
</>
</div>
)}
</div>
</div>
<div key={2} className="p-4 bg-secondary rounded-2xl ">
<button
className="flex w-full items-center justify-between text-right h-full cursor-pointer"
onClick={() => toggle(2)}
>
<span className="text-lg font-semibold text-white">
{transfer_service_page?.introduction.packages[1].name}
</span>
<span
className={` text-white transition-all duration-300 ${
openIndex === 2 ? "rotate-90" : "-rotate-90"
}`}
>
<ChevronLeftSvg size="20" />
</span>
</button>
<div>
{openIndex === 2 && (
<div className="bg-white p-10 mt-10 space-y-10">
<div
className="overflow-hidden text-gray-600 mt-2 leading-relaxed text-base introduction_description_subText"
dangerouslySetInnerHTML={{
__html:
transfer_service_page?.introduction.packages[1].dsc || "",
}}
/>
<div className="mb-20 space-y-6">
<h4 className="font-bold text-lg">
{transfer_service_page?.introduction.image_headTitle}
</h4>
<div className="grid grid-cols-3 h-[300px]">
<div className="col-span-1 h-full space-y-2">
<div className="h-full w-[100%] relative border-[1px] border-neutral-200 rounded-2xl overflow-hidden">
<Image
src={`/transfer-packages/Picture3.jpg`}
fill
className="object-cover"
alt=""
/>
</div>
<div className="text-center w-full">
{transfer_service_page?.introduction.amol_museum}
</div>
</div>
<div className="col-span-1 h-full space-y-2">
<div className="h-full w-[100%] relative border-[1px] border-neutral-200 rounded-2xl overflow-hidden">
<Image
src={`/transfer-packages/Picture4.jpg`}
fill
className="object-cover"
alt=""
/>
</div>
<div className="text-center w-full">
{transfer_service_page?.introduction.grand_mosque}
</div>
</div>
<div className="col-span-1 h-full space-y-2">
<div className="h-full w-[100%] relative border-[1px] border-neutral-200 rounded-2xl overflow-hidden">
<Image
src={`/transfer-packages/Picture5.jpg`}
fill
className="object-cover"
alt=""
/>
</div>
<div className="text-center w-full">
{transfer_service_page?.introduction.fire_temple}
</div>
</div>
</div>
</div>
<>
<h4 className="font-bold text-lg">{package_price}:</h4>
<div className="overflow-hidden text-gray-600 leading-relaxed text-base packages_subpackages_list">
{transfer_service_page?.introduction.packages[1].price}
</div>
</>
<>
<h4 className="font-bold text-lg">{oxin_hotel_location}</h4>
<div className="overflow-hidden text-gray-600 leading-relaxed text-base w-full h-[500px]">
<iframe
src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3210.9190090955594!2d52.34268797608069!3d36.41115477236057!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3f8fbdddbc457a2f%3A0xd1386b78426bdbbe!2z2YfYqtmEINin2qnYs9uM2YYg2KLZhdmE!5e0!3m2!1sen!2s!4v1763448385341!5m2!1sen!2s"
className="h-full w-full"
style={{border: "0"}}
allowFullScreen={false}
loading="lazy"
referrerPolicy="no-referrer-when-downgrade"
></iframe>
</div>
</>
</div>
)}
</div>
</div>
<div key={3} className="p-4 bg-secondary rounded-2xl ">
<button
className="flex w-full items-center justify-between text-right h-full cursor-pointer"
onClick={() => toggle(3)}
>
<span className="text-lg font-semibold text-white">
{transfer_service_page?.introduction.packages[2].name}
</span>
<span
className={` text-white transition-all duration-300 ${
openIndex === 3 ? "rotate-90" : "-rotate-90"
}`}
>
<ChevronLeftSvg size="20" />
</span>
</button>
<div>
{openIndex === 3 && (
<div className="bg-white p-10 mt-10 space-y-10">
<div
className="overflow-hidden text-gray-600 mt-2 leading-relaxed text-base introduction_description_subText"
dangerouslySetInnerHTML={{
__html:
transfer_service_page?.introduction.packages[2].dsc || "",
}}
/>
<div className="mb-20 space-y-6">
<h4 className="font-bold text-lg">
{transfer_service_page?.introduction.image_headTitle}
</h4>
<div className="grid grid-cols-3 h-[300px]">
<div className="col-span-1 h-full space-y-2">
<div className="h-full w-[100%] relative border-[1px] border-neutral-200 rounded-2xl overflow-hidden">
<Image
src={`/transfer-packages/Picture3.jpg`}
fill
className="object-cover"
alt=""
/>
</div>
<div className="text-center w-full">
{transfer_service_page?.introduction.amol_museum}
</div>
</div>
<div className="col-span-1 h-full space-y-2">
<div className="h-full w-[100%] relative border-[1px] border-neutral-200 rounded-2xl overflow-hidden">
<Image
src={`/transfer-packages/Picture4.jpg`}
fill
className="object-cover"
alt=""
/>
</div>
<div className="text-center w-full">
{transfer_service_page?.introduction.grand_mosque}
</div>
</div>
<div className="col-span-1 h-full space-y-2">
<div className="h-full w-[100%] relative border-[1px] border-neutral-200 rounded-2xl overflow-hidden">
<Image
src={`/transfer-packages/Picture5.jpg`}
fill
className="object-cover"
alt=""
/>
</div>
<div className="text-center w-full">
{transfer_service_page?.introduction.fire_temple}
</div>
</div>
</div>
</div>
<>
<h4 className="font-bold text-lg">{package_price}:</h4>
<div className="overflow-hidden text-gray-600 leading-relaxed text-base packages_subpackages_list">
{transfer_service_page?.introduction.packages[2].price}
</div>
</>
<>
<h4 className="font-bold text-lg">{olympic_hotel_location}</h4>
<div className="overflow-hidden text-gray-600 leading-relaxed text-base w-full h-[500px]">
<iframe
src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3211.2022474270625!2d52.34143227608035!3d36.40430177236265!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3f8fbd94218aabf9%3A0xe65c01eb776496b3!2sShomal%20Olympic%20Hotel!5e0!3m2!1sen!2s!4v1763448766682!5m2!1sen!2s"
className="h-full w-full"
style={{border: "0"}}
allowFullScreen={false}
loading="lazy"
referrerPolicy="no-referrer-when-downgrade"
></iframe>
</div>
</>
</div>
)}
</div>
</div>
</div>
);
}

View File

@@ -0,0 +1,5 @@
import React from "react";
export default function Footer() {
return <></>;
}

View File

@@ -0,0 +1,184 @@
"use client";
import Image from "next/image";
import Link from "next/link";
import React from "react";
import {Autoplay, Navigation} from "swiper/modules";
import {Swiper, SwiperSlide} from "swiper/react";
import "swiper/css";
import "swiper/css/navigation";
export default function InsurancesSlider() {
return (
<>
<Swiper
loop={true}
rewind={true}
autoplay={{
delay: 2500,
disableOnInteraction: false,
}}
navigation={false}
slidesPerView={8}
centeredSlides={true}
centeredSlidesBounds={true}
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 ">
<Link href={"/"} className="h-full w-full ">
<div className="relative h-full w-full">
<Image
loading="lazy"
src={"/bank-melat.png"}
fill
style={{color: "transparent", objectFit: "fill"}}
alt=""
/>
</div>
</Link>
</SwiperSlide>
<SwiperSlide className="h-full !w-[120px] rounded-xl overflow-hidden">
<Link href={"/"} className="h-full w-full ">
<div className="relative h-full w-full">
<Image
loading="lazy"
src={"/bimeh-ma.png"}
fill
style={{color: "transparent", objectFit: "fill"}}
alt=""
/>
</div>
</Link>
</SwiperSlide>
<SwiperSlide className="h-full !w-[120px] rounded-xl overflow-hidden">
<Link href={"/"} className="h-full w-full ">
<div className="relative h-full w-full">
<Image
loading="lazy"
src={"/bimeh-moallem.png"}
fill
style={{color: "transparent", objectFit: "fill"}}
alt=""
/>
</div>
</Link>
</SwiperSlide>
<SwiperSlide className="h-full !w-[120px] rounded-xl overflow-hidden">
<Link href={"/"} className="h-full w-full ">
<div className="relative h-full w-full">
<Image
loading="lazy"
src={"/bimeh-novin.png"}
fill
style={{color: "transparent", objectFit: "fill"}}
alt=""
/>
</div>
</Link>
</SwiperSlide>
<SwiperSlide className="h-full !w-[120px] rounded-xl overflow-hidden">
<Link href={"/"} className="h-full w-full ">
<div className="relative h-full w-full">
<Image
loading="lazy"
src={"/bimeh-pasargad.png"}
fill
style={{color: "transparent", objectFit: "fill"}}
alt=""
/>
</div>
</Link>
</SwiperSlide>
<SwiperSlide className="h-full !w-[120px] rounded-xl overflow-hidden">
<Link href={"/"} className="h-full w-full ">
<div className="relative h-full w-full">
<Image
loading="lazy"
src={"/bimeh-saman.png"}
fill
style={{color: "transparent", objectFit: "fill"}}
alt=""
/>
</div>
</Link>
</SwiperSlide>
<SwiperSlide className="h-full !w-[120px] rounded-xl overflow-hidden">
<Link href={"/"} className="h-full w-full ">
<div className="relative h-full w-full">
<Image
loading="lazy"
src={"/bimeh-tejarat-no.png"}
fill
style={{color: "transparent", objectFit: "fill"}}
alt=""
/>
</div>
</Link>
</SwiperSlide>
{/* <SwiperSlide className="h-full w-full rounded-xl overflow-hidden">
<Link href={"/"} className="h-full w-full ">
<div className="relative h-full w-full">
<Image loading="lazy"
src={"/bank-melat.png"}
fill
style={{color: "transparent", objectFit: "fill"}}
alt=""
/>
</div>
</Link>
</SwiperSlide>
<SwiperSlide className="h-full w-full rounded-xl overflow-hidden">
<Link href={"/"} className="h-full w-full ">
<div className="relative h-full w-full">
<Image loading="lazy"
src={"/bank-melat.png"}
fill
style={{color: "transparent", objectFit: "fill"}}
alt=""
/>
</div>
</Link>
</SwiperSlide>
<SwiperSlide className="h-full w-full rounded-xl overflow-hidden">
<Link href={"/"} className="h-full w-full ">
<div className="relative h-full w-full">
<Image loading="lazy"
src={"/bank-melat.png"}
fill
style={{color: "transparent", objectFit: "fill"}}
alt=""
/>
</div>
</Link>
</SwiperSlide>
<SwiperSlide className="h-full w-full rounded-xl overflow-hidden">
<Link href={"/"} className="h-full w-full ">
<div className="relative h-full w-full">
<Image loading="lazy"
src={"/bank-melat.png"}
fill
style={{color: "transparent", objectFit: "fill"}}
alt=""
/>
</div>
</Link>
</SwiperSlide>
<SwiperSlide className="h-full w-full rounded-xl overflow-hidden">
<Link href={"/"} className="h-full w-full ">
<div className="relative h-full w-full">
<Image loading="lazy"
src={"/bank-melat.png"}
fill
style={{color: "transparent", objectFit: "fill"}}
alt=""
/>
</div>
</Link>
</SwiperSlide> */}
</Swiper>
</>
);
}

View File

@@ -0,0 +1,66 @@
"use client";
import {languages_types} from "@/types";
import {usePathname, useRouter} from "next/navigation";
import React from "react";
export default function LanguagesChanger({lang}: {lang: languages_types}) {
const pathname = usePathname();
const router = useRouter();
const removeLangPrefix = (path: string) => {
const regex = /^\/(fa|en|ar)(\/|$)/;
return path.replace(regex, "/");
};
const handleChangeLanguage = (lang: languages_types) => {
const cleanPath = removeLangPrefix(pathname); // مسیر بدون prefix
const newPath = `/${lang}${cleanPath}`;
router.push(newPath);
};
return (
<>
<div className="text-white text-xs flex items-center justify-end gap-x-4 border-[1px] border-white px-4 py-1.5 rounded-full ">
<span>
<button
type="button"
onClick={() => handleChangeLanguage("en")}
className="hover:text-secondary cursor-pointer"
>
EN
</button>
</span>
<span> | </span>
<span>
<button
type="button"
onClick={() => handleChangeLanguage("fa")}
className="hover:text-secondary cursor-pointer"
>
FA
</button>
</span>
<span> | </span>
<span>
<button
type="button"
onClick={() => handleChangeLanguage("ar")}
className="hover:text-secondary cursor-pointer"
>
AR
</button>
</span>
<svg
width="15"
height="15"
viewBox="0 0 25 25"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M12.5 25C10.7917 25 9.17708 24.6719 7.65625 24.0156C6.13542 23.3594 4.80729 22.4635 3.67188 21.3281C2.53646 20.1927 1.64063 18.8646 0.984375 17.3438C0.328125 15.8229 0 14.2083 0 12.5C0 10.7708 0.328125 9.15104 0.984375 7.64063C1.64063 6.13021 2.53646 4.80729 3.67188 3.67188C4.80729 2.53646 6.13542 1.64063 7.65625 0.984375C9.17708 0.328125 10.7917 0 12.5 0C14.2292 0 15.849 0.328125 17.3594 0.984375C18.8698 1.64063 20.1927 2.53646 21.3281 3.67188C22.4635 4.80729 23.3594 6.13021 24.0156 7.64063C24.6719 9.15104 25 10.7708 25 12.5C25 14.2083 24.6719 15.8229 24.0156 17.3438C23.3594 18.8646 22.4635 20.1927 21.3281 21.3281C20.1927 22.4635 18.8698 23.3594 17.3594 24.0156C15.849 24.6719 14.2292 25 12.5 25ZM12.5 22.4375C13.0417 21.6875 13.5104 20.9063 13.9063 20.0938C14.3021 19.2813 14.625 18.4167 14.875 17.5H10.125C10.375 18.4167 10.6979 19.2813 11.0938 20.0938C11.4896 20.9063 11.9583 21.6875 12.5 22.4375ZM9.25 21.9375C8.875 21.25 8.54688 20.5365 8.26563 19.7969C7.98438 19.0573 7.75 18.2917 7.5625 17.5H3.875C4.47917 18.5417 5.23438 19.4479 6.14063 20.2188C7.04688 20.9896 8.08333 21.5625 9.25 21.9375ZM15.75 21.9375C16.9167 21.5625 17.9531 20.9896 18.8594 20.2188C19.7656 19.4479 20.5208 18.5417 21.125 17.5H17.4375C17.25 18.2917 17.0156 19.0573 16.7344 19.7969C16.4531 20.5365 16.125 21.25 15.75 21.9375ZM2.8125 15H7.0625C7 14.5833 6.95313 14.1719 6.92188 13.7656C6.89063 13.3594 6.875 12.9375 6.875 12.5C6.875 12.0625 6.89063 11.6406 6.92188 11.2344C6.95313 10.8281 7 10.4167 7.0625 10H2.8125C2.70833 10.4167 2.63021 10.8281 2.57813 11.2344C2.52604 11.6406 2.5 12.0625 2.5 12.5C2.5 12.9375 2.52604 13.3594 2.57813 13.7656C2.63021 14.1719 2.70833 14.5833 2.8125 15ZM9.5625 15H15.4375C15.5 14.5833 15.5469 14.1719 15.5781 13.7656C15.6094 13.3594 15.625 12.9375 15.625 12.5C15.625 12.0625 15.6094 11.6406 15.5781 11.2344C15.5469 10.8281 15.5 10.4167 15.4375 10H9.5625C9.5 10.4167 9.45313 10.8281 9.42188 11.2344C9.39063 11.6406 9.375 12.0625 9.375 12.5C9.375 12.9375 9.39063 13.3594 9.42188 13.7656C9.45313 14.1719 9.5 14.5833 9.5625 15ZM17.9375 15H22.1875C22.2917 14.5833 22.3698 14.1719 22.4219 13.7656C22.474 13.3594 22.5 12.9375 22.5 12.5C22.5 12.0625 22.474 11.6406 22.4219 11.2344C22.3698 10.8281 22.2917 10.4167 22.1875 10H17.9375C18 10.4167 18.0469 10.8281 18.0781 11.2344C18.1094 11.6406 18.125 12.0625 18.125 12.5C18.125 12.9375 18.1094 13.3594 18.0781 13.7656C18.0469 14.1719 18 14.5833 17.9375 15ZM17.4375 7.5H21.125C20.5208 6.45833 19.7656 5.55208 18.8594 4.78125C17.9531 4.01042 16.9167 3.4375 15.75 3.0625C16.125 3.75 16.4531 4.46354 16.7344 5.20313C17.0156 5.94271 17.25 6.70833 17.4375 7.5ZM10.125 7.5H14.875C14.625 6.58333 14.3021 5.71875 13.9063 4.90625C13.5104 4.09375 13.0417 3.3125 12.5 2.5625C11.9583 3.3125 11.4896 4.09375 11.0938 4.90625C10.6979 5.71875 10.375 6.58333 10.125 7.5ZM3.875 7.5H7.5625C7.75 6.70833 7.98438 5.94271 8.26563 5.20313C8.54688 4.46354 8.875 3.75 9.25 3.0625C8.08333 3.4375 7.04688 4.01042 6.14063 4.78125C5.23438 5.55208 4.47917 6.45833 3.875 7.5Z"
fill="#E8EAED"
/>
</svg>
</div>
</>
);
}

View File

@@ -0,0 +1,28 @@
"use client";
import React, {useState} from "react";
export default function MobileToggler() {
const [, setOpen] = useState(false);
return (
<>
<button onClick={(prev) => setOpen(!prev)}>
<svg
stroke="currentColor"
fill="none"
strokeWidth="0"
viewBox="0 0 15 15"
height="40"
width="40"
xmlns="http://www.w3.org/2000/svg"
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M1.5 3C1.22386 3 1 3.22386 1 3.5C1 3.77614 1.22386 4 1.5 4H13.5C13.7761 4 14 3.77614 14 3.5C14 3.22386 13.7761 3 13.5 3H1.5ZM1 7.5C1 7.22386 1.22386 7 1.5 7H13.5C13.7761 7 14 7.22386 14 7.5C14 7.77614 13.7761 8 13.5 8H1.5C1.22386 8 1 7.77614 1 7.5ZM1 11.5C1 11.2239 1.22386 11 1.5 11H13.5C13.7761 11 14 11.2239 14 11.5C14 11.7761 13.7761 12 13.5 12H1.5C1.22386 12 1 11.7761 1 11.5Z"
fill="currentColor"
></path>
</svg>
</button>
</>
);
}

View File

@@ -0,0 +1,117 @@
"use client";
import {useState} from "react";
import ChevronLeftSvg from "../icons/ChevronLeftSvg";
import Image from "next/image";
import { default_info } from "@/constants";
interface AccordionProps {
title: string;
description: string;
thumbnail: string;
services: string;
notes?: string;
price: string;
defaultOpen?: number;
index: number;
}
export default function Accordion({
title,
index,
description,
services,
notes = "",
thumbnail,
price,
defaultOpen,
}: AccordionProps) {
const [openIndex, setOpenIndex] = useState<number | null>(
defaultOpen ?? null
);
const toggle = (index: number) => {
setOpenIndex(openIndex === index ? null : index);
};
return (
<div className="w-full space-y-4 overflow-hidden">
<div key={index} className="p-4 bg-secondary rounded-2xl ">
<button
className="flex w-full items-center justify-between text-right h-full cursor-pointer"
onClick={() => toggle(index)}
>
<span className="text-lg font-semibold text-white">{title}</span>
<span
className={` text-white transition-all duration-300 ${
openIndex === index ? "rotate-90" : "-rotate-90"
}`}
>
<ChevronLeftSvg size="20" />
</span>
</button>
<div>
{openIndex === index && (
<div className="bg-white p-10 mt-10 space-y-10">
{thumbnail && (
<div className="h-[600px] w-[80%] mx-auto relative border-[1px] border-neutral-200 rounded-2xl overflow-hidden">
<Image
src={`/packages/${thumbnail}`}
fill
className="object-contain"
alt=""
/>
</div>
)}
{description && (
<div
className="overflow-hidden text-gray-600 mt-2 leading-relaxed text-base"
dangerouslySetInnerHTML={{__html: description}}
/>
)}
{services && (
<>
<h4 className="font-bold text-lg">
خدمات قابل ارائه به بيمار شامل:
</h4>
<div
className="overflow-hidden text-gray-600 leading-relaxed text-base packages_subpackages_list"
dangerouslySetInnerHTML={{__html: services}}
/>
</>
)}
{price && (
<>
<h4 className="font-bold text-lg">قیمت پکیج ها:</h4>
<div
className="overflow-hidden text-gray-600 leading-relaxed text-base packages_subpackages_list"
dangerouslySetInnerHTML={{__html: price}}
/>
</>
)}
{notes && (
<>
<h4 className="font-bold text-lg">نکات مهم :</h4>
<div
className="overflow-hidden text-gray-600 leading-relaxed text-base "
dangerouslySetInnerHTML={{__html: notes}}
/>
</>
)}
<>
<h4 className="font-bold text-lg">
رزرو نوبت و مشاوره رايگان با پزشك و كارشناس IPD :
</h4>
<div className="overflow-hidden text-gray-600 leading-relaxed text-base ">
<div>ایمیل : <a href={`mailto:${default_info.email}`}>{default_info.email}</a></div>
<div>واتساپ : <a href={`https://wa.me/${+default_info.phone_number}`}></a></div>
</div>
</>
</div>
)}
</div>
</div>
</div>
);
}

View File

@@ -0,0 +1,10 @@
import React from "react";
interface ButtonProps {
label: string;
onClick: (e: React.MouseEvent<HTMLButtonElement>) => void;
}
export default function Button({label,onClick}: ButtonProps) {
return (
<button onClick={onClick} className="font-medium text-white bg-blue-primary rounded-xl flex items-center gap-x-4 px-2 py-1">{label}</button>
);
}

View File

@@ -0,0 +1,14 @@
import Link from "next/link";
import React from "react";
interface CustomLinkProps {
href: string;
label: string;
className?: string;
}
export default function CustomLink({href, label, className}: CustomLinkProps) {
return (
<Link href={href} className={className }>
{label}
</Link>
);
}

View File

@@ -0,0 +1,80 @@
"use client";
import React, { useMemo } from "react";
import Select from "react-select";
export interface Option {
value: string;
label: string;
}
interface CustomSelectProps {
options: Option[];
value?: string;
onChange?: (value: string) => void;
placeholder?: string;
className?: string;
isSearchable?: boolean;
isDisabled?: boolean;
isClearable?: boolean;
rtl?: boolean;
}
const CustomSelect: React.FC<CustomSelectProps> = ({
options,
value,
onChange,
placeholder = "انتخاب کنید...",
className = "",
isSearchable = true,
isDisabled = false,
isClearable = false,
rtl = true
}) => {
const selectedOption = useMemo(
() => options.find((opt) => opt.value === value) ?? null,
[value, options]
);
return (
<Select
instanceId="custom-select"
options={options}
value={selectedOption}
onChange={(opt) => onChange?.((opt as Option)?.value ?? "")}
placeholder={placeholder}
isSearchable={isSearchable}
isDisabled={isDisabled}
isClearable={isClearable}
className={className}
classNamePrefix="cs"
isRtl={rtl}
styles={{
control: (base, state) => ({
...base,
padding: "6px 4px",
borderRadius: "0.75rem",
borderColor: state.isFocused ? "#3b82f6" : "#d1d5db",
boxShadow: state.isFocused ? "0 0 0 1px #3b82f6" : "none",
"&:hover": { borderColor: "#3b82f6" },
backgroundColor: "transparent",
}),
menu: (base) => ({
...base,
zIndex: 9999,
borderRadius: "0.75rem",
}),
option: (base, state) => ({
...base,
backgroundColor: state.isSelected
? "#3b82f6"
: state.isFocused
? "#e5e7eb"
: "white",
color: state.isSelected ? "white" : "#111",
})
}}
/>
);
};
export default CustomSelect;

View File

@@ -0,0 +1,80 @@
"use client";
import React, { useState} from "react";
import ChevronLeftSvg from "../icons/ChevronLeftSvg";
import {usePathname, useRouter, useSearchParams} from "next/navigation";
import {site_languages} from "@/constants";
interface DropdownProps {
defaultValue?: {label: string; value: string};
options: {label: string; value: string}[];
}
export default function Dropdown({
defaultValue,
options,
}: DropdownProps) {
const [isOpen, setIsOpen] = useState(false);
const [selected, setSelected] = useState<{label: string; value: string}>(
defaultValue ?? options[0]
);
const router = useRouter();
const pathname = usePathname();
const searchParams = useSearchParams();
const handleChange = (entry: string) => {
const target = options.find((option) => option.label === entry) || {
label: "",
value: "",
};
setSelected(target);
const segments = pathname.split("/").filter(Boolean);
if (
segments.length > 0 &&
site_languages.map((language) => language.label).includes(segments[0])
) {
segments.shift();
}
const newPath = `/${target.value}/${segments.join("/")}`;
const search = searchParams.toString();
router.push(newPath + (search ? `?${search}` : ""));
};
return (
<button
onClick={(e) => {
e.stopPropagation();
setIsOpen((t) => !t);
}}
className={` ${
isOpen ? "rounded-t-xl" : "rounded-xl"
} flex items-center gap-x-3 p-3 relative font-medium`}
>
<span className="text-white">{selected.label}</span>
<span
className={`transition-all text-white ${
isOpen ? "rotate-90" : "-rotate-90"
}`}
>
<ChevronLeftSvg size="10" />
</span>
<div
className={`absolute top-full bg-blue-primary rounded-b-xl text-[#e6e6e6] p-3 z-20 w-full right-0 ${
isOpen ? "block" : "hidden"
}`}
>
<ul className="space-y-4">
{options?.map((option) => (
<li
key={option.value}
onClick={(e) => handleChange(e.currentTarget.innerHTML)}
className="hover:text-white hover:cursor-pointer"
>
{option.label}
</li>
))}
</ul>
</div>
</button>
);
}

View File

@@ -0,0 +1,26 @@
import {IconsProps} from "@/types/icons/icons.type";
import React from "react";
export default function ArrowLeftSvg({
size,
width = "17",
height = "17",
color = "currentColor",
}: IconsProps) {
return (
<>
<svg
width={size ?? width}
height={size ?? height}
viewBox="0 0 17 17"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M4.325 9.5H16.5V7.5H4.325L9.925 1.9L8.5 0.5L0.5 8.5L8.5 16.5L9.925 15.1L4.325 9.5Z"
fill={color}
/>
</svg>
</>
);
}

View File

@@ -0,0 +1,37 @@
import React from "react";
export default function BeautySvg() {
return (
<>
<svg
width="90"
height="90"
viewBox="0 0 48 48"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<defs>
<linearGradient
id="paint0_linear_51_6677"
x1="24"
y1="0"
x2="24"
y2="48"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#043D82" />
<stop offset="1" stopColor="#60A4F7" />
</linearGradient>
</defs>
<path
d="M30.4035 5.08497C30.9088 5.30778 31.1378 5.89807 30.915 6.40341L30 5.99998C30.915 6.40341 30.9151 6.40318 30.915 6.40341L30.9145 6.40457L30.9095 6.41599L30.8946 6.44948C30.8816 6.47865 30.8624 6.52139 30.8373 6.57695C30.7871 6.68808 30.7131 6.85056 30.6168 7.05845C30.424 7.47417 30.1417 8.07182 29.7815 8.80394C29.0613 10.2673 28.0274 12.2722 26.7725 14.4375C24.2893 18.7222 20.8478 23.8016 17.1779 26.4468L17.1762 26.4481C13.3194 29.2159 12.5743 32.2502 13.1976 34.4373C13.8393 36.6893 15.9969 38.3725 18.6437 38.3725H19.1156C19.4217 37.306 20.2196 36.275 21.5774 35.6419C23.1162 34.9243 25.2972 34.7469 28.2261 35.4267C28.7641 35.5515 29.099 36.0889 28.9741 36.6268C28.8493 37.1648 28.3119 37.4997 27.7739 37.3749C25.1029 36.7549 23.4172 36.9907 22.4227 37.4545C21.8795 37.7077 21.5215 38.0367 21.2969 38.3725H21.8726C24.4282 38.3725 26.5 40.4443 26.5 43H24.5C24.5 41.5489 23.3237 40.3725 21.8726 40.3725H18.6437C15.139 40.3725 12.1703 38.1304 11.2741 34.9854C10.3595 31.7759 11.6647 27.9421 16.0091 24.8239C19.3008 22.451 22.5625 17.7129 25.0421 13.4346C26.2687 11.3182 27.2812 9.35506 27.987 7.92083C28.3397 7.20413 28.6153 6.62058 28.8022 6.21731C28.8957 6.0157 28.967 5.85922 29.0146 5.75378C29.0384 5.70106 29.0563 5.6611 29.0681 5.63465L29.0812 5.60519L29.0849 5.59672C29.3078 5.09138 29.8981 4.86216 30.4035 5.08497Z"
fill="url(#paint0_linear_51_6677)"
/>
<path
d="M32.5289 39.8487C33.9392 38.9698 35.2367 37.0814 35.7557 34.9909C36.2866 32.8525 36.0417 30.3276 34.0958 28.3064L32.655 29.6935C34.0101 31.101 34.2236 32.8617 33.8147 34.509C33.3938 36.2042 32.3531 37.6016 31.4711 38.1513L32.5289 39.8487Z"
fill="url(#paint0_linear_51_6677)"
/>
</svg>
</>
);
}

View File

@@ -0,0 +1,37 @@
import React from "react";
export default function BrainSurgerySvg() {
return (
<>
<svg
width="90"
height="90"
viewBox="0 0 90 90"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M55.4708 42.8871C57.6446 42.8871 59.7681 42.2961 61.5634 41.1913C63.3863 42.294 65.5376 42.8721 67.7329 42.8492L74.7062 40.5621C76.6712 39.102 78.0201 37.0779 78.5274 34.8289C79.0346 32.5796 78.6692 30.2417 77.4924 28.2062C76.3157 26.1707 74.3989 24.5612 72.063 23.6471C71.5296 21.4697 70.1861 19.5219 68.2554 18.1273L61.4484 15.9803H60.6821C59.1681 13.9892 56.895 12.5689 54.2951 11.9895L39.7014 11.25C37.2756 11.4317 34.9881 12.3436 33.2072 13.839C32.3657 13.6602 31.5043 13.5675 30.6397 13.5627C28.5463 13.5666 26.4988 14.1165 24.7446 15.1461C22.9903 16.1756 21.6041 17.6408 20.7534 19.3648L15.2084 22.905C13.8286 24.5899 13.0859 26.6299 13.0895 28.7239C13.0759 29.5997 13.205 30.4723 13.4727 31.3142C12.0179 33.0156 11.2357 35.1064 11.2502 37.2544C11.2467 39.7455 12.3027 42.1433 14.2008 43.9543C14.354 45.7378 15.0454 47.4497 16.2004 48.9045C17.3554 50.3593 18.9298 51.5019 20.7534 52.2083C22.8546 53.3955 24.6337 54.9923 25.9599 56.8808C27.2863 58.7694 28.1259 60.9021 28.4173 63.1217H42.7341V52.7608C42.7314 50.9213 43.3009 49.1179 44.3779 47.5551C45.4547 45.9924 46.9959 44.733 48.8269 43.9196C49.8564 43.5647 50.1097 43.0868 50.4201 42.5012C50.6269 42.111 50.8592 41.6728 51.3632 41.1913C51.8012 41.4608 52.1406 41.6998 52.4347 41.907C53.3471 42.5492 53.8269 42.8871 55.4708 42.8871ZM63.81 38.1467C64.8098 38.6874 65.9625 39.0131 67.1672 39.0771L72.8959 37.1981C73.9419 36.2878 74.6063 35.1591 74.8691 33.993C75.1644 32.6839 74.9608 31.3086 74.2459 30.072C73.5242 28.8236 72.2976 27.7549 70.6965 27.1284L68.8838 26.4191L68.4206 24.5284C68.1493 23.4208 67.4983 22.3508 66.486 21.4903L60.8711 19.7192H58.8227L57.6971 18.2391C56.805 17.0659 55.4289 16.1405 53.7589 15.7061L39.7687 14.9973C38.1718 15.1584 36.72 15.7751 35.6186 16.6999L34.2174 17.8764L32.4277 17.4962C31.8414 17.3716 31.2392 17.3061 30.633 17.3018C29.1891 17.3069 27.8025 17.6886 26.6426 18.3693C25.4812 19.0508 24.6236 19.9849 24.1162 21.0131L23.6533 21.9516L17.7929 25.6931C17.1526 26.6318 16.8377 27.6754 16.8395 28.7064L16.8396 28.7389L16.8391 28.7715C16.8318 29.2382 16.9003 29.7075 17.0463 30.1667L17.6786 32.1546L16.3229 33.7403C15.4275 34.7874 14.992 36.0129 15.0001 37.218L15.0002 37.2332L15.0002 37.2486C14.9982 38.6533 15.5901 40.0858 16.7894 41.2301L17.8157 42.2093L17.937 43.6224C18.0247 44.643 18.4224 45.6613 19.1374 46.5619C19.8557 47.4668 20.8719 48.2216 22.1081 48.7005L22.3614 48.7988L22.5982 48.9324C22.8724 49.0873 23.1424 49.2482 23.4081 49.4149L23.3964 49.4235C28.494 52.5336 30.657 57.0598 31.3912 59.3743H32.5387V45.6988L28.4076 42.0266L25.6035 44.8309C24.8713 45.5631 23.6841 45.5631 22.9519 44.8309C22.2197 44.0987 22.2197 42.9114 22.9519 42.1793L26.3115 38.8194L25.3035 33.2753L20.7362 30.9917C19.8099 30.5286 19.4346 29.4023 19.8977 28.476C20.3608 27.5499 21.4871 27.1744 22.4134 27.6375L26.8699 29.8659L32.3287 26.3921L30.6309 21.8642C30.2672 20.8946 30.7586 19.8139 31.7282 19.4501C32.6977 19.0866 33.7785 19.5778 34.1421 20.5474L35.9666 25.4128H37.9851L38.9492 23.4844L37.4205 19.9172C37.0125 18.9654 37.4535 17.8631 38.4052 17.4552C39.357 17.0473 40.4593 17.4882 40.8673 18.44L42.1837 21.5117L47.4112 22.4621L47.4328 22.4447L50.8114 19.7417C51.6201 19.0948 52.8 19.2259 53.4469 20.0346C54.0938 20.8431 53.9627 22.023 53.154 22.6699L50.8956 24.4768L53.3989 27.6954L54.3602 25.7732C54.6776 25.1379 55.3269 24.7367 56.0372 24.7367H60.0915C61.1271 24.7367 61.9665 25.5761 61.9665 26.6117C61.9665 27.6473 61.1271 28.4867 60.0915 28.4867H57.1959L56.6933 29.4921L59.8226 30.1875C59.9723 30.2209 60.1172 30.2723 60.2544 30.3409L62.9573 31.6924C63.8835 32.1553 64.2589 33.2816 63.7959 34.2079C63.3328 35.1341 62.2065 35.5095 61.2803 35.0464L58.7839 33.7982L52.9275 32.4968C52.5017 32.4021 52.122 32.1619 51.8542 31.8176L47.5639 26.3014L42.3639 25.356C42.2886 25.4181 42.2076 25.4747 42.1215 25.5253L41.0188 27.7303V28.791H43.1983C43.4893 28.791 43.7764 28.8589 44.0368 28.989L49.4426 31.692C50.3689 32.1551 50.7443 33.2813 50.2811 34.2075C49.818 35.1338 48.6917 35.5091 47.7656 35.046L42.7556 32.541H41.0188V35.3966C41.0188 36.432 40.1794 37.2716 39.1438 37.2716C38.1082 37.2716 37.2688 36.432 37.2688 35.3966V30.6804V30.666V30.6518V29.1628H34.9597L29.0509 32.9229L30.0611 38.4793L35.6595 43.4554C36.0596 43.8113 36.2887 44.3213 36.2887 44.8568V59.3743H38.9842V52.6881C38.9842 47.6222 41.814 44.5129 43.3596 43.0408C44.5957 41.8631 46.4527 40.8703 47.2267 40.5212C47.3805 40.1769 47.9049 39.2835 48.7721 38.4632C49.6393 37.6429 50.5397 36.7884 50.8815 36.4637C53.2026 37.7903 55.005 39.1223 55.005 39.1223C55.005 39.1223 57.4073 38.9904 58.4987 38.5511C59.3717 38.1996 60.8936 37.2229 61.5456 36.7785L63.81 38.1467Z"
fill="url(#paint0_linear_51_6698)"
/>
<path d="M28.125 71.25H43.125V67.5H28.125V71.25Z" fill="#60A4F7" />
<path d="M43.125 78.75H28.125V75H43.125V78.75Z" fill="#60A4F7" />
<defs>
<linearGradient
id="paint0_linear_51_6698"
x1="45"
y1="11.25"
x2="45"
y2="63.1217"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#043D82" />
<stop offset="1" stopColor="#60A4F7" />
</linearGradient>
</defs>
</svg>
</>
);
}

View File

@@ -0,0 +1,35 @@
import React from "react";
export default function CardiacSvg() {
return (
<>
<svg
width="90"
height="90"
viewBox="0 0 90 90"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M19.3961 22.4777C16.6587 25.9612 15 30.7207 15 35.6897C15 38.5729 15.4959 41.3316 16.3688 43.9582H32.6535L39.006 32.6647L42.9756 46.5577L47.833 40.3125H60V44.0625H49.6671L41.3995 54.6922L37.869 42.3352L34.8465 47.7082H7.5V43.9582H12.4423C11.6819 41.3357 11.25 38.5747 11.25 35.6897C11.25 29.9235 13.1648 24.3382 16.4475 20.1607C19.7393 15.9717 24.4802 13.125 30.0585 13.125C36.6278 13.125 41.6233 16.8063 45 22.0009C48.3765 16.8066 53.3721 13.125 59.9415 13.125C65.5204 13.125 70.2613 15.9722 73.5529 20.1613C76.8355 24.3392 78.75 29.9244 78.75 35.6897C78.75 48.0319 70.2306 58.3385 62.1705 65.3737C58.0943 68.9315 54.027 71.7478 50.9828 73.6734C49.4588 74.6375 48.1862 75.3815 47.2907 75.8865C46.8428 76.139 46.4888 76.3322 46.2443 76.4632C46.1222 76.5289 46.0273 76.5789 45.9617 76.6132L45.8858 76.6528L45.8646 76.6637L45.8584 76.667L45.8563 76.668C45.8563 76.668 45.855 76.6687 45 75C44.1866 76.6894 44.1861 76.6892 44.1861 76.6892L44.1748 76.6837L44.1488 76.671L44.0541 76.6245C43.9727 76.5842 43.8548 76.5251 43.7033 76.448C43.4003 76.2935 42.9625 76.0657 42.4118 75.767C41.3108 75.1697 39.756 74.2873 37.9234 73.1377C34.2649 70.8427 29.4658 67.463 24.9529 63.1389C22.5456 60.8325 20.2074 58.2457 18.1642 55.3989C17.5604 54.5576 17.753 53.3861 18.5942 52.7824C19.4355 52.1786 20.607 52.3712 21.2108 53.2125C23.0942 55.8365 25.2716 58.251 27.5471 60.4312C31.8203 64.5253 36.3962 67.7529 39.9161 69.9609C41.6728 71.0629 43.1582 71.9057 44.2 72.4708C44.4956 72.6313 44.7555 72.7693 44.9753 72.8842C45.1168 72.8062 45.2749 72.7181 45.4487 72.62C46.2962 72.1421 47.5138 71.4305 48.9782 70.5043C51.9105 68.6494 55.812 65.9462 59.7045 62.5485C67.582 55.6729 75 46.3243 75 35.6897C75 30.7215 73.3416 25.962 70.6043 22.4782C67.876 19.0059 64.1502 16.875 59.9415 16.875C54.1238 16.875 49.6114 20.664 46.683 26.6284L45 30.0564L43.317 26.6284C40.3885 20.6636 35.8761 16.875 30.0585 16.875C25.8503 16.875 22.1244 19.0056 19.3961 22.4777ZM45 75L44.1861 76.6892L45.0261 77.0934L45.8563 76.668L45 75Z"
fill="url(#paint0_linear_51_6649)"
/>
<defs>
<linearGradient
id="paint0_linear_51_6649"
x1="43.125"
y1="13.125"
x2="43.125"
y2="77.0934"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#043D82" />
<stop offset="1" stopColor="#60A4F7" />
</linearGradient>
</defs>
</svg>
</>
);
}

View File

@@ -0,0 +1,26 @@
import {IconsProps} from "@/types/icons/icons.type";
import React from "react";
export default function ChevronLeftSvg({
size,
width = "13",
height = "21",
color = "currentColor",
}: IconsProps) {
return (
<>
<svg
width={size ?? width}
height={size ?? height}
viewBox="0 0 13 21"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M11.0403 21L13 19.1363L3.91932 10.5L13 1.86375L11.0403 1.71319e-07L2.82529e-06 10.5L11.0403 21Z"
fill={color}
/>
</svg>
</>
);
}

View File

@@ -0,0 +1,26 @@
import {IconsProps} from "@/types/icons/icons.type";
import React from "react";
export default function ChevronRightSvg({
size,
width = "13",
height = "21",
color = "currentColor",
}: IconsProps) {
return (
<>
<svg
width={size ?? width}
height={size ?? height}
viewBox="0 0 13 21"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M1.95966 -1.73603e-06L1.67294e-06 1.86375L9.08068 10.5L1.62934e-07 19.1362L1.95966 21L13 10.5L1.95966 -1.73603e-06Z"
fill={color}
/>
</svg>
</>
);
}

View File

@@ -0,0 +1,35 @@
import React from "react";
export default function DigestiveSvg() {
return (
<>
<svg
width="90"
height="90"
viewBox="0 0 90 90"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M33.75 57.5757C32.0214 58.291 30.066 58.8025 27.5409 58.8025C24.0986 58.8025 22.9609 61.5557 21.7517 64.4819C20.3807 67.7999 18.9178 71.3399 13.8996 71.3399C4.45563 71.3399 6.78588 42.2773 12.4109 31.0273C18.036 19.7773 25.7334 18.8398 41.4735 18.8398C51.1153 18.8398 53.5603 20.3098 55.4546 21.4491C56.6529 22.1697 57.6307 22.7577 60.0701 22.7577C62.5884 22.7577 66.1142 22.0054 69.6399 21.2532C74.9286 20.1248 80.2172 18.9966 82.1059 20.407C85.2538 22.7577 75.81 39.9964 66.366 39.9964C61.5051 39.9964 58.5902 43.4811 55.761 46.8632C53.0936 50.052 50.5026 53.1495 46.4287 53.1495C42.5061 53.1495 39.9581 54.3839 37.5 55.699V74.1524H33.75V57.5757ZM16.2992 66.7609C15.8866 67.1835 15.2935 67.5899 13.8996 67.5899H13.8953C13.7966 67.5899 13.7204 67.5899 13.525 67.3973C13.2458 67.1224 12.831 66.5189 12.4288 65.377C11.6195 63.0797 11.2037 59.602 11.2541 55.4477C11.3552 47.1175 13.2904 37.6534 15.765 32.7043C18.2317 27.7708 20.8933 25.5021 24.4101 24.2464C28.2956 22.8591 33.5006 22.5898 41.4735 22.5898C42.0671 22.5898 42.6291 22.5957 43.161 22.6065C41.5052 24.7236 40.6029 27.0495 40.1188 29.0663C39.7309 30.6833 39.6022 32.1332 39.57 33.1815C39.5537 33.7075 39.5617 34.1372 39.5743 34.4428C39.5807 34.5957 39.5882 34.7177 39.5946 34.8057L39.6 34.8788L39.6028 34.9116L39.6058 34.9446L39.6069 34.9559L39.6075 34.9622C39.6075 34.9622 39.6077 34.9639 41.4733 34.7773C43.3391 34.5908 43.3391 34.5921 43.3391 34.5921L43.3348 34.5358C43.3311 34.4843 43.3258 34.4005 43.3211 34.2878C43.3117 34.0622 43.305 33.723 43.3181 33.2968C43.3446 32.4407 43.4503 31.254 43.7653 29.9413C44.3331 27.5755 45.5503 24.903 48.1211 22.9339C50.7096 23.265 51.8895 23.7672 52.5911 24.13C52.9056 24.2925 53.1714 24.4523 53.5316 24.6685L53.6398 24.7335C54.0259 24.9651 54.5527 25.2792 55.1711 25.56C56.5431 26.1829 58.0517 26.5077 60.0701 26.5077C62.0233 26.5077 64.2876 26.1525 66.4303 25.7432C67.7194 25.4968 69.135 25.1952 70.5011 24.904C71.375 24.7178 72.2295 24.5357 73.0168 24.3754C75.1691 23.937 77.0164 23.6173 78.4597 23.5249C78.5321 23.5202 78.6022 23.5163 78.6699 23.5129C78.1989 24.9932 77.2335 26.9616 75.8625 28.9665C74.4544 31.0257 72.7489 32.9322 70.976 34.2859C69.1695 35.6657 67.5965 36.2464 66.366 36.2464C59.7589 36.2464 55.8367 40.9311 53.2404 44.0322L52.9948 44.3254C51.5998 45.9912 50.5416 47.2547 49.3993 48.1785C48.3292 49.0439 47.4306 49.3995 46.4287 49.3995C42.6056 49.3995 39.7897 50.3877 37.5 51.4855V43.2148C37.5 42.4737 37.8656 41.7827 38.5003 41.2274C39.1704 40.641 39.9191 40.4023 40.3125 40.4023V36.6523C38.8309 36.6523 37.2358 37.351 36.0309 38.4053C34.8238 39.4615 33.8059 41.0554 33.7522 43.0495H24.201C19.7211 43.0495 14.3453 45.021 19.7211 48.9629C23.6207 51.8222 30.3487 49.5467 33.75 48.0812V53.4426C31.8396 54.4099 30.1035 55.0525 27.5409 55.0525C24.3529 55.0525 22.1256 56.5375 20.6434 58.5051C19.5534 59.952 18.8025 61.7849 18.265 63.097C18.2554 63.1204 18.2458 63.1439 18.2364 63.1669C18.1704 63.328 18.1076 63.4808 18.0479 63.6235C17.384 65.2099 16.8915 66.1544 16.2992 66.7609Z"
fill="url(#paint0_linear_51_6677)"
/>
<defs>
<linearGradient
id="paint0_linear_51_6677"
x1="45.1117"
y1="18.8398"
x2="45.1117"
y2="74.1524"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#043D82" />
<stop offset="1" stopColor="#60A4F7" />
</linearGradient>
</defs>
</svg>
</>
);
}

View File

@@ -0,0 +1,35 @@
import React from "react";
export default function EntSvg() {
return (
<>
<svg
width="90"
height="90"
viewBox="0 0 90 90"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M44.9998 13.125C32.7328 13.125 22.7884 22.3592 22.7884 33.75H18.75C18.75 20.2881 30.5025 9.375 44.9998 9.375C59.4971 9.375 71.2496 20.2881 71.2496 33.75C71.2496 42.1898 66.6287 49.6264 59.6175 53.9987C54.8325 56.9828 51.0574 60.9516 51.0574 65.4587V65.625C51.0574 73.9093 43.8251 80.625 34.9037 80.625C25.9823 80.625 18.75 73.9093 18.75 65.625V61.875H22.7884V65.625C22.7884 71.8382 28.2126 76.875 34.9037 76.875C41.5948 76.875 47.019 71.8382 47.019 65.625V65.4587C47.019 58.9761 52.3258 54.0287 57.366 50.8856C63.3079 47.1801 67.2111 40.888 67.2111 33.75C67.2111 22.3592 57.2668 13.125 44.9998 13.125ZM35.7915 31.9116C36.51 28.7149 39.4731 26.25 43.125 26.25C47.3321 26.25 50.625 29.5213 50.625 33.4142H54.375C54.375 27.3225 49.2731 22.5 43.125 22.5C36.9769 22.5 31.875 27.3225 31.875 33.4142C31.875 36.4879 33.0726 38.9462 35.6603 40.3665C37.065 41.1375 38.0049 41.7928 38.5778 42.3188C38.7182 42.4476 38.8239 42.5571 38.9033 42.6471C38.5569 42.8106 37.9935 42.9966 37.1477 43.1584L37.8523 46.8416C39.1129 46.6005 40.2816 46.2416 41.169 45.6726C42.0949 45.079 42.9803 44.0507 42.8601 42.5811C42.7579 41.331 41.9432 40.3176 41.1137 39.5561C40.2278 38.7428 38.9964 37.9198 37.4648 37.0791C36.8618 36.7481 36.3893 36.3079 36.0741 35.6839C37.3729 35.7698 38.9739 35.9689 40.5508 36.4003C42.3191 36.8841 43.9206 37.623 45.0566 38.6935C46.1222 39.6975 46.8549 41.0584 46.8746 43.0568C46.6322 45.6101 46.0273 47.2588 45.3368 48.327C44.6554 49.3808 43.8351 49.9583 42.984 50.2931C42.0994 50.6413 41.1229 50.7484 40.1402 50.7484C39.6521 50.7484 39.1851 50.7225 38.7332 50.6936L38.5613 50.6826C38.1861 50.658 37.7766 50.6314 37.4321 50.6314C35.6516 50.6314 34.7498 52.0101 34.3333 52.8201C34.0449 53.3809 33.7603 54.1466 33.516 54.8042C33.4125 55.0825 33.3161 55.3414 33.2299 55.557C32.8744 56.4461 32.5294 57.0955 32.1143 57.523C31.7689 57.8788 31.3378 58.125 30.5837 58.125C29.5868 58.125 29.0694 57.9004 28.8066 57.7206C28.548 57.5438 28.386 57.3086 28.2786 57.0145C28.1638 56.7008 28.125 56.3505 28.125 56.0483C28.125 55.9037 28.1338 55.7865 28.1417 55.7125C28.1454 55.6759 28.1488 55.6511 28.1505 55.6403C28.1511 55.6365 28.1513 55.6345 28.1513 55.6345L28.1505 55.6403L28.1492 55.6466L28.1486 55.65C28.1484 55.651 28.1479 55.6536 26.3034 55.3165C24.459 54.9793 24.4588 54.9803 24.4586 54.9814L24.4583 54.9835L24.4575 54.988L24.4556 54.9983L24.4513 55.0245C24.4479 55.0444 24.4442 55.0688 24.4399 55.0978C24.4314 55.1556 24.4215 55.2315 24.4119 55.323C24.3928 55.5049 24.375 55.7537 24.375 56.0483C24.375 56.6243 24.4431 57.4448 24.7566 58.302C25.077 59.1788 25.6641 60.1146 26.6897 60.8158C27.7106 61.5143 29.0126 61.875 30.5837 61.875C32.3978 61.875 33.7858 61.1845 34.8047 60.1354C35.754 59.1578 36.3184 57.9336 36.7119 56.9492C36.8918 56.4994 37.0298 56.1246 37.1496 55.7985C37.3358 55.2923 37.4788 54.9036 37.6684 54.5344C37.6978 54.4774 37.7239 54.4298 37.7468 54.3904C37.9022 54.3979 38.0852 54.4097 38.3091 54.4241L38.4945 54.4361C38.9606 54.4658 39.5267 54.4984 40.1402 54.4984C41.3604 54.4984 42.8612 54.3715 44.3571 53.7827C45.8867 53.181 47.3503 52.1194 48.4858 50.3629C49.6041 48.6332 50.3428 46.326 50.6173 43.3091C50.6224 43.2527 50.625 43.1961 50.625 43.1393C50.625 40.0309 49.4372 37.6686 47.6282 35.9642C45.8751 34.3123 43.6241 33.3533 41.5403 32.7833C39.4399 32.2086 37.3689 31.9915 35.8436 31.9142C35.8262 31.9133 35.8089 31.9125 35.7915 31.9116ZM37.8606 54.2235C37.8606 54.2245 37.8549 54.2316 37.8435 54.2423C37.8548 54.228 37.8606 54.2228 37.8606 54.2235Z"
fill="url(#paint0_linear_51_6719)"
/>
<defs>
<linearGradient
id="paint0_linear_51_6719"
x1="44.9998"
y1="9.375"
x2="44.9998"
y2="80.625"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#043D82" />
<stop offset="1" stopColor="#60A4F7" />
</linearGradient>
</defs>
</svg>
</>
);
}

View File

@@ -0,0 +1,59 @@
import React from "react";
export default function HysterectomySvg() {
return (
<>
<svg
width="90"
height="90"
viewBox="0 0 48 48"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M6.25587 15.1285C5.76466 14.341 6.01569 13.4525 6.81625 12.724C7.20603 12.3693 7.65852 12.132 8.04887 12.0412C8.44855 11.9482 8.65047 12.0303 8.73192 12.0956C10.5383 13.5436 11.7076 13.9187 12.7265 14.0078C13.0164 14.0331 13.2354 14.0401 13.4139 14.0458C13.8586 14.0599 14.0515 14.0661 14.4605 14.3283L15.5401 12.6447C14.6269 12.0592 13.807 12.0415 13.2427 12.0293C13.115 12.0265 13.0004 12.0241 12.9007 12.0154C12.3679 11.9688 11.5622 11.8011 9.98283 10.5351C9.25847 9.95444 8.35213 9.91718 7.5956 10.0932C6.82974 10.2714 6.07806 10.6916 5.47019 11.2448C4.27545 12.3319 3.3573 14.2606 4.55893 16.187C5.17971 17.1821 5.86889 18.0365 6.50435 18.7285C6.59552 18.5574 6.71267 18.4007 6.85662 18.2619C7.2197 17.912 7.70794 17.7201 8.25956 17.6755C7.61731 17.0094 6.89203 16.1483 6.25587 15.1285Z"
fill="url(#paint0_linear_51_6677)"
/>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M12.447 23.0879C12.3517 22.6573 12.0439 22.0735 11.455 21.5307C10.8661 20.9878 10.24 20.7108 9.78109 20.6306C9.52663 20.5861 9.39247 20.6068 9.33458 20.6242C9.31744 20.6791 9.2985 20.806 9.35136 21.0448C9.4467 21.4754 9.75448 22.0592 10.3434 22.602C10.9323 23.1448 11.5584 23.4218 12.0173 23.502C12.2717 23.5465 12.4059 23.5258 12.4638 23.5085C12.4809 23.4535 12.4999 23.3267 12.447 23.0879ZM13.9417 24.8708C15.044 23.8084 14.5753 21.6916 12.895 20.1427C11.2146 18.5939 8.95887 18.1995 7.85662 19.2619C6.75436 20.3243 7.22301 22.4411 8.90337 23.9899C10.5837 25.5388 12.8395 25.9331 13.9417 24.8708Z"
fill="url(#paint0_linear_51_6677)"
/>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M41.7441 15.1285C42.2353 14.341 41.9843 13.4525 41.1837 12.724C40.794 12.3693 40.3415 12.132 39.9511 12.0412C39.5514 11.9482 39.3495 12.0303 39.2681 12.0956C37.4617 13.5436 36.2924 13.9187 35.2735 14.0078C34.9836 14.0331 34.7646 14.0401 34.5861 14.0458C34.1414 14.0599 33.9485 14.0661 33.5395 14.3283L32.4599 12.6447C33.3731 12.0592 34.193 12.0415 34.7573 12.0293C34.885 12.0265 34.9996 12.0241 35.0993 12.0154C35.6321 11.9688 36.4378 11.8011 38.0172 10.5351C38.7415 9.95444 39.6479 9.91718 40.4044 10.0932C41.1703 10.2714 41.9219 10.6916 42.5298 11.2448C43.7245 12.3319 44.6427 14.2606 43.4411 16.187C42.8072 17.2031 42.1021 18.0724 41.4556 18.7719C41.3615 18.5839 41.2369 18.4123 41.0809 18.2619C40.7305 17.9242 40.2635 17.7337 39.7354 17.6807C40.3789 17.0139 41.1063 16.151 41.7441 15.1285Z"
fill="url(#paint0_linear_51_6677)"
/>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M35.4905 23.0879C35.5858 22.6573 35.8936 22.0735 36.4825 21.5307C37.0714 20.9878 37.6975 20.7108 38.1564 20.6306C38.4109 20.5861 38.545 20.6068 38.6029 20.6242C38.6201 20.6791 38.639 20.806 38.5861 21.0448C38.4908 21.4754 38.183 22.0592 37.5941 22.602C37.0052 23.1448 36.3791 23.4218 35.9202 23.502C35.6658 23.5465 35.5316 23.5258 35.4737 23.5085C35.4566 23.4535 35.4376 23.3267 35.4905 23.0879ZM33.9958 24.8708C32.8935 23.8084 33.3622 21.6916 35.0425 20.1427C36.7229 18.5939 38.9786 18.1995 40.0809 19.2619C41.1831 20.3243 40.7145 22.4411 39.0341 23.9899C37.3538 25.5388 35.098 25.9331 33.9958 24.8708Z"
fill="url(#paint0_linear_51_6677)"
/>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M18.6615 19.2121C19.0946 20.1648 19.6455 20.9427 20.0524 21.3516C20.7975 22.1005 21.1419 23.3039 21.3451 24.4744C21.5576 25.6984 21.6533 27.1488 21.7307 28.602C21.746 28.8887 21.7605 29.1757 21.7751 29.4622C21.8354 30.651 21.8952 31.8308 22.003 32.9412C22.0987 33.9264 22.2286 34.8112 22.4144 35.5565C22.5438 35.4444 22.6841 35.325 22.8046 35.2323C22.9359 35.1312 23.0962 35.018 23.2732 34.9271C23.4413 34.8409 23.6997 34.7349 24.0101 34.7349C24.3268 34.7349 24.5873 34.8447 24.761 34.9399C24.9399 35.038 25.0959 35.1593 25.2196 35.2654C25.2597 35.2997 25.3008 35.3366 25.3422 35.3748C25.4633 34.7055 25.5308 33.9374 25.5657 33.0886C25.6023 32.1966 25.6021 31.2743 25.6018 30.3261C25.6017 29.8539 25.6016 29.3753 25.606 28.8909C25.619 27.4684 25.672 26.0202 25.9061 24.7409C26.1377 23.4749 26.5698 22.2355 27.4493 21.3516C28.0464 20.7516 28.7127 19.87 29.2168 18.8922C29.7261 17.9044 30.0252 16.9055 29.9983 16.0509C29.9732 15.2501 29.6681 14.5574 28.8742 14.0222C28.0237 13.4488 26.5251 13 24.0101 13C21.5094 13 20.0285 13.4845 19.183 14.0954C18.3806 14.6752 18.0506 15.4404 18.0054 16.316C17.9581 17.2306 18.2283 18.2592 18.6615 19.2121Z"
fill="url(#paint0_linear_51_6677)"
/>
<defs>
<linearGradient
id="paint0_linear_51_6677"
x1="24"
y1="11"
x2="24"
y2="38"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#043D82" />
<stop offset="1" stopColor="#60A4F7" />
</linearGradient>
</defs>
</svg>
</>
);
}

View File

@@ -0,0 +1,35 @@
import React from "react";
export default function OrthopedicSvg() {
return (
<>
<svg
width="90"
height="90"
viewBox="0 0 48 48"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M20 4C20.5523 4 21 4.44772 21 5V13.3431C21 14.6692 20.4732 15.941 19.5355 16.8787L19.0317 17.3826C18.1384 18.2758 18.1384 19.7242 19.0317 20.6174C19.7279 21.3136 20.7914 21.4862 21.6721 21.0459L21.9145 20.9247C23.2273 20.2683 24.7727 20.2683 26.0855 20.9247L26.3279 21.0459C27.2086 21.4862 28.2721 21.3136 28.9683 20.6174C29.8616 19.7242 29.8616 18.2758 28.9683 17.3826L28.4645 16.8787C27.5268 15.941 27 14.6692 27 13.3431V5C27 4.44772 27.4477 4 28 4C28.5523 4 29 4.44772 29 5V6.70355C36.5086 8.87023 42 15.7938 42 24C42 32.2062 36.5086 39.1298 29 41.2965V43C29 43.5523 28.5523 44 28 44C27.4477 44 27 43.5523 27 43V34.6569C27 33.3308 27.5268 32.059 28.4645 31.1213L28.9683 30.6174C29.8616 29.7242 29.8616 28.2758 28.9683 27.3826C28.2721 26.6864 27.2086 26.5138 26.3279 26.9541L26.0855 27.0753C24.7727 27.7317 23.2273 27.7317 21.9145 27.0753L21.6721 26.9541C20.7914 26.5138 19.7279 26.6864 19.0317 27.3826C18.1384 28.2758 18.1384 29.7242 19.0317 30.6174L19.5355 31.1213C20.4732 32.059 21 33.3308 21 34.6569V43C21 43.5523 20.5523 44 20 44C19.4477 44 19 43.5523 19 43V41.2965C11.4914 39.1298 6 32.2062 6 24C6 15.7938 11.4914 8.87023 19 6.70355V5C19 4.44772 19.4477 4 20 4ZM19 8.79677C12.6121 10.8964 8 16.9096 8 24C8 31.0905 12.6121 37.1037 19 39.2033V34.6569C19 33.8612 18.6839 33.0981 18.1213 32.5355L17.6174 32.0317C15.9431 30.3573 15.9431 27.6427 17.6174 25.9683C18.9224 24.6634 20.9159 24.3399 22.5665 25.1652L22.8089 25.2864C23.5587 25.6613 24.4413 25.6613 25.1911 25.2864L25.4335 25.1652C27.0841 24.3399 29.0776 24.6634 30.3826 25.9683C32.0569 27.6427 32.0569 30.3573 30.3826 32.0317L29.8787 32.5355C29.3161 33.0981 29 33.8612 29 34.6569V39.2033C35.3879 37.1037 40 31.0905 40 24C40 16.9096 35.3879 10.8964 29 8.79677V13.3431C29 14.1388 29.3161 14.9019 29.8787 15.4645L30.3826 15.9683C32.0569 17.6427 32.0569 20.3573 30.3826 22.0317C29.0776 23.3366 27.0841 23.6601 25.4335 22.8348L25.1911 22.7136C24.4413 22.3387 23.5587 22.3387 22.8089 22.7136L22.5665 22.8348C20.9159 23.6601 18.9224 23.3366 17.6174 22.0317C15.9431 20.3573 15.9431 17.6427 17.6174 15.9683L18.1213 15.4645C18.6839 14.9019 19 14.1388 19 13.3431V8.79677Z"
fill="url(#paint0_linear_51_6677)"
/>
<defs>
<linearGradient
id="paint0_linear_51_6677"
x1="24"
y1="4"
x2="24"
y2="44"
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#043D82" />
<stop offset="1" stopColor="#60A4F7" />
</linearGradient>
</defs>
</svg>
</>
);
}

View File

@@ -0,0 +1,9 @@
import React from 'react'
export default function SelectDoctor() {
return (
<>
</>
)
}

View File

@@ -0,0 +1,26 @@
import {IconsProps} from "@/types/icons/icons.type";
import React from "react";
export default function TelephoneSvg({
size = "24",
width,
height,
color = "currentColor",
}: IconsProps) {
return (
<>
<svg
width={size ?? width}
height={size ?? height}
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M19.95 21C20.25 21 20.5 20.9 20.7 20.7C20.9 20.5 21 20.25 21 19.95V15.9C21 15.6833 20.925 15.4875 20.775 15.3125C20.625 15.1375 20.4333 15.0167 20.2 14.95L16.75 14.25C16.5167 14.2167 16.2792 14.2375 16.0375 14.3125C15.7958 14.3875 15.6 14.5 15.45 14.65L13.1 17C12.4667 16.6333 11.8667 16.2292 11.3 15.7875C10.7333 15.3458 10.1917 14.8667 9.675 14.35C9.125 13.8167 8.62083 13.2625 8.1625 12.6875C7.70417 12.1125 7.30833 11.5167 6.975 10.9L9.4 8.45C9.53333 8.31667 9.625 8.15833 9.675 7.975C9.725 7.79167 9.73333 7.56667 9.7 7.3L9.05 3.8C9.01667 3.58333 8.90833 3.39583 8.725 3.2375C8.54167 3.07917 8.33333 3 8.1 3H4.05C3.75 3 3.5 3.1 3.3 3.3C3.1 3.5 3 3.75 3 4.05C3 6.13333 3.45417 8.19167 4.3625 10.225C5.27083 12.2583 6.55833 14.1083 8.225 15.775C9.89167 17.4417 11.7417 18.7292 13.775 19.6375C15.8083 20.5458 17.8667 21 19.95 21ZM6.05 9C5.76667 8.35 5.55 7.69167 5.4 7.025C5.25 6.35833 5.13333 5.68333 5.05 5H7.25L7.7 7.35L6.05 9ZM15 17.9L16.65 16.25L19 16.75V18.95C18.3167 18.9 17.6417 18.7833 16.975 18.6C16.3083 18.4167 15.65 18.1833 15 17.9Z"
fill={color}
/>
</svg>
</>
);
}

View File

@@ -0,0 +1,66 @@
import React from "react";
import CustomLink from "../global/CustomLink";
import ChevronLeftSvg from "../icons/ChevronLeftSvg";
import { getHref } from "@/utils/functions";
import { MenuItemsTypes } from "@/types/global/menu.type";
interface MenuProps {
lang: string;
direction?: "horizontal" | "vertical";
items: MenuItemsTypes[];
}
export default function Menu({
lang,
direction = "horizontal",
items,
}: MenuProps) {
return (
<nav className="flex items-center h-full">
<ul
className={`h-full text-primary flex lg:text-base relative items-center text-blue-primary ${
direction === "horizontal" ? "flex-row gap-x-6" : "flex-col gap-y-4"
}`}
>
{items.map((link) => (
<li
key={link.id}
className="group cursor-pointer hover:text-secondary flex items-center text-menu-colors relative !h-full after:hidden hover:after:inline-block after:w-full after:h-1 after:bg-secondary after:absolute after:bottom-0 after:left-0 after:rounded-t-xl"
>
<span className="flex items-center gap-x-2 !h-full ">
<CustomLink
href={getHref(link.href,lang)}
label={link.label[lang]}
className={`font-medium transition-all `}
/>
{link.sub.length > 0 ? (
<span className="-rotate-90 group-hover:rotate-90 transition-all duration-300">
<ChevronLeftSvg size="10" />
</span>
) : (
""
)}
</span>
{link.sub.length > 0 && (
<ul className="hidden group-hover:block absolute top-full z-20 bg-white w-64 shadow-inner space-y-5 p-3 rounded-b-xl">
{link.sub.map((submenu) => (
<li
key={submenu.id}
className="w-full text-blue-primary hover:font-medium p-1 px-3"
>
<CustomLink
href={getHref(submenu.href,lang)}
label={submenu.label[lang]}
className="text-sm font-medium text-black hover:text-secondary transition-all"
/>
</li>
))}
</ul>
)}
</li>
))}
</ul>
</nav>
);
}

View File

@@ -0,0 +1,42 @@
"use client";
import React, {useState} from "react";
export default function MobileMenu() {
const [open, setOpen] = useState(false);
console.log(open);
return (
<>
<button
type="button"
className="lg:hidden block text-blue-primary"
onClick={()=>setOpen(!open)}
>
<svg
stroke="currentColor"
fill="none"
strokeWidth="0"
viewBox="0 0 15 15"
height="35"
width="35"
xmlns="http://www.w3.org/2000/svg"
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M1.5 3C1.22386 3 1 3.22386 1 3.5C1 3.77614 1.22386 4 1.5 4H13.5C13.7761 4 14 3.77614 14 3.5C14 3.22386 13.7761 3 13.5 3H1.5ZM1 7.5C1 7.22386 1.22386 7 1.5 7H13.5C13.7761 7 14 7.22386 14 7.5C14 7.77614 13.7761 8 13.5 8H1.5C1.22386 8 1 7.77614 1 7.5ZM1 11.5C1 11.2239 1.22386 11 1.5 11H13.5C13.7761 11 14 11.2239 14 11.5C14 11.7761 13.7761 12 13.5 12H1.5C1.22386 12 1 11.7761 1 11.5Z"
fill="currentColor"
></path>
</svg>
</button>
{open && (
<div className="lg:hidden fixed top-0 right-0 z-50 bg-black/30 backdrop-blur-sm w-full h-full" onClick={(e)=>{
e.stopPropagation();
e.preventDefault();
setOpen(!open)
}}>
<div className={`absolute top-0 right-0 h-full ${open ? 'w-[80%]' : 'w-0'} bg-white transition-all duration-300`}></div>
</div>
)}
</>
);
}

View File

@@ -0,0 +1,103 @@
"use client";
import React, {useEffect, useState} from "react";
import Menu from "../menu/Menu";
import {DefaultMenuLinks, Menu_buttons} from "@/constants/menu/menu.const";
import Link from "next/link";
import Image from "next/image";
import CustomLink from "../global/CustomLink";
import {languages_types} from "@/types";
import MobileMenu from "../menu/MobileMenu";
import {getHref} from "@/utils/functions";
export default function TopMenu({lang}: {lang: string}) {
const [isSticky, setIsSticky] = useState(false);
useEffect(() => {
const handleScroll = () => {
if (window.scrollY > 50) {
setIsSticky(true);
} else {
setIsSticky(false);
}
};
window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
}, []);
return (
<div
className={`w-full z-50 transition-all duration-300 container flex lg:justify-around justify-between items-center
${
isSticky
? "h-[80px] lg:fixed top-0 custom-shadow backdrop-blur-3xl bg-white/80"
: "lg:h-[120px] h-[60px] bg-white relative"
}`}
// className="bg-white container sticky top-0 z-30"
>
{/* <div className="top-0 absolute h-[40px] bg-radial bg-secondary/30 backdrop-blur-2xl w-full">
</div> */}
<div className="lg:w-[210px] flex gap-x-10 transition-all duration-300 items-center ">
<Link href={"/"} className="flex items-center gap-x-2">
<div
className={`relative ${
isSticky
? " h-[70px] w-[70px]"
: "lg:h-[90px] h-[50px] lg:w-[97px] w-[40px]"
}`}
>
<Image
loading="lazy"
src="/shomalhospital-ipd-logo.png"
fill
alt="shomal hospital"
style={{color: "transparent", fill: "red", objectFit: "fill"}}
/>
</div>
</Link>
</div>
<MobileMenu />
<div className="lg:grid hidden grid-cols-12 gap-x-1 w-full h-full items-center">
<div className="col-span-8 flex items-center justify-center w-full h-full">
<Menu
lang={lang}
direction="horizontal"
items={DefaultMenuLinks}
/>
</div>
<div className="col-span-4 flex items-center justify-center gap-x-5">
{/* <a
href="tel:0114492"
className="text-white relative group flex items-end hover:bg-blue-primary p-3 hover:text-white transition-all rounded-xl"
>
<span className="hidden group-hover:block absolute left-3 h-[24px] w-[24px] animate-ping rounded-xl bg-white opacity-35"></span>
<span className="font-bold text-xl">
{toPersianNumber("011-4492")}
</span>
<span className="group-hover:animate-pulse">
<TelephoneSvg size="28" />
</span>
</a> */}
{/* <Dropdown options={site_languages} /> */}
<CustomLink
href={getHref("/contact-us#request_accept", lang)}
label={Menu_buttons.request_to_accept[lang as languages_types] || ""}
className={`bg-blue-primary text-white rounded-full ${
isSticky ? "py-4 px-4" : "py-4 px-6"
} text-sm font-semibold shadow-lg flex items-center whitespace-nowrap shadow-neutral-300 hover:shadow-none transition-all duration-200`}
/>
<CustomLink
href={getHref("/upload-documents", lang)}
label={Menu_buttons.upload_document[lang as languages_types] || ""}
className={`bg-secondary text-white rounded-full ${
isSticky ? "py-4 px-4" : "py-4 px-6"
} text-sm font-semibold shadow-lg flex items-center whitespace-nowrap shadow-neutral-300 hover:shadow-none transition-all duration-200`}
/>
</div>
</div>
</div>
);
}

View File

@@ -0,0 +1,80 @@
"use client";
import {useRouter, useSearchParams} from "next/navigation";
import React, {useState} from "react";
import CustomSelect from "../components/global/CustomSelect";
import {Expertises} from "@/constants";
import {languages_types} from "@/types";
export default function DoctorsFilterBox({
lang,
defaultName,
defaultExpertise,
dict,
}: {
lang: languages_types;
defaultName: string;
defaultExpertise: string;
dict: {
search: string;
search_by_name: string;
select_this: string;
};
}) {
const [name, setName] = useState(defaultName);
const [expertise, setExpertise] = useState(defaultExpertise);
const router = useRouter();
const params = useSearchParams();
const applyFilters = () => {
const p = new URLSearchParams(params);
if (name) p.set("name", name);
else p.delete("name");
if (expertise) p.set("expertise", expertise);
else p.delete("expertise");
router.replace(`?${p.toString()}`);
};
const options = Expertises.map((item) => ({
label: item.name[lang],
value: item.id.toString(),
}));
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
onChange={setExpertise} // returns string
options={options}
className="bg-white"
isClearable
placeholder={dict.select_this}
/>
</div>
<div className="col-span-3">
<button
type="button"
onClick={applyFilters}
className="bg-blue-primary text-white font-medium w-full h-full rounded-2xl cursor-pointer"
>
{dict.search}
</button>
</div>
</div>
</>
);
}

View File

@@ -0,0 +1,222 @@
"use client";
import React, {useState} from "react";
import CustomSelect from "../components/global/CustomSelect";
import {all_countries} from "@/constants";
import { generateIPDReceptionCode } from "@/utils/functions";
interface PatientAcceptFormValues {
first_name: string;
last_name: string;
email: string;
phone_number: string;
age: string;
country: string;
country_code: string;
service: string;
message: string;
}
interface PatientAcceptFormProps {
lang: string;
dict: {
form: {
fields: {
first_name: string;
last_name: string;
phone_number: string;
email: string;
age: string;
country: string;
services: string;
message: string;
};
buttons: {
send_whatsapp: string;
send_email: string;
};
};
};
}
function PatientAcceptForm({lang, dict}: PatientAcceptFormProps) {
const [formData, setFormData] = useState<PatientAcceptFormValues>({
first_name: "",
last_name: "",
email: "",
phone_number: "",
age: "",
country: "",
country_code: "",
service: "",
message: "",
});
const sendToWhatsApp = (formData: PatientAcceptFormValues) => {
const phone = "9112211874"; // بدون + و با کد کشور
const message =
`درخواست پذیرش جدید ثبت شد:\n` +
`شناسه تولید شده: ${generateIPDReceptionCode()}\n` +
`نام: ${formData.first_name}\n` +
`نام خانوادگی: ${formData.last_name}\n` +
`سن: ${formData.age ?? "وارد نشده است"}\n` +
`ایمیل: ${formData.email ?? "وارد نشده است"}\n` +
`شماره تماس: ${formData.phone_number ?? "وارد نشده است"}\n` +
`کشور: ${formData.country ?? "وارد نشده است"}\n` +
`کد کشور: ${formData.country_code ?? "وارد نشده است"}\n` +
// `سرویس: ${formData.service}\n` +
`توضیحات: ${formData.message ?? "وارد نشده است"}\n`;
const encoded = encodeURIComponent(message);
window.open(`https://wa.me/${phone}?text=${encoded}`, "_blank");
};
const sendToEmail = (formData: PatientAcceptFormValues) => {
const email = "mojtaba5269@gmail.com";
const subject = "درخواست پذیرش جدید";
const message =
`درخواست پذیرش جدید ثبت شد:\n` +
`شناسه تولید شده: ${generateIPDReceptionCode()}\n` +
`نام: ${formData.first_name}\n` +
`نام خانوادگی: ${formData.last_name}\n` +
`سن: ${formData.age ?? "وارد نشده است"}\n` +
`ایمیل: ${formData.email ?? "وارد نشده است"}\n` +
`شماره تماس: ${formData.phone_number ?? "وارد نشده است"}\n` +
`کشور: ${formData.country ?? "وارد نشده است"}\n` +
`کد کشور: ${formData.country_code ?? "وارد نشده است"}\n` +
// `سرویس: ${formData.service}\n` +
`توضیحات: ${formData.message ?? "وارد نشده است"}\n`;
const mailto = `mailto:${email}?subject=${encodeURIComponent(
subject
)}&body=${encodeURIComponent(message)}`;
window.location.href = mailto;
};
return (
<>
<div className="grid grid-cols-2 gap-5 w-full mt-10">
<div className="lg:col-span-1 col-span-2">
<input
type="text"
value={formData.first_name}
onChange={(e) =>
setFormData((prev) => ({...prev, first_name: e.target.value}))
}
placeholder={dict?.form?.fields?.first_name}
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
/>
</div>
<div className="lg:col-span-1 col-span-2">
<input
type="text"
value={formData.last_name}
onChange={(e) =>
setFormData((prev) => ({...prev, last_name: e.target.value}))
}
placeholder={dict?.form?.fields?.last_name}
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
/>
</div>
<div className="lg:col-span-1 col-span-2">
<input
type="text"
value={formData.phone_number}
onChange={(e) =>
setFormData((prev) => ({...prev, phone_number: e.target.value}))
}
placeholder={dict?.form?.fields?.phone_number}
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
/>
</div>
<div className="lg:col-span-1 col-span-2">
<input
type="text"
value={formData.email}
onChange={(e) =>
setFormData((prev) => ({...prev, email: e.target.value}))
}
placeholder={dict?.form?.fields?.email}
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
/>
</div>
<div className="lg:col-span-1 col-span-2">
<input
type="text"
value={formData.age}
onChange={(e) =>
setFormData((prev) => ({...prev, age: e.target.value}))
}
placeholder={dict?.form?.fields?.age}
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
/>
</div>
<div className="lg:col-span-1 col-span-2">
<CustomSelect
options={all_countries}
value={formData.country}
onChange={(value: string) =>
setFormData((prev) => ({
...prev,
country: value,
country_code: all_countries.find(
(c) => c.value === value
)?.code || "",
}))
}
placeholder={dict.form.fields.country}
isClearable
className="w-full"
rtl
/>
</div>
<div className="lg:col-span-2 col-span-2">
{/* <input
type="text"
placeholder={dict?.form?.fields?.services}
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
/> */}
{/* <CustomSelect
options={[
{value: "a", label: "گزینه A"},
{value: "b", label: "گزینه B"},
]}
value={formData.service}
onChange={(value: string) =>
setFormData((prev) => ({...prev, service: value}))
}
placeholder={dict.form.fields.services}
isClearable
className="w-full"
rtl
/> */}
</div>
<div className="col-span-2">
<textarea
rows={8}
value={formData.message}
onChange={(e) =>
setFormData((prev) => ({...prev, message: e.target.value}))
}
placeholder={dict?.form?.fields?.message}
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
></textarea>
</div>
<div className="col-span-2 grid grid-cols-2 gap-3">
<button
type="button"
onClick={() => sendToWhatsApp(formData)}
className="lg:col-span-1 col-span-2 bg-secondary text-white rounded-full py-4 lg:px-10 px-3 font-semibold shadow-lg shadow-neutral-300 hover:shadow-none transition-all duration-200 flex flex-1 justify-center lg:text-base text-sm"
>
{dict?.form?.buttons?.send_whatsapp}
</button>
<button
onClick={() => sendToEmail(formData)}
className="lg:col-span-1 col-span-2 bg-secondary text-white rounded-full py-4 lg:px-10 px-3 font-semibold shadow-lg shadow-neutral-300 hover:shadow-none transition-all duration-200 flex flex-1 justify-center lg:text-base text-sm"
>
{dict?.form?.buttons?.send_email}
</button>
</div>
</div>
</>
);
}
export default PatientAcceptForm;

View File

@@ -0,0 +1,198 @@
"use client";
import React, {useState} from "react";
import CustomSelect from "../components/global/CustomSelect";
import {all_countries} from "@/constants";
import {generateIPDConsultantCode} from "@/utils/functions";
interface PatientAcceptFormValues {
first_name: string;
last_name: string;
email: string;
phone_number: string;
age: string;
country: string;
country_code: string;
message: string;
}
interface PatientAcceptFormProps {
lang: string;
dict: {
form: {
fields: {
first_name: string;
last_name: string;
phone_number: string;
email: string;
age: string;
country: string;
message: string;
};
buttons: {
send_whatsapp: string;
send_email: string;
};
};
};
}
function PatientConsultantForm({lang, dict}: PatientAcceptFormProps) {
const [formData, setFormData] = useState<PatientAcceptFormValues>({
first_name: "",
last_name: "",
email: "",
phone_number: "",
age: "",
country: "",
country_code: "",
message: "",
});
const sendToWhatsApp = (formData: PatientAcceptFormValues) => {
const phone = "989385745269"; // بدون + و با کد کشور
const message =
`درخواست مشاوره جدید ثبت شد:\n` +
`شناسه تولید شده: ${generateIPDConsultantCode()}\n` +
`نام: ${formData.first_name}\n` +
`نام خانوادگی: ${formData.last_name}\n` +
`سن: ${formData.age ?? "وارد نشده است"}\n` +
`ایمیل: ${formData.email ?? "وارد نشده است"}\n` +
`شماره تماس: ${formData.phone_number ?? "وارد نشده است"}\n` +
`کشور: ${formData.country ?? "وارد نشده است"}\n` +
`کشور: ${formData.country_code ?? "وارد نشده است"}\n` +
`توضیحات: ${formData.message ?? "وارد نشده است"}\n`;
const encoded = encodeURIComponent(message);
window.open(`https://wa.me/${phone}?text=${encoded}`, "_blank");
};
const sendToEmail = (formData: PatientAcceptFormValues) => {
const email = "mojtaba5269@gmail.com";
const subject = "درخواست مشاوره جدید ارسال شد";
const message =
`درخواست مشاوره جدید ثبت شد :\n` +
`شناسه تولید شده: ${generateIPDConsultantCode()}\n` +
`نام: ${formData.first_name}\n` +
`نام خانوادگی: ${formData.last_name}\n` +
`سن: ${formData.age ?? "وارد نشده است"}\n` +
`ایمیل: ${formData.email ?? "وارد نشده است"}\n` +
`شماره تماس: ${formData.phone_number ?? "وارد نشده است"}\n` +
`کشور: ${formData.country ?? "وارد نشده است"}\n` +
`کشور: ${formData.country_code ?? "وارد نشده است"}\n` +
`توضیحات: ${formData.message ?? "وارد نشده است"}\n`;
const mailto = `mailto:${email}?subject=${encodeURIComponent(
subject
)}&body=${encodeURIComponent(message)}`;
window.location.href = mailto;
};
return (
<>
<div className="grid grid-cols-2 gap-5 w-full mt-10">
<div className="lg:col-span-1 col-span-2">
<input
type="text"
value={formData.first_name}
onChange={(e) =>
setFormData((prev) => ({...prev, first_name: e.target.value}))
}
placeholder={dict?.form?.fields?.first_name}
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
/>
</div>
<div className="lg:col-span-1 col-span-2">
<input
type="text"
value={formData.last_name}
onChange={(e) =>
setFormData((prev) => ({...prev, last_name: e.target.value}))
}
placeholder={dict?.form?.fields?.last_name}
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
/>
</div>
<div className="lg:col-span-1 col-span-2">
<input
type="text"
value={formData.phone_number}
onChange={(e) =>
setFormData((prev) => ({...prev, phone_number: e.target.value}))
}
placeholder={dict?.form?.fields?.phone_number}
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
/>
</div>
<div className="lg:col-span-1 col-span-2">
<input
type="text"
value={formData.email}
onChange={(e) =>
setFormData((prev) => ({...prev, email: e.target.value}))
}
placeholder={dict?.form?.fields?.email}
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
/>
</div>
<div className="lg:col-span-1 col-span-2">
<input
type="text"
value={formData.age}
onChange={(e) =>
setFormData((prev) => ({...prev, age: e.target.value}))
}
placeholder={dict?.form?.fields?.age}
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
/>
</div>
<div className="lg:col-span-1 col-span-2">
<CustomSelect
options={all_countries}
value={formData.country}
onChange={(value: string) =>
setFormData((prev) => ({
...prev,
country: value,
country_code:
all_countries.find((c) => c.value === value)?.code || "",
}))
}
placeholder={dict.form.fields.country}
isClearable
className="w-full"
rtl
/>
</div>
<div className="col-span-2">
<textarea
rows={8}
value={formData.message}
onChange={(e) =>
setFormData((prev) => ({...prev, message: e.target.value}))
}
placeholder={dict?.form?.fields?.message}
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
></textarea>
</div>
<div className="col-span-2 grid grid-cols-2 gap-3">
<button
type="button"
onClick={() => sendToWhatsApp(formData)}
className="lg:col-span-1 col-span-2 bg-secondary text-white rounded-full py-4 lg:px-10 px-3 font-semibold shadow-lg shadow-neutral-300 hover:shadow-none transition-all duration-200 flex flex-1 justify-center lg:text-base text-sm"
>
{dict?.form?.buttons?.send_whatsapp}
</button>
<button
onClick={() => sendToEmail(formData)}
className="lg:col-span-1 col-span-2 bg-secondary text-white rounded-full py-4 lg:px-10 px-3 font-semibold shadow-lg shadow-neutral-300 hover:shadow-none transition-all duration-200 flex flex-1 justify-center lg:text-base text-sm"
>
{dict?.form?.buttons?.send_email}
</button>
</div>
</div>
</>
);
}
export default PatientConsultantForm;

View File

@@ -0,0 +1,74 @@
"use client";
import React, {useState} from "react";
interface UploadDocumentsValues {
code: string;
files: [{src: string}] | [];
message: string;
}
interface UploadDocumentsProps {
lang: string;
dict: {
head_text: string;
input_code_placeholder: string;
input_files_label: string;
input_dsc: string;
sendbutton: string;
};
}
function UploadDocuments({lang, dict}: UploadDocumentsProps) {
const [formData, setFormData] = useState<UploadDocumentsValues>({
code: "",
files: [],
message: "",
});
const sendToEmail = (formData: UploadDocumentsValues) => {};
return (
<>
<div className="grid grid-cols-2 gap-5 w-full mt-10">
<div className="lg:col-span-2 col-span-2">
<input
type="text"
value={formData.code}
onChange={(e) =>
setFormData((prev) => ({...prev, first_name: e.target.value}))
}
placeholder={dict.input_code_placeholder}
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
/>
</div>
<div className="lg:col-span-2 col-span-2 space-y-2 flex flex-col">
<label htmlFor="">{dict.input_files_label}</label>
<input
type="file"
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px] h-[300px] flex items-center justify-center"
/>
</div>
<div className="col-span-2">
<textarea
rows={8}
value={formData.message}
onChange={(e) =>
setFormData((prev) => ({...prev, message: e.target.value}))
}
placeholder={dict.input_dsc}
className="py-4 px-6 rounded-2xl border-[1px] border-neutral-200 w-full focus:outline-secondary focus:outline-[1px]"
></textarea>
</div>
<div className="col-span-2 grid grid-cols-2 gap-3">
<button
onClick={() => sendToEmail(formData)}
className="cursor-pointer lg:col-span-2 col-span-2 bg-secondary text-white rounded-full py-4 lg:px-10 px-3 font-semibold shadow-lg shadow-neutral-300 hover:shadow-none transition-all duration-200 flex flex-1 justify-center lg:text-base text-sm"
>
{dict.sendbutton}
</button>
</div>
</div>
</>
);
}
export default UploadDocuments;

View File

@@ -0,0 +1,72 @@
"use client";
import React from "react";
import {Swiper, SwiperSlide} from "swiper/react";
import "swiper/css";
import "swiper/css/pagination";
import "swiper/css/navigation";
import {Autoplay, Navigation, Pagination} from "swiper/modules";
import Image from "next/image";
export default function HomeHeaderSlider() {
return (
<Swiper
loop={true}
autoplay={{
delay: 2500,
disableOnInteraction: false,
}}
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">
<div className="p-20">
<CustomLink
label="دریافت نوبت آنلاین"
href="/reservation"
className="bg-blue-secondary text-white flex items-center font-medium w-fit px-20 py-4 rounded-xl"
/>
</div>
</div> */}
<SwiperSlide className="h-full w-full relative">
<Image
loading="lazy"
src={"/header-slider-1.webp"}
fill
style={{color: "transparent", objectFit: "cover",objectPosition:"center"}}
alt=""
/>
</SwiperSlide>
<SwiperSlide>
<Image
loading="lazy"
src={"/header-slider-1.webp"}
fill
style={{color: "transparent", objectFit: "cover"}}
alt=""
/>
</SwiperSlide>
<SwiperSlide>
<Image
loading="lazy"
src={"/header-slider-1.webp"}
fill
style={{color: "transparent", objectFit: "cover"}}
alt=""
/>
</SwiperSlide>
<SwiperSlide>
<Image
loading="lazy"
src={"/header-slider-1.webp"}
fill
style={{color: "transparent", objectFit: "cover"}}
alt=""
/>
</SwiperSlide>
</Swiper>
);
}

View File

@@ -0,0 +1,76 @@
"use client";
import React from "react";
import {Swiper, SwiperSlide} from "swiper/react";
import "swiper/css";
import "swiper/css/pagination";
import "swiper/css/navigation";
import {Autoplay, Navigation, Pagination} from "swiper/modules";
import Image from "next/image";
import { Page_header_slider } from "@/constants";
import { languages_types } from "@/types";
export default function PageHeaderSlider({
pageTitle,
imageSrc,
lang,
}: {
pageTitle: string;
imageSrc: string;
lang: string;
}) {
return (
<Swiper
loop={true}
autoplay={{
delay: 2500,
disableOnInteraction: false,
}}
navigation={false}
modules={[Pagination, Navigation, Autoplay]}
onSlideChange={() => console.log("slide change")}
onSwiper={(swiper) => console.log(swiper)}
className="lg:h-[50vh] h-[460px]"
>
<div
className={`container absolute z-10 top-0 w-full h-full flex items-end ${
lang === "en" ? "bg-linear-to-r" : "bg-linear-to-l"
} from-white/70 to-transparent`}
>
<div className="py-20 space-y-2">
<h1 className="text-[40px] text-blue-primary font-semibold">
{pageTitle}
</h1>
<p className="text-blue-primary lg:text-3xl text-lg font-medium">
{Page_header_slider.hospital_name[lang as languages_types]}
</p>
<p className="text-blue-primary lg:text-xl text-md font-medium">
{Page_header_slider.n1_authority_validation[lang as languages_types]}
</p>
</div>
</div>
<SwiperSlide className="h-full w-full relative">
<Image
loading="lazy"
src={imageSrc}
fill
style={{
color: "transparent",
objectFit: "cover",
objectPosition: "center",
}}
alt=""
/>
</SwiperSlide>
{/* <SwiperSlide>
<Image
loading="lazy"
src={"/header-slider-1.webp"}
fill
style={{color: "transparent", objectFit: "cover"}}
alt=""
/>
</SwiperSlide> */}
</Swiper>
);
}

View File

@@ -0,0 +1,68 @@
import React from "react";
import LanguagesChanger from "../components/LanguagesChanger";
import { languages_types } from "@/types";
import { default_info } from "@/constants";
export default function TopNavbar({lang}:{lang:languages_types}) {
return (
<div className="py-2 container bg-blue-primary flex items-center justify-between">
<div className="flex items-center justify-center gap-x-2 group">
<span className="text-[#e6e6e6] group-hover:text-white">
<svg
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M4 20C3.45 20 2.97917 19.8042 2.5875 19.4125C2.19583 19.0208 2 18.55 2 18V6C2 5.45 2.19583 4.97917 2.5875 4.5875C2.97917 4.19583 3.45 4 4 4H20C20.55 4 21.0208 4.19583 21.4125 4.5875C21.8042 4.97917 22 5.45 22 6V18C22 18.55 21.8042 19.0208 21.4125 19.4125C21.0208 19.8042 20.55 20 20 20H4ZM12 13L4 8V18H20V8L12 13ZM12 11L20 6H4L12 11ZM4 8V6V18V8Z"
fill="currentColor"
/>
</svg>
</span>
<span className="text-[#e6e6e6] group-hover:text-white lg:text-base text-sm">
<a href={`mailto:${default_info.email}`}>{default_info.email}</a>
</span>
</div>
<div className="lg:flex hidden items-center justify-end gap-x-4 ">
<a
href="https://instagram.com/shomalhospital"
className="flex items-center justify-start gap-x-1 text-white"
>
<svg
width="21"
height="21"
viewBox="0 0 25 25"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M7.88333 5.09347C7.88308 5.61528 7.68707 6.11561 7.33843 6.4844C6.98978 6.85319 6.51705 7.06023 6.02423 7.05997C5.53141 7.05971 5.05888 6.85217 4.71058 6.48301C4.36228 6.11385 4.16675 5.61331 4.16699 5.0915C4.16724 4.56969 4.36325 4.06936 4.71189 3.70057C5.06054 3.33178 5.53327 3.12474 6.02609 3.125C6.51891 3.12526 6.99144 3.3328 7.33974 3.70196C7.68804 4.07112 7.88357 4.57166 7.88333 5.09347ZM7.93907 8.51689H4.22274V20.8333H7.93907V8.51689ZM13.8109 8.51689H10.1131V20.8333H13.7737V14.3702C13.7737 10.7697 18.2054 10.4352 18.2054 14.3702V20.8333H21.8753V13.0323C21.8753 6.96258 15.316 7.18884 13.7737 10.1696L13.8109 8.51689Z"
fill="white"
/>
</svg>
</a>
<span className="text-white"> | </span>
<a href="https://instagram.com/shomalhospital">
<svg
width="21"
height="21"
viewBox="0 0 25 25"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M8.12467 2.08337H16.8747C20.208 2.08337 22.9163 4.79171 22.9163 8.12504V16.875C22.9163 18.4774 22.2798 20.0141 21.1468 21.1471C20.0137 22.2802 18.477 22.9167 16.8747 22.9167H8.12467C4.79134 22.9167 2.08301 20.2084 2.08301 16.875V8.12504C2.08301 6.52269 2.71954 4.98597 3.85257 3.85294C4.9856 2.71991 6.52232 2.08337 8.12467 2.08337ZM7.91634 4.16671C6.92178 4.16671 5.96795 4.5618 5.26469 5.26506C4.56143 5.96832 4.16634 6.92215 4.16634 7.91671V17.0834C4.16634 19.1563 5.84342 20.8334 7.91634 20.8334H17.083C18.0776 20.8334 19.0314 20.4383 19.7347 19.735C20.4379 19.0318 20.833 18.0779 20.833 17.0834V7.91671C20.833 5.84379 19.1559 4.16671 17.083 4.16671H7.91634ZM17.9684 5.72921C18.3138 5.72921 18.6449 5.86639 18.8891 6.11058C19.1333 6.35477 19.2705 6.68596 19.2705 7.03129C19.2705 7.37662 19.1333 7.70781 18.8891 7.952C18.6449 8.19619 18.3138 8.33337 17.9684 8.33337C17.6231 8.33337 17.2919 8.19619 17.0477 7.952C16.8035 7.70781 16.6663 7.37662 16.6663 7.03129C16.6663 6.68596 16.8035 6.35477 17.0477 6.11058C17.2919 5.86639 17.6231 5.72921 17.9684 5.72921ZM12.4997 7.29171C13.881 7.29171 15.2058 7.84044 16.1825 8.81719C17.1593 9.79394 17.708 11.1187 17.708 12.5C17.708 13.8814 17.1593 15.2061 16.1825 16.1829C15.2058 17.1596 13.881 17.7084 12.4997 17.7084C11.1183 17.7084 9.79358 17.1596 8.81683 16.1829C7.84007 15.2061 7.29134 13.8814 7.29134 12.5C7.29134 11.1187 7.84007 9.79394 8.81683 8.81719C9.79358 7.84044 11.1183 7.29171 12.4997 7.29171ZM12.4997 9.37504C11.6709 9.37504 10.876 9.70428 10.29 10.2903C9.70391 10.8764 9.37467 11.6712 9.37467 12.5C9.37467 13.3288 9.70391 14.1237 10.29 14.7097C10.876 15.2958 11.6709 15.625 12.4997 15.625C13.3285 15.625 14.1233 15.2958 14.7094 14.7097C15.2954 14.1237 15.6247 13.3288 15.6247 12.5C15.6247 11.6712 15.2954 10.8764 14.7094 10.2903C14.1233 9.70428 13.3285 9.37504 12.4997 9.37504Z"
fill="white"
/>
</svg>
</a>
<span className="text-white"> | </span>
<LanguagesChanger lang={lang} />
</div>
</div>
);
}

35
src/utils/functions.ts Normal file
View File

@@ -0,0 +1,35 @@
import {languages_types} from "@/types";
export function toPersianNumber(num: string) {
const persianDigits = ["۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹"];
return num
.toString()
.split("")
.map((d) => persianDigits[+d] || d)
.join("");
}
export function removeLangFromPathname(
pathname: string,
lang: languages_types
) {
// بررسی می‌کنیم که 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 نبود، مسیر اصلی را برگردان
}
export const getHref = (href: string, lang: string) => {
const cleanPath = href.replace(/^\/(fa|en|ar)(\/|$)/, "/");
return `/${lang}${cleanPath}`;
};
export function generateIPDReceptionCode() {
const randomNumber = Math.floor(100000 + Math.random() * 900000); // عدد 6 رقمی
return `ipd-r-${randomNumber}`;
}export function generateIPDConsultantCode() {
const randomNumber = Math.floor(100000 + Math.random() * 900000); // عدد 6 رقمی
return `ipd-c-${randomNumber}`;
}