8.6 KiB
صفحه پروفایل پزشک (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/profileassets/admin/components/layout/Sidebar.tsx— افزودن "پروفایل من" به منوی دکتر
Route:
<Route path="profile" element={<DoctorProfilePage />} />
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 دکتر
const uuid = useAuthStore(s => s.dbUuid);
Double-nested response برای GET doctor
// پاسخ: { 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 کد):
- در
App.tsxroute جدید:
<Route path="profile" element={<Navigate to={`/admin/doctors/${dbUuid}`} replace />} />
اما این روش نیاز به دسترسی به dbUuid در سطح App دارد.
روش بهتر:
// DoctorProfilePage.tsx — wrapper
export default function DoctorProfilePage() {
const dbUuid = useAuthStore(s => s.dbUuid);
if (!dbUuid) return <div>در حال بارگذاری...</div>;
return <DoctorDetailPage overrideUuid={dbUuid} isOwnProfile={true} />;
}
و در DoctorDetailPage.tsx یک prop isOwnProfile اضافه کن که:
- دکمههای ادمین-only را پنهان کند
- عنوان صفحه را تغییر دهد ("پروفایل من" به جای "جزئیات پزشک")
یا سادهتر: فقط لینک sidebar را به /admin/doctors/{dbUuid} تنظیم کن و DoctorDetailPage را بدون تغییر reuse کن — چون دکتر از طریق RoleRoute roles={['admin', 'doctor']} به آن صفحه دسترسی دارد.
الزامات
- وقتی دکتر وارد پنل میشود، از سایدبار به "پروفایل من" دسترسی داشته باشد
- پروفایل خودش را ببیند و ویرایش کند (نه پروفایل دکتر دیگری)
- تنظیمات نوبتدهیاش را مدیریت کند
- آدرس مطبهایش را مدیریت کند
- دکمههای ادمین-only (حذف/غیرفعال کردن) نمایش داده نشوند
- همه تاریخها شمسی نمایش داده شوند