# صفحه پروفایل پزشک (Doctor Profile Page) ## هدف پزشک باید صفحه‌ای داشته باشد که بتواند تمام اطلاعات مربوط به خودش را مشاهده و ویرایش کند — دقیقاً مشابه `/admin/doctors/{uuid}` که ادمین می‌بیند، اما: - به صورت خودکار UUID پزشک لاگین‌شده از `authStore.dbUuid` خوانده می‌شود - آدرس صفحه: `/admin/profile` - در سایدبار دکتر یک آیتم "پروفایل من" اضافه می‌شود --- ## وضعیت فعلی (چه داریم) ### صفحه موجود - `DoctorDetailPage.tsx` در مسیر `/admin/doctors/:uuid` برای **ادمین + دکتر** قابل دسترسی است - صفحه کامل است و شامل: اطلاعات پروفایل، آدرس مطب، تنظیمات نوبت‌دهی، تعطیلات، تاریخ‌های خاص - دکتر با UUID خودش می‌تواند این صفحه را ببیند اما **لینکی در منوی دکتر وجود ندارد** ### سایدبار دکتر (فعلی) ``` عمومی: - داشبورد مدیریت: - نوبت‌های من ``` ### Auth Store - `authStore.dbUuid` = UUID دکتر لاگین‌شده - `authStore.primaryRole` = 'doctor' --- ## API‌های موجود (بررسی‌شده) | Endpoint | وضعیت | کاربرد | |----------|-------|---------| | `GET /api/v1/doctor/{uuid}` | ✅ PUBLIC | خواندن پروفایل (double-nested: `data?.data?.data`) | | `PATCH /api/v1/doctor/{uuid}` | ✅ AUTH | ویرایش پروفایل | | `POST /api/v1/clinic-pro/doctor-address` | ✅ AUTH | افزودن آدرس مطب | | `PATCH /api/v1/clinic-pro/doctor-address/{id}` | ✅ AUTH | ویرایش آدرس | | `DELETE /api/v1/clinic-pro/doctor-address/{id}` | ✅ AUTH | حذف آدرس | | `GET /api/v1/clinic-pro/doctor-addresses/{doctorId}` | ✅ AUTH | لیست آدرس‌ها | | `GET /api/v1/appointment-settings/weekly-schedule/{doctorUuid}` | ✅ AUTH | برنامه هفتگی | | `POST /api/v1/appointment-settings/weekly-schedule` | ✅ AUTH | ساخت برنامه هفتگی | | `PATCH /api/v1/appointment-settings/weekly-schedule/{uuid}` | ✅ AUTH | ویرایش برنامه هفتگی | | `GET /api/v1/appointment-settings/date-override/list/{doctorUuid}` | ✅ AUTH | تاریخ‌های خاص | | `GET /api/v1/appointment-settings/holidays/list/{doctorUuid}` | ✅ AUTH | تعطیلات | | `GET /api/v1/my/appointments/today-stats?date=...` | ✅ AUTH | آمار نوبت‌ها | --- ## قابلیت‌هایی که باید ساخته شود ### قابلیت ۱ — Route + Sidebar **فایل‌ها:** - `assets/admin/App.tsx` — افزودن route `/admin/profile` - `assets/admin/components/layout/Sidebar.tsx` — افزودن "پروفایل من" به منوی دکتر **Route:** ```tsx } /> ``` **Sidebar (doctor):** ``` عمومی: - داشبورد پروفایل: - پروفایل من ← /admin/profile مدیریت: - نوبت‌های من - تنظیمات نوبت‌دهی ← /admin/appointment-settings (اختیاری) ``` --- ### قابلیت ۲ — `DoctorProfilePage.tsx` **ساختار صفحه** (با tab برای سازماندهی): ``` ┌──────────────────────────────────────────────────────────────┐ │ [عکس] دکتر [نام] ویرایش پروفایل │ │ [تخصص] [درجه] │ └──────────────────────────────────────────────────────────────┘ [ اطلاعات عمومی ] [ آدرس مطب ] [ تنظیمات نوبت‌دهی ] ↑ تب‌ها ──── محتوای هر تب ──── ``` **تب ۱ — اطلاعات عمومی** (ویرایش inline): - نام کامل - جنسیت (مرد/زن) - درجه علمی (عمومی / متخصص / فوق‌تخصص / فلوشیپ) - کد نظام پزشکی - تخصص‌ها (multi-select از `GET /api/v1/categorys/specially_doctor`) - سرویس‌ها (multi-select از `GET /api/v1/categorys/doctor_services` یا `GET /api/v1/doctor-services`) - بیوگرافی (textarea) - بارگذاری عکس پروفایل فرم: React Hook Form + Zod Submit: `PATCH /api/v1/doctor/{uuid}` **تب ۲ — آدرس مطب** (CRUD): - لیست آدرس‌ها با نام + آدرس + تلفن - دکمه "افزودن آدرس" → Modal با فرم: - نام مطب - آدرس - تلفن - استان + شهر (از category API) - نقشه (Leaflet — اختیاری اگر پیچیده باشد) - ویرایش + حذف هر آدرس **تب ۳ — تنظیمات نوبت‌دهی** (مشابه آنچه در DoctorDetailPage وجود دارد): - برنامه هفتگی (weekly schedule) — مشاهده + ویرایش - تعطیلات (holidays) — لیست + افزودن + حذف - تاریخ‌های خاص (date overrides) — لیست + مدیریت --- ## نکات پیاده‌سازی ### گرفتن UUID دکتر ```tsx const uuid = useAuthStore(s => s.dbUuid); ``` ### Double-nested response برای GET doctor ```tsx // پاسخ: { success: true, data: { data: { uuid, name, ... } } } const doctor = data?.data?.data; ``` ### استفاده مجدد از DoctorDetailPage اگر `DoctorDetailPage.tsx` قابل reuse است: - می‌توان یک wrapper ساده ساخت که فقط `uuid` را از `authStore.dbUuid` می‌گیرد و پاس می‌دهد - اما اگر رفتار صفحه برای ادمین و دکتر تفاوت دارد (مثلاً ادمین می‌تواند دکتر را غیرفعال کند ولی دکتر نمی‌تواند) باید برخی بخش‌ها را با `isAdmin` شرطی کرد ### بخش‌هایی که فقط ادمین می‌بیند (باید پنهان شوند): - دکمه "غیرفعال کردن حساب دکتر" - دکمه "حذف دکتر" - لیست کلینیک‌هایی که دکتر عضو است (فقط نمایش — بدون حذف از کلینیک) ### بخش‌هایی که دکتر اضافه می‌بیند (اختیاری): - آمار خلاصه نوبت‌های امروز (از `GET /api/v1/my/appointments/today-stats`) --- ## فایل‌های تأثیرپذیر | فایل | تغییر | |------|-------| | `assets/admin/pages/DoctorProfilePage.tsx` | **جدید** — صفحه پروفایل پزشک | | `assets/admin/App.tsx` | افزودن route `/admin/profile` | | `assets/admin/components/layout/Sidebar.tsx` | افزودن "پروفایل من" به منوی دکتر | | `assets/admin/pages/DoctorDetailPage.tsx` | اختیاری — اگر نیاز به تغییر رفتار ادمین/دکتر | --- ## رویکرد پیشنهادی **ساده‌ترین راه** (بدون duplicate کد): 1. در `App.tsx` route جدید: ```tsx } /> ``` اما این روش نیاز به دسترسی به `dbUuid` در سطح App دارد. **روش بهتر:** ```tsx // DoctorProfilePage.tsx — wrapper export default function DoctorProfilePage() { const dbUuid = useAuthStore(s => s.dbUuid); if (!dbUuid) return
در حال بارگذاری...
; return ; } ``` و در `DoctorDetailPage.tsx` یک prop `isOwnProfile` اضافه کن که: - دکمه‌های ادمین‌-only را پنهان کند - عنوان صفحه را تغییر دهد ("پروفایل من" به جای "جزئیات پزشک") **یا ساده‌تر:** فقط لینک sidebar را به `/admin/doctors/{dbUuid}` تنظیم کن و DoctorDetailPage را بدون تغییر reuse کن — چون دکتر از طریق `RoleRoute roles={['admin', 'doctor']}` به آن صفحه دسترسی دارد. --- ## الزامات 1. وقتی دکتر وارد پنل می‌شود، از سایدبار به "پروفایل من" دسترسی داشته باشد 2. پروفایل خودش را ببیند و ویرایش کند (نه پروفایل دکتر دیگری) 3. تنظیمات نوبت‌دهی‌اش را مدیریت کند 4. آدرس مطب‌هایش را مدیریت کند 5. دکمه‌های ادمین‌-only (حذف/غیرفعال کردن) نمایش داده نشوند 6. همه تاریخ‌ها شمسی نمایش داده شوند