feat(dashboard): connect patient dashboard to real user profile

- buildPatientUser: ساخت آبجکت user از user-profile واقعی با کلیدهای
  مورد انتظار کامپوننت‌ها؛ comments/messages خالی و اعداد هدر صفر
  (بدون داده ساختگی، چون endpoint ندارند)
- app/dashboard/page.js پروفایل را server-side از user-profile/{uuid} می‌گیرد
- حذف import userData.json mock از Content داشبورد
- نوبت/تراکنش/تب اطلاعات از قبل به API واقعی وصل بودند (بدون تغییر)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
hamed
2026-06-15 00:10:40 +03:30
co-authored by Claude Opus 4.8
parent 5067824f28
commit dc1c6d25be
3 changed files with 42 additions and 4 deletions
+12
View File
@@ -5,6 +5,8 @@ import { getStateInfo } from "@/lib/getStateInfo";
import { removeToken } from "@/utils";
import { cookies } from "next/headers";
import { redirect } from "next/navigation";
import { fetchReq } from "@/lib/req";
import { buildPatientUser } from "@/lib/representationAdapters";
export default async function Dashboard({ searchParams }) {
const awaitedSearchParams = await searchParams;
@@ -20,11 +22,21 @@ export default async function Dashboard({ searchParams }) {
return redirect("/login");
}
const uuid = cookieStore.get("uuid")?.value;
let profile = null;
if (uuid) {
profile = await fetchReq(
`${process.env.NEXT_PUBLIC_API_URL}/api/v1/user-profile/${uuid}`,
{ headers: { Authorization: `Bearer ${token.value}` } }
);
}
return (
<Content
logged={token.value}
params={awaitedSearchParams}
matchedCity={matchedCity}
user={buildPatientUser(profile)}
/>
);
}
+3 -4
View File
@@ -2,11 +2,10 @@
import { useState } from "react";
import userData from "@/data/userData.json";
import DashboardPage from "@/components/dashboard";
import UserAccountPage from "./userAccount";
function Content({ matchedCity, params, logged }) {
function Content({ matchedCity, params, logged, user }) {
const [value, setValue] = useState(Number(params?.sidebar) || 0);
const [isOpenSide, setIsOpenSide] = useState();
const [isTurnsDetails, setIsTurnsDetails] = useState(null);
@@ -16,7 +15,7 @@ function Content({ matchedCity, params, logged }) {
value={value}
logged={logged}
setValue={setValue}
user={userData.data}
user={user}
isOpenSide={isOpenSide}
matchedCity={matchedCity}
setIsOpenSide={setIsOpenSide}
@@ -25,7 +24,7 @@ function Content({ matchedCity, params, logged }) {
>
<UserAccountPage
value={value}
user={userData.data}
user={user}
setIsOpenSide={setIsOpenSide}
isTurnsDetails={isTurnsDetails}
setIsTurnsDetails={setIsTurnsDetails}
+27
View File
@@ -51,6 +51,33 @@ export function adaptRepresentationDashboard(dashboard) {
};
}
export function buildPatientUser(profile) {
const data = profile?.data ?? profile ?? {};
return {
profile: data.avatar ?? "/assets/images/profile-user.png",
name: [data.name, data.family].filter(Boolean).join(" ").trim(),
phone: data.phone ?? data.mobile ?? "",
total_transactions: 0,
number_of_turns: 0,
national_code: data.national_code ?? "",
gender: data.gender ?? "",
date_of_birth: data.birthday ?? "",
father_name: data.fathers_name ?? "",
insurance: data.basic_insurance ?? "",
insurance_number: "",
blood_group: data.blood_type ?? "",
marital_status: data.marital_status ?? "",
home_phone: data.home_phone ?? "",
education: data.education ?? "",
job: data.job ?? "",
work_phone: data.work_phone ?? "",
turns: { current: [], done: [] },
comments: [],
messages: [],
};
}
export function adaptBankAccount(bankAccount) {
if (!bankAccount) return [];
return [