import { useCallback, useEffect, useState } from 'react'; import { Card } from '@consta/uikit/Card'; import { Text } from '@consta/uikit/Text'; import { Badge } from '@consta/uikit/Badge'; import { Button } from '@consta/uikit/Button'; const API_URL = '/api/user-info'; const formatError = (error) => { if (error instanceof Error && error.message) { return error.message; } return 'Не удалось получить данные профиля.'; }; const EmptyState = ({ title, description }) => (
{title} {description ? ( {description} ) : null}
); function App() { const [data, setData] = useState(null); const [status, setStatus] = useState('loading'); const [error, setError] = useState(''); const [reloadKey, setReloadKey] = useState(0); const reload = useCallback(() => { setReloadKey((value) => value + 1); }, []); useEffect(() => { let mounted = true; const controller = new AbortController(); const load = async () => { setStatus('loading'); setError(''); try { const response = await fetch(API_URL, { signal: controller.signal }); if (!response.ok) { throw new Error(`Ошибка загрузки: ${response.status}`); } const payload = await response.json(); if (!mounted) { return; } setData(payload); setStatus('success'); } catch (err) { if (!mounted || err?.name === 'AbortError') { return; } setError(formatError(err)); setStatus('error'); } }; load(); return () => { mounted = false; controller.abort(); }; }, [reloadKey]); if (status === 'loading') { return (
Загрузка профиля Получаем данные о пользователе и доступных ресурсах.
); } if (status === 'error') { return (
Не удалось загрузить данные {error}
); } const roles = data?.roles ?? []; const links = data?.available_links ?? []; const organization = data?.organization; return (
{data?.full_name || 'Пользователь'} {data?.email || 'Email не указан'}
Организация {organization?.name || 'Не указана'}
Роли и доступ Список доступов пользователя внутри организации.
{roles.length ? (
{roles.map((role) => (
{role.description || 'Описание роли отсутствует.'}
))}
) : ( )}
Доступные сервисы Быстрые ссылки на инструменты и ресурсы.
{links.length ? (
{links.map((link) => (
{link.title} {link.description || 'Описание отсутствует'}
Перейти
))}
) : ( )}
); } export default App;