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;