import { useEffect, useState } from "react"; import { useParams } from "react-router-dom"; import { ApiError, getPublicRaces } from "../api"; import type { PublicRace } from "../api"; import { formatDistance, formatRaceDate, getRaceStatusClassName, getRaceStatusLabel } from "../lib"; export function PublicProfilePage(): JSX.Element { const { userId } = useParams<{ userId: string }>(); const [races, setRaces] = useState([]); const [error, setError] = useState(""); const [loading, setLoading] = useState(true); useEffect(() => { const ac = new AbortController(); if (!userId) { setError("Страница пользователя не найдена."); setLoading(false); return () => ac.abort(); } void getPublicRaces(userId, { signal: ac.signal }) .then((items) => { if (!ac.signal.aborted) { setRaces(items); } }) .catch((cause) => { if (!ac.signal.aborted) { setError(cause instanceof ApiError ? cause.message : "Не удалось загрузить страницу пользователя."); } }) .finally(() => { if (!ac.signal.aborted) { setLoading(false); } }); return () => ac.abort(); }, [userId]); return (

Публичная страница

Календарь стартов

Опубликованные старты пользователя.

{loading ?

Загружаем…

: null} {error ?

{error}

: null} {!loading && !error && races.length === 0 ?

Пока нет опубликованных стартов.

: null} {!loading && !error && races.length > 0 ? ( ) : null}
); }