fix(dashboard): wire turns/transactions to real endpoints + fix uuid cookie

- Login now overwrites the uuid cookie with the real user uuid (was the
  OTP uuid), so server-side profile/dashboard fetches resolve.
- getMyAppointments → /api/v1/appointments/user (patient's own bookings;
  /my/appointments is role-scoped and empty for plain users), read from
  the double-nested data.data.
- getMyPayments → /api/v1/my/payments (new endpoint), read paginated
  data + meta.totalPages.
- Drop the userId path param (both endpoints derive the user from token).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
hamed
2026-06-15 19:27:18 +03:30
co-authored by Claude Opus 4.8
parent cec6b51f23
commit 0a95e99efa
4 changed files with 15 additions and 30 deletions
@@ -26,12 +26,6 @@ function Transactions({ user, loading }) {
const parsedData = safeJsonParse(userInfo);
if (!parsedData) { setIsLoading(false); return; }
const userId = parsedData.id || parsedData.uuid;
if (!userId) {
setIsLoading(false);
return;
}
const params = {
page,
@@ -42,13 +36,14 @@ function Transactions({ user, loading }) {
params.status = status;
}
const response = await request.getMyPayments(userId, params);
const response = await request.getMyPayments(params);
if (response?.data) {
if (Array.isArray(response?.data)) {
setPayments(response.data);
if (response.page) {
setTotalPages(response.page.totalPages);
}
setTotalPages(response?.meta?.totalPages || 1);
} else {
setPayments([]);
setTotalPages(1);
}
} catch (error) {
console.error("Error fetching payments:", error);
@@ -25,14 +25,6 @@ function Turns({ user, setIsTurnsDetails, loading }) {
return;
}
const parsedData = JSON.parse(userInfo);
const userId = parsedData.id || parsedData.uuid;
if (!userId) {
setIsLoading(false);
return;
}
const params = {
page,
limit: 10,
@@ -42,19 +34,15 @@ function Turns({ user, setIsTurnsDetails, loading }) {
params.status = status;
}
const response = await request.getMyAppointments(userId, params);
const response = await request.getMyAppointments(params);
const items = response?.data?.data;
if (response?.data) {
setAppointments(response.data);
if (response.page) {
setTotalPages(response.page.totalPages || 1);
} else {
setTotalPages(1);
}
if (Array.isArray(items)) {
setAppointments(items);
} else {
setAppointments([]);
setTotalPages(1);
}
setTotalPages(1);
} catch (error) {
console.error("Error fetching appointments:", error);
} finally {
@@ -88,6 +88,8 @@ function SendReq({
if (profile?.uuid) {
const userInfo = { ...profile, username: profile.mobile_number };
Cookies.set("userInfo", JSON.stringify(userInfo), cookieOptions);
// overwrite the OTP uuid set in handleSetCookie with the real user uuid
Cookies.set("uuid", profile.uuid, cookieOptions);
// اگر در صفحه appointment هستیم، به مرحله 3 (Detail) می‌رویم
if (setStep) {
+2 -2
View File
@@ -70,12 +70,12 @@ export const request = {
...removeTokenHead,
}),
postAppointment: (data) => api.post(`api/v1/appointment`, data, { requireAuth: true }),
getMyAppointments: (userId, params) => api.get(`api/v1/appointment/my-appointments/${userId}`, { params, requireAuth: true }),
getMyAppointments: (params) => api.get(`api/v1/appointments/user`, { params, requireAuth: true }),
postAppointmentPayment: (data) =>
api.post(`api/v1/payment/appointment`, data, { requireAuth: true }),
getPaymentConfig: () => api.get(`api/v1/payment/config`, { requireAuth: true }),
getPayment: (uuid) => api.get(`api/v1/payment/${uuid}`, { requireAuth: true }),
getMyPayments: (userId, params) => api.get(`api/v1/payment/my-payments/${userId}`, { params, requireAuth: true }),
getMyPayments: (params) => api.get(`api/v1/my/payments`, { params, requireAuth: true }),
postDoctor: (data) => api.post("api/v1/doctor", data),
postImageUpload: (data) =>
api.post("file/upload/clinic_pro/doctor/field_image", data, {