diff --git a/.claude/prompt/appointment-detail-fields-fix.md b/.claude/prompt/appointment-detail-fields-fix.md new file mode 100644 index 0000000..24e2ae9 --- /dev/null +++ b/.claude/prompt/appointment-detail-fields-fix.md @@ -0,0 +1,63 @@ +# اصلاح فیلدهای «جزئیات نوبت» در داشبورد + +## پروژه + +`nobat724_front` (سایت عمومی، داشبورد). + +> **Cross-repo:** وابسته به پرامپت بک‌اند `clinicpro/.claude/prompt/appointment-detail-enrich.md` که `doctor.specialties` و `address` را به پاسخ نوبت اضافه می‌کند. آن **اول** اجرا شود. + +## زمینه + +در داشبورد → «نوبت‌های من» → «مشاهده جزئیات»، کارت «جزئیات نوبت شما» (`DetailLg`/`DetailSm`) فیلدهایی می‌خواند که با شکل واقعی پاسخ نوبت نمی‌خوانند، پس تاریخ/ساعت/تخصص/آدرس/تلفن خالی یا غلط نمایش داده می‌شوند. + +پاسخ واقعی نوبت (پس از پرامپت بک‌اند): `{ uuid, doctor:{name, specialties:[{uuid,name}]}, address:{address, telephone, map:{latitude,longitude}, ...}, slot_start, slot_end, status, ... }`. تاریخ‌ها Unix‌اند. + +## مشکل / هدف + +نگاشت فیلدها در `DetailLg.js` و `DetailSm.js` به مقادیر واقعی: + +| نمایش | فعلی (غلط) | درست | +|------|-----------|------| +| تاریخ نوبت | `appointmentData?.start_time` | `appointmentData?.slot_start` | +| ساعت نوبت | `appointmentData?.slot?.time` | `convertTimestampToTime(appointmentData?.slot_start)` | +| تخصص | `appointmentData?.doctor?.specialty?.name` | `appointmentData?.doctor?.specialties?.[0]?.name` | +| آدرس | `appointmentData?.address?.address` | همان (درست) | +| تلفن | `appointmentData?.address?.phone` | `appointmentData?.address?.telephone` | +| نقشه | `appointmentData?.address?.map` | همان (درست) | + +## فایل‌های مرتبط + +| فایل | نقش | +|------|-----| +| `components/dashboard/userAccount/sidebars/turns/isTurnsDetails/DetailLg.js` | نمای دسکتاپ جزئیات | +| `components/dashboard/userAccount/sidebars/turns/isTurnsDetails/DetailSm.js` | نمای موبایل جزئیات | + +## وضعیت فعلی (کد واقعی — هر دو فایل مشابه) + +```jsx +{convertTimestampToJalali(appointmentData?.start_time)} // ❌ start_time +ساعت {appointmentData?.slot?.time} // ❌ slot.time +تخصص: {appointmentData?.doctor?.specialty?.name} // ❌ specialty.name +{appointmentData?.address?.phone} // ❌ phone +``` +`convertTimestampToTime` از قبل در `helper` هست و در `DetailLg` import شده. + +## وظایف + +### ۱. اصلاح `DetailLg.js` +- تاریخ: `convertTimestampToJalali(appointmentData?.slot_start)` +- ساعت: `convertTimestampToTime(appointmentData?.slot_start)` (به‌جای `appointmentData?.slot?.time`) +- تخصص: `appointmentData?.doctor?.specialties?.[0]?.name` +- تلفن: `appointmentData?.address?.telephone` +- آدرس و `map` (مسیریابی) بدون تغییر (درست‌اند). + +### ۲. اصلاح `DetailSm.js` +همان نگاشت‌ها را اعمال کن (این فایل `convertTimestampToTime` را import نکرده باشد، اضافه کن). ساعت از `slot_start`. + +## نکات مهم + +- اگر تخصص خالی بود (`specialties` خالی) یا آدرس `null` بود (پزشک بدون آدرس)، بخش مربوط نباید crash کند — با optional chaining (`?.`) و عدم نمایش خطی که داده ندارد، تحمل کن. +- `slot_start` Unix ثانیه است؛ `convertTimestampToJalali`/`convertTimestampToTime` همان را می‌گیرند (مثل `List.js`). +- `address.map.latitude/longitude` رشته‌اند (از `DoctorAddress::toArray`) — برای لینک مسیریابی کافی‌اند. +- App Router، RTL، فونت Vazir؛ ساختار/استایل کارت حفظ شود، فقط منبع داده اصلاح شود. +- بعد از تغییر: `npm run build` بدون خطا؛ دستی — یک نوبت را باز کن، تاریخ/ساعت/پزشک/تخصص/آدرس/تلفن درست نمایش داده شوند. diff --git a/components/dashboard/userAccount/sidebars/turns/isTurnsDetails/DetailLg.js b/components/dashboard/userAccount/sidebars/turns/isTurnsDetails/DetailLg.js index 8ea2458..520e848 100644 --- a/components/dashboard/userAccount/sidebars/turns/isTurnsDetails/DetailLg.js +++ b/components/dashboard/userAccount/sidebars/turns/isTurnsDetails/DetailLg.js @@ -60,7 +60,7 @@ function DetailLg({ appointmentData, loading }) {

