diff --git a/serv_nginx/bbvue/src/stores/user.js b/serv_nginx/bbvue/src/stores/user.js index bbc3632..1d4f9b0 100644 --- a/serv_nginx/bbvue/src/stores/user.js +++ b/serv_nginx/bbvue/src/stores/user.js @@ -97,7 +97,7 @@ export const useUserStore = defineStore('user', () => { try { const response = await apiClient.get('/user/achievements') console.log("debug /user/achievements " + response.data) - userAchievements.value = response.data + userAchievements.value = response.data || [] return { success: true, data: userAchievements.value } } catch (error) { console.warn('Achievements endpoint not available, using mock data', error) diff --git a/serv_nginx/bbvue/src/views/Profile.vue b/serv_nginx/bbvue/src/views/Profile.vue index 01e8874..930bbef 100644 --- a/serv_nginx/bbvue/src/views/Profile.vue +++ b/serv_nginx/bbvue/src/views/Profile.vue @@ -88,7 +88,7 @@ -
+

⭐ Личные рекорды

@@ -102,7 +102,7 @@
-
+

📅 Ближайшие события

@@ -229,9 +229,9 @@ export default { }, recentAchievements() { return this.userAchievements - .filter(a => a.verified) - .sort((a, b) => new Date(b.date) - new Date(a.date)) - .slice(0, 3) + .filter(a => a.verified || a.achieved) // Добавить проверку на achieved + .sort((a, b) => new Date(b.date || b.created_at) - new Date(a.date || a.created_at)) // Добавить fallback + .slice(0, 3); }, achievementProgress() { return this.userStore.achievementProgress @@ -349,19 +349,21 @@ export default { async loadExtendedData() { this.statsLoading = true; try { - const [statsResult, achievementsResult, bestsResult, eventsResult, planResult] = await Promise.all([ + // Использовать правильные методы из стора + const [statsResult, achievementsResult, bestsResult, eventsResult, planResult] = await Promise.allSettled([ this.userStore.fetchUserStats(), this.userStore.fetchUserAchievements(), - this.fetchPersonalBests(), - this.fetchUpcomingEvents(), - this.fetchCurrentTrainingPlan() + this.userStore.fetchPersonalBests(), + this.userStore.fetchUpcomingEvents(), + this.userStore.fetchCurrentTrainingPlan() ]); - if (!statsResult.success) console.error('Ошибка статистики:', statsResult.error); - if (!achievementsResult.success) console.error('Ошибка достижений:', achievementsResult.error); - if (!bestsResult.success) console.error('Ошибка рекордов:', bestsResult.error); - if (!eventsResult.success) console.error('Ошибка событий:', eventsResult.error); - if (!planResult.success) console.error('Ошибка плана:', planResult.error); + // Обработка результатов + if (statsResult.status === 'rejected') console.error('Ошибка статистики:', statsResult.reason); + if (achievementsResult.status === 'rejected') console.error('Ошибка достижений:', achievementsResult.reason); + if (bestsResult.status === 'rejected') console.error('Ошибка рекордов:', bestsResult.reason); + if (eventsResult.status === 'rejected') console.error('Ошибка событий:', eventsResult.reason); + if (planResult.status === 'rejected') console.error('Ошибка плана:', planResult.reason); } catch (error) { console.error('Ошибка загрузки расширенных данных:', error); @@ -370,36 +372,6 @@ export default { } }, - async fetchPersonalBests() { - try { - const response = await this.userStore.fetchPersonalBests; - this.personalBests = response.data; - return { success: true }; - } catch (error) { - return { success: false, error: error.message }; - } - }, - - async fetchUpcomingEvents() { - try { - const response = await this.userStore.apiClient.get('/events/upcoming'); - this.upcomingEvents = response.data; - return { success: true }; - } catch (error) { - return { success: false, error: error.message }; - } - }, - - async fetchCurrentTrainingPlan() { - try { - const response = await this.userStore.apiClient.get('/training-plans/current'); - this.currentTrainingPlan = response.data; - return { success: true }; - } catch (error) { - return { success: false, error: error.message }; - } - }, - formatTime(minutes) { if (!minutes) return '0 мин'; const hours = Math.floor(minutes / 60);