/
dmitriysturov
/
workspaces_platform
Обзор
Документация
Войти
/
dmitriysturov
/
workspaces_platform
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
frontend/src/hooks/useWorkspaces.ts
99 строк
3 KB
dmitriysturov
vkr
04 июн 2026, 22:24
04 июн 2026, 22:24
971dfdc
Код
Авторство
О чём код?
import { useCallback, useEffect, useState } from 'react' import { ApiError } from '../api/client' import { workspaceApi } from '../api/workspaceApi' import type { Workspace, WorkspaceCreateRequest, WorkspaceUpdateRequest } from '../types' export function useWorkspaces(token: string | null) { const [items, setItems] = useState<Workspace[]>([]) const [isLoading, setIsLoading] = useState(true) const [isMutating, setIsMutating] = useState(false) const [error, setError] = useState<string | null>(null) const load = useCallback(async () => { if (!token) { setItems([]) setError(null) setIsLoading(false) return } try { setIsLoading(true) setError(null) setItems(await workspaceApi.getMyWorkspaces(token)) } catch (err) { setItems([]) setError(err instanceof ApiError ? err.message : 'Не удалось загрузить рабочие пространства.') } finally { setIsLoading(false) } }, [token]) const createWorkspace = useCallback( async (data: WorkspaceCreateRequest) => { if (!token) { throw new ApiError('Требуется авторизация.', 401) } setIsMutating(true) try { const created = await workspaceApi.createWorkspace(token, data) setItems((current) => [created, ...current]) return created } finally { setIsMutating(false) } }, [token], ) const updateWorkspace = useCallback( async (id: string, data: WorkspaceUpdateRequest) => { if (!token) { throw new ApiError('Требуется авторизация.', 401) } setIsMutating(true) try { const updated = await workspaceApi.updateWorkspace(token, id, data) setItems((current) => current.map((workspace) => (workspace.id === id ? updated : workspace))) return updated } finally { setIsMutating(false) } }, [token], ) const deleteWorkspace = useCallback( async (id: string) => { if (!token) { throw new ApiError('Требуется авторизация.', 401) } setIsMutating(true) try { await workspaceApi.deleteWorkspace(token, id) setItems((current) => current.filter((workspace) => workspace.id !== id)) } finally { setIsMutating(false) } }, [token], ) useEffect(() => { void load() }, [load]) useEffect(() => { function handleFocus() { void load() } window.addEventListener('focus', handleFocus) return () => window.removeEventListener('focus', handleFocus) }, [load]) return { items, isLoading, isMutating, error, refetch: load, createWorkspace, updateWorkspace, deleteWorkspace } }