/
dmitriysturov
/
workspaces_platform
Обзор
Документация
Войти
/
dmitriysturov
/
workspaces_platform
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
frontend/src/components/ProjectStorageInheritancePanel.tsx
97 строк
4 KB
dmitriysturov
vkr
04 июн 2026, 22:24
04 июн 2026, 22:24
971dfdc
Код
Авторство
О чём код?
import { useEffect, useState } from 'react' import { filesApi } from '../api/filesApi' import type { ProjectStorage, YandexDiskConnection } from '../types' import { friendlyError } from '../utils/format' import { Button } from './ui/Button' type ProjectStorageInheritancePanelProps = { projectId: string workspaceId: string token: string | null canManage: boolean } export function ProjectStorageInheritancePanel({ projectId, workspaceId, token, canManage }: ProjectStorageInheritancePanelProps) { const [workspaceDisk, setWorkspaceDisk] = useState<YandexDiskConnection | null>(null) const [projectStorage, setProjectStorage] = useState<ProjectStorage | null>(null) const [isLoading, setIsLoading] = useState(true) const [isMutating, setIsMutating] = useState(false) const [error, setError] = useState<string | null>(null) async function load() { if (!token) { setIsLoading(false) return } try { setIsLoading(true) setError(null) const [workspaceDiskData, projectStorageData] = await Promise.all([ filesApi.getWorkspaceYandexDisk(token, workspaceId), filesApi.getProjectStorage(token, projectId), ]) setWorkspaceDisk(workspaceDiskData) setProjectStorage(projectStorageData) } catch (err) { setError(friendlyError(err, 'Не удалось загрузить настройки хранилища проекта.')) } finally { setIsLoading(false) } } useEffect(() => { void load() }, [projectId, workspaceId, token]) async function inheritWorkspaceDisk() { if (!token) { return } try { setIsMutating(true) setError(null) setProjectStorage(await filesApi.inheritWorkspaceYandexDisk(token, projectId)) } catch (err) { setError(friendlyError(err, 'Не удалось подключить диск окружения.')) } finally { setIsMutating(false) } } const workspaceConnected = workspaceDisk?.status === 'CONNECTED' const inherited = projectStorage?.storageMode === 'INHERIT_WORKSPACE_YANDEX_DISK' return ( <section className="settings-block"> <header className="section-header"> <div> <h3>Хранилище проекта</h3> <p className="muted">Проект может использовать папку внутри Яндекс.Диска рабочего пространства.</p> </div> </header> {isLoading && <p className="muted">Загружаем настройки хранилища...</p>} {error && <div className="form-error">{error}</div>} {!isLoading && ( <div className="storage-details"> <span>{inherited ? 'Проект использует диск окружения.' : 'Проект использует локальное или собственное хранилище.'}</span> {projectStorage?.folderUrl && ( <a href={projectStorage.folderUrl} target="_blank" rel="noreferrer"> Открыть папку проекта на Яндекс.Диске </a> )} {!workspaceConnected && <span className="muted">Сначала подключите Яндекс.Диск в настройках рабочего пространства.</span>} </div> )} {!isLoading && canManage && ( <div className="settings-actions"> <Button type="button" disabled={!workspaceConnected || inherited || isMutating} onClick={() => void inheritWorkspaceDisk()}> Использовать диск окружения </Button> </div> )} </section> ) }