- تخصص: {appointmentData?.doctor?.specialty?.name} + تخصص: {appointmentData?.doctor?.specialties?.[0]?.name}

@@ -73,7 +73,7 @@ function DetailLg({ appointmentData, loading }) {

تاریخ نوبت:{" "} - {convertTimestampToJalali(appointmentData?.start_time)} + {convertTimestampToJalali(appointmentData?.slot_start)}

@@ -84,7 +84,7 @@ function DetailLg({ appointmentData, loading }) {

زمان نوبت:{" "} - ساعت {appointmentData?.slot?.time} + ساعت {convertTimestampToTime(appointmentData?.slot_start)}

@@ -126,7 +126,7 @@ function DetailLg({ appointmentData, loading }) {

تلفن:{" "} - {appointmentData?.address?.phone} + {appointmentData?.address?.telephone}

diff --git a/components/dashboard/userAccount/sidebars/turns/isTurnsDetails/DetailSm.js b/components/dashboard/userAccount/sidebars/turns/isTurnsDetails/DetailSm.js index 49b0efa..a346b62 100644 --- a/components/dashboard/userAccount/sidebars/turns/isTurnsDetails/DetailSm.js +++ b/components/dashboard/userAccount/sidebars/turns/isTurnsDetails/DetailSm.js @@ -3,7 +3,7 @@ import { Button } from "@mui/material"; import React, { useRef } from "react"; import ButtonData from "./ButtonData"; import TextLoading from "@/app/component/loading/Text"; -import { convertTimestampToJalali } from "@/helper"; +import { convertTimestampToJalali, convertTimestampToTime } from "@/helper"; import html2canvas from "html2canvas"; import jsPDF from "jspdf"; @@ -56,7 +56,7 @@ function DetailSm({ appointmentData, loading }) {

- {appointmentData?.doctor?.specialty?.name} + {appointmentData?.doctor?.specialties?.[0]?.name}

@@ -70,7 +70,7 @@ function DetailSm({ appointmentData, loading }) {

- {convertTimestampToJalali(appointmentData?.start_time)} + {convertTimestampToJalali(appointmentData?.slot_start)}

@@ -81,7 +81,7 @@ function DetailSm({ appointmentData, loading }) {

- {appointmentData?.slot?.time} + {convertTimestampToTime(appointmentData?.slot_start)}

@@ -112,7 +112,7 @@ function DetailSm({ appointmentData, loading }) {

- تلفن: {appointmentData?.address?.phone} + تلفن: {appointmentData?.address?.telephone}

diff --git a/components/layout/sidebar/Head.js b/components/layout/sidebar/Head.js index c601c30..c2088c2 100644 --- a/components/layout/sidebar/Head.js +++ b/components/layout/sidebar/Head.js @@ -1,9 +1,15 @@ -import { getParsedUserInfo } from "@/helper"; -import Image from "next/image"; -import { imageUrl } from "@/helper"; +"use client"; -function Head({ user }) { - const userInfo = getParsedUserInfo(); +import { useEffect, useState } from "react"; +import { getParsedUserInfo, imageUrl } from "@/helper"; +import Image from "next/image"; + +function Head() { + const [userInfo, setUserInfo] = useState(null); + + useEffect(() => { + setUserInfo(getParsedUserInfo()); + }, []); return (