From 020a47f73574268875ce3f2d4afe4c45fb00d6fe Mon Sep 17 00:00:00 2001 From: sajjadtalkhabi <97734061+sajjadtalkhabi@users.noreply.github.com> Date: Thu, 11 Jun 2026 19:22:35 +0330 Subject: [PATCH] fix: data --- .../modals/UserVerificationDetailsModal.vue | 16 ++++++-- src/services/api/admin-users.js | 3 ++ src/services/api/endpoints.js | 1 + src/services/mock/routes/admin-users.js | 39 +++++++++++++++++++ src/services/query/admin-users.js | 24 ++++++++++++ 5 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/features/admin/users/components/verifications/modals/UserVerificationDetailsModal.vue b/src/features/admin/users/components/verifications/modals/UserVerificationDetailsModal.vue index 99ddec8..7f31a98 100644 --- a/src/features/admin/users/components/verifications/modals/UserVerificationDetailsModal.vue +++ b/src/features/admin/users/components/verifications/modals/UserVerificationDetailsModal.vue @@ -214,8 +214,8 @@ import useModal from '@/composables/useModal' import BasicModal from '@/components/BasicModal.vue' import { formatJalaaliDate } from '@/utils/date-utils' import LineTitleBlock from '@/components/LineTitleBlock.vue' -import { useAdminUserQuery } from '@/services/query/admin-users' import LineInfoBlock from '@/components/blocks/LineInfoBlock.vue' +import { useAdminUserQuery, useAdminUserRegisterDataQuery } from '@/services/query/admin-users' import { AUDIENCE_CONFLICT_RESPONSE, COMPETING_PROPAGATOR_RESPONSE, @@ -242,10 +242,20 @@ const { data: fetched } = useAdminUserQuery(userIdRef, { enabled: () => !!userIdRef.value, }) +const { data: registerData } = useAdminUserRegisterDataQuery(userIdRef, { + enabled: () => !!userIdRef.value, +}) + const user = computed(() => modalData.value.user || fetched.value || null) -const profile = computed(() => user.value?.profile || {}) + +// The register-data endpoint returns the answers the user gave during the +// registration steps — the same fields the sections below render. Merge it over +// the user's stored profile so reviewing admins see what was actually submitted. +const profile = computed(() => ({ ...user.value?.profile, ...registerData.value })) + const fullName = computed( - () => `${user.value?.firstName || ''} ${user.value?.lastName || ''}`.trim() || '—' + () => + user.value?.name || `${user.value?.firstName || ''} ${user.value?.lastName || ''}`.trim() || '—' ) const platforms = computed(() => diff --git a/src/services/api/admin-users.js b/src/services/api/admin-users.js index 0607037..a06fd28 100644 --- a/src/services/api/admin-users.js +++ b/src/services/api/admin-users.js @@ -5,6 +5,9 @@ export const apiGetAdminUsers = (params) => http.get(endpoints.getApprovedUsers, export const apiShowAdminUser = (id) => http.get(buildUrl(endpoints.showUserDetails, { id })) +export const apiGetAdminUserRegisterData = (id) => + http.get(buildUrl(endpoints.getUserRegisterData, { id })) + export const apiAddAdminUser = (payload) => http.post(endpoints.addNewUser, payload) export const apiUpdateAdminUser = (id, payload) => diff --git a/src/services/api/endpoints.js b/src/services/api/endpoints.js index 6708ea7..79c71ba 100644 --- a/src/services/api/endpoints.js +++ b/src/services/api/endpoints.js @@ -59,6 +59,7 @@ export const endpoints = { updateUserRole: '/admin/users/:id/role', changeUserStatus: '/admin/users/:id/status', deleteUser: '/admin/users/:id', + getUserRegisterData: '/admin/users/:id/register-data', // ─── Backend-aligned: Terms ──────────────────────────────────────────────── getTermsList: '/terms', diff --git a/src/services/mock/routes/admin-users.js b/src/services/mock/routes/admin-users.js index 23301f0..a7c30a8 100644 --- a/src/services/mock/routes/admin-users.js +++ b/src/services/mock/routes/admin-users.js @@ -38,6 +38,45 @@ register('GET', endpoints.showUserDetails, ({ params }) => ({ data: findOrThrow(adminUsers, params.id), })) +register('GET', endpoints.getUserRegisterData, ({ params }) => { + const user = findOrThrow(adminUsers, params.id) + return { + success: true, + message: 'OK', + data: [ + { key: 'educationStatus', value: 'seminary_student' }, + { key: 'seminaryLevel', value: 'level_3' }, + { key: 'universityLevel', value: 'not_applicable' }, + { key: 'universityName', value: 'حوزه علمیه قم' }, + { key: 'fieldOfStudy', value: 'فقه و اصول' }, + { key: 'workExperienceSummary', value: 'پنج سال تدریس در مدرسه دینی.' }, + { key: 'activitySummary', value: 'برگزاری جلسات قرآن و حدیث به صورت هفتگی.' }, + { key: 'specializedTopics', value: 'تربیت دینی نوجوانان' }, + { key: 'propagationExperienceYears', value: 6 }, + { key: 'propagationMethodDescription', value: 'محوریت بیان داستان‌های قرآنی.' }, + { + key: 'propagationPlatforms', + value: [ + { platform: 'home_gathering_regular', platform_details: null }, + { platform: 'online', platform_details: 'کانال اینستاگرام @example' }, + ], + }, + { key: 'responseToLowSatisfaction', value: 'change_the_method' }, + { key: 'responseToSessionCancellation', value: 'teach_how_to_reduce_costs' }, + { key: 'responseToAudienceConflict', value: 'divide_the_crowd' }, + { key: 'responseToCompetingPropagator', value: 'strengthen_yourself' }, + { key: 'responseToCompetingPropagatorDescription', value: null }, + { key: 'relevantCertificates', value: 'سطح ۳ حوزوی، تدریس قرآن' }, + { key: 'hijabApproach', value: 'گفتگوی همدلانه و آموزش‌محور.' }, + { key: 'provinceId', value: user.address?.province?.id ?? 1 }, + { key: 'cityId', value: user.address?.city?.id ?? 101 }, + { key: 'address', value: user.address?.address || 'تهران، خیابان نمونه' }, + { key: 'avatar', value: null }, + { key: 'avatarId', value: null }, + ], + } +}) + register('POST', endpoints.addNewUser, ({ data }) => { const id = makeId() const roleByName = (n) => roles.find((r) => r.name === n) diff --git a/src/services/query/admin-users.js b/src/services/query/admin-users.js index 2f4dc8c..5f06594 100644 --- a/src/services/query/admin-users.js +++ b/src/services/query/admin-users.js @@ -4,6 +4,7 @@ import { apiAddAdminUser, apiChangeAdminUserStatus, apiDeleteAdminUser, + apiGetAdminUserRegisterData, apiGetAdminUsers, apiShowAdminUser, apiUpdateAdminUser, @@ -14,6 +15,7 @@ export const adminUsersKeys = { all: ['admin', 'users'], list: (filters, pagination) => ['admin', 'users', 'list', filters, pagination], detail: (id) => ['admin', 'users', 'detail', id], + registerData: (id) => ['admin', 'users', 'register-data', id], } export const useAdminUsersListQuery = (filtersRef, paginationRef, options = {}) => @@ -35,6 +37,28 @@ export const useAdminUserQuery = (idRef, options = {}) => ...options, }) +// Register-data comes back as a `[{ key, value }]` array (values may be +// strings, numbers, null, or nested objects/arrays). Normalize it into a plain +// `{ key: value }` object for consumers; tolerate an already-object shape too. +const toRegisterDataObject = (response) => { + const raw = response?.data ?? response + if (Array.isArray(raw)) { + return raw.reduce((acc, item) => { + if (item && item.key != null) acc[item.key] = item.value + return acc + }, {}) + } + return raw || {} +} + +export const useAdminUserRegisterDataQuery = (idRef, options = {}) => + useQuery({ + queryKey: ['admin', 'users', 'register-data', idRef], + queryFn: () => apiGetAdminUserRegisterData(idRef.value), + select: toRegisterDataObject, + ...options, + }) + export const useAddAdminUserMutation = () => useMutation({ mutationFn: (payload) => apiAddAdminUser(payload) })