Добавлены новые зависимости, обновлены стили и улучшена структура проекта. Обновлен README с описанием функционала и технологий. Реализована анимация и адаптивный дизайн. Настроена авторизация с использованием Apollo Client.

This commit is contained in:
Bivekich
2025-07-16 18:00:41 +03:00
parent d260749bc9
commit 823ef9a28c
69 changed files with 15539 additions and 210 deletions

View File

@ -0,0 +1,78 @@
interface S3Config {
accessKeyId: string
secretAccessKey: string
region: string
endpoint: string
bucket: string
}
const s3Config: S3Config = {
accessKeyId: 'I6XD2OR7YO2ZN6L6Z629',
secretAccessKey: '9xCOoafisG0aB9lJNvdLO1UuK73fBvMcpHMdijrJ',
region: 'ru-1',
endpoint: 'https://s3.twcstorage.ru',
bucket: '617774af-sfera'
}
export class S3Service {
private static async createSignedUrl(fileName: string, fileType: string): Promise<string> {
// Для простоты пока используем прямую загрузку через fetch
// В продакшене лучше генерировать signed URLs на backend
const timestamp = Date.now()
const key = `avatars/${timestamp}-${fileName}`
return key
}
static async uploadAvatar(file: File, userId: string): Promise<string> {
const fileName = `${userId}-${Date.now()}.${file.name.split('.').pop()}`
const key = `avatars/${fileName}`
try {
// Создаем FormData для загрузки
const formData = new FormData()
formData.append('file', file)
formData.append('key', key)
formData.append('bucket', s3Config.bucket)
// Пока используем простую загрузку через наш API
// Позже можно будет сделать прямую загрузку в S3
const response = await fetch('/api/upload-avatar', {
method: 'POST',
body: formData
})
if (!response.ok) {
throw new Error('Failed to upload avatar')
}
const result = await response.json()
return result.url
} catch (error) {
console.error('Error uploading avatar:', error)
throw error
}
}
static getAvatarUrl(key: string): string {
return `${s3Config.endpoint}/${s3Config.bucket}/${key}`
}
static async deleteAvatar(key: string): Promise<void> {
try {
await fetch('/api/delete-avatar', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ key })
})
} catch (error) {
console.error('Error deleting avatar:', error)
throw error
}
}
}
export default S3Service