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 {
|
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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user