diff --git a/begushiybashkir/bbvue/src/components/AvatarUpload.vue b/begushiybashkir/bbvue/src/components/AvatarUpload.vue new file mode 100644 index 0000000..8579a08 --- /dev/null +++ b/begushiybashkir/bbvue/src/components/AvatarUpload.vue @@ -0,0 +1,232 @@ + + + + + + \ No newline at end of file diff --git a/begushiybashkir/bbvue/src/stores/auth.js b/begushiybashkir/bbvue/src/stores/auth.js index 63ace0d..dd4d74a 100644 --- a/begushiybashkir/bbvue/src/stores/auth.js +++ b/begushiybashkir/bbvue/src/stores/auth.js @@ -2,6 +2,7 @@ import { defineStore } from 'pinia' import { ref, computed } from 'vue' import { apiClient, withLoading } from './helpers/api' +import { handleApiError } from './helpers/api'; export const useAuthStore = defineStore('auth', () => { // State @@ -13,7 +14,7 @@ export const useAuthStore = defineStore('auth', () => { // Getters const isAuthenticated = computed(() => !!token.value && !!user.value) - const userFullName = computed(() => + const userFullName = computed(() => user.value ? `${user.value.firstName} ${user.value.lastName}` : '' ) @@ -37,7 +38,7 @@ export const useAuthStore = defineStore('auth', () => { // Передаем store объект с loading и error return withLoading({ loading, error }, async () => { await apiClient.post('/auth/register', userData) - + // Auto-login after registration const loginResponse = await apiClient.post('/auth/login', { email: userData.email, @@ -95,7 +96,7 @@ export const useAuthStore = defineStore('auth', () => { const initializeAuth = async () => { if (initialized.value || !token.value) return - + initialized.value = true try { @@ -107,6 +108,47 @@ export const useAuthStore = defineStore('auth', () => { } } + const updateAvatar = async (avatarFile) => { + const formData = new FormData() + formData.append('avatar', avatarFile) + + try { + const response = await apiClient.post('/user/avatar/upload', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + + if (response.data.success) { + // Обновляем аватар в сторе + if (user.value) { + user.value.avatar = response.data.avatar + } + return { success: true, avatar: response.data.avatar } + } + } catch (error) { + const result = handleApiError(error) + return result + } +} + +const deleteAvatar = async () => { + try { + const response = await apiClient.delete('/user/avatar/deleteg') + + if (response.data.success) { + // Удаляем аватар из стора + if (user.value) { + user.value.avatar = null + } + return { success: true } + } + } catch (error) { + const result = handleApiError(error) + return result + } +} + return { // State user, @@ -126,6 +168,8 @@ export const useAuthStore = defineStore('auth', () => { fetchProfile, updateProfile, initializeAuth, - clearAuth + clearAuth, + updateAvatar, + deleteAvatar } }) \ No newline at end of file diff --git a/begushiybashkir/bbvue/src/views/Profile.vue b/begushiybashkir/bbvue/src/views/Profile.vue index b183c89..aee541c 100644 --- a/begushiybashkir/bbvue/src/views/Profile.vue +++ b/begushiybashkir/bbvue/src/views/Profile.vue @@ -6,7 +6,7 @@
- Аватар +

{{ user.firstName }} {{ user.lastName }}

Участник с {{ joinDate }}

{{ user.email }}

diff --git a/begushiybashkir/bbvue/src/views/ProfileEdit.vue b/begushiybashkir/bbvue/src/views/ProfileEdit.vue index 5837532..17e4aff 100644 --- a/begushiybashkir/bbvue/src/views/ProfileEdit.vue +++ b/begushiybashkir/bbvue/src/views/ProfileEdit.vue @@ -2,6 +2,11 @@

✏️ Редактирование профиля

+
+

Фотография профиля

+ +
+
Загрузка...
@@ -90,9 +95,13 @@