modified: serv_nginx/bbvue/src/stores/user.js

modified:   serv_nginx/bbvue/src/views/Profile.vue
fix some bag
This commit is contained in:
2025-10-20 03:54:55 +05:00
parent 88046f722d
commit 7515a1314a
2 changed files with 17 additions and 45 deletions
+1 -1
View File
@@ -97,7 +97,7 @@ export const useUserStore = defineStore('user', () => {
try { try {
const response = await apiClient.get('/user/achievements') const response = await apiClient.get('/user/achievements')
console.log("debug /user/achievements " + response.data) console.log("debug /user/achievements " + response.data)
userAchievements.value = response.data userAchievements.value = response.data || []
return { success: true, data: userAchievements.value } return { success: true, data: userAchievements.value }
} catch (error) { } catch (error) {
console.warn('Achievements endpoint not available, using mock data', error) console.warn('Achievements endpoint not available, using mock data', error)
+16 -44
View File
@@ -88,7 +88,7 @@
</div> </div>
<!-- Личные рекорды --> <!-- Личные рекорды -->
<div class="personal-bests-section" v-if="personalBests.length > 0"> <div class="personal-bests-section" v-if="personalBests && personalBests.length > 0">
<h3> Личные рекорды</h3> <h3> Личные рекорды</h3>
<div class="bests-grid"> <div class="bests-grid">
<div v-for="best in personalBests" :key="best.id" class="best-card"> <div v-for="best in personalBests" :key="best.id" class="best-card">
@@ -102,7 +102,7 @@
</div> </div>
<!-- Ближайшие события --> <!-- Ближайшие события -->
<div class="events-section" v-if="upcomingEvents.length > 0"> <div class="events-section" v-if="upcomingEvents && upcomingEvents.length > 0">
<h3>📅 Ближайшие события</h3> <h3>📅 Ближайшие события</h3>
<div class="events-list"> <div class="events-list">
<div v-for="event in upcomingEvents" :key="event.id" class="event-card"> <div v-for="event in upcomingEvents" :key="event.id" class="event-card">
@@ -229,9 +229,9 @@ export default {
}, },
recentAchievements() { recentAchievements() {
return this.userAchievements return this.userAchievements
.filter(a => a.verified) .filter(a => a.verified || a.achieved) // Добавить проверку на achieved
.sort((a, b) => new Date(b.date) - new Date(a.date)) .sort((a, b) => new Date(b.date || b.created_at) - new Date(a.date || a.created_at)) // Добавить fallback
.slice(0, 3) .slice(0, 3);
}, },
achievementProgress() { achievementProgress() {
return this.userStore.achievementProgress return this.userStore.achievementProgress
@@ -349,19 +349,21 @@ export default {
async loadExtendedData() { async loadExtendedData() {
this.statsLoading = true; this.statsLoading = true;
try { try {
const [statsResult, achievementsResult, bestsResult, eventsResult, planResult] = await Promise.all([ // Использовать правильные методы из стора
const [statsResult, achievementsResult, bestsResult, eventsResult, planResult] = await Promise.allSettled([
this.userStore.fetchUserStats(), this.userStore.fetchUserStats(),
this.userStore.fetchUserAchievements(), this.userStore.fetchUserAchievements(),
this.fetchPersonalBests(), this.userStore.fetchPersonalBests(),
this.fetchUpcomingEvents(), this.userStore.fetchUpcomingEvents(),
this.fetchCurrentTrainingPlan() this.userStore.fetchCurrentTrainingPlan()
]); ]);
if (!statsResult.success) console.error('Ошибка статистики:', statsResult.error); // Обработка результатов
if (!achievementsResult.success) console.error('Ошибка достижений:', achievementsResult.error); if (statsResult.status === 'rejected') console.error('Ошибка статистики:', statsResult.reason);
if (!bestsResult.success) console.error('Ошибка рекордов:', bestsResult.error); if (achievementsResult.status === 'rejected') console.error('Ошибка достижений:', achievementsResult.reason);
if (!eventsResult.success) console.error('Ошибка событий:', eventsResult.error); if (bestsResult.status === 'rejected') console.error('Ошибка рекордов:', bestsResult.reason);
if (!planResult.success) console.error('Ошибка плана:', planResult.error); if (eventsResult.status === 'rejected') console.error('Ошибка событий:', eventsResult.reason);
if (planResult.status === 'rejected') console.error('Ошибка плана:', planResult.reason);
} catch (error) { } catch (error) {
console.error('Ошибка загрузки расширенных данных:', 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) { formatTime(minutes) {
if (!minutes) return '0 мин'; if (!minutes) return '0 мин';
const hours = Math.floor(minutes / 60); const hours = Math.floor(minutes / 60);