modified: serv_nginx/bbvue/src/stores/user.js
modified: serv_nginx/bbvue/src/views/Profile.vue fix some bag
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
</div>
|
||||
|
||||
<!-- Личные рекорды -->
|
||||
<div class="personal-bests-section" v-if="personalBests.length > 0">
|
||||
<div class="personal-bests-section" v-if="personalBests && personalBests.length > 0">
|
||||
<h3>⭐ Личные рекорды</h3>
|
||||
<div class="bests-grid">
|
||||
<div v-for="best in personalBests" :key="best.id" class="best-card">
|
||||
@@ -102,7 +102,7 @@
|
||||
</div>
|
||||
|
||||
<!-- Ближайшие события -->
|
||||
<div class="events-section" v-if="upcomingEvents.length > 0">
|
||||
<div class="events-section" v-if="upcomingEvents && upcomingEvents.length > 0">
|
||||
<h3>📅 Ближайшие события</h3>
|
||||
<div class="events-list">
|
||||
<div v-for="event in upcomingEvents" :key="event.id" class="event-card">
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user