Профиль: догрузка истории и счётчик партий в шапке

История запрашивалась без limit/offset, поэтому бэкенд отдавал первые 20 партий, а
страницы рисовали их и молча игнорировали total: у игрока с 40 партиями половина
истории просто не существовала — ни кнопки, ни намёка.

Теперь история грузится страницами по 20, под списком — «Показать ещё». Постранично,
а не одним большим запросом: у эндпоинта потолок limit=100, и на 101-й партии
обрезка вернулась бы. Кнопка живёт в самом компоненте истории, поэтому появилась
сразу и в своём профиле, и в чужом, и в обоих режимах подробности.

Общее число партий вынесено в шапку профиля, к нику. Берём его из статистики, а не
из total истории: в режиме «только лучшая партия» total равен единице, и счётчик
показывал бы «Партий: 1».

#30

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BoiJK9ux8peeyjLb8TYjFf
This commit is contained in:
2026-09-09 20:27:38 +03:00
co-authored by Claude Opus 5
parent f3067b1f89
commit f2aaa2a15e
4 changed files with 76 additions and 15 deletions
+26 -1
View File
@@ -13,14 +13,38 @@ export function MatchHistory({
items,
userId,
detail,
hasMore = false,
loadingMore = false,
onMore,
}: {
items: MatchListItem[];
userId: number;
detail: string;
hasMore?: boolean;
loadingMore?: boolean;
onMore?: () => void;
}) {
const navigate = useNavigate();
const more = hasMore && onMore && (
<button
className="btn btn-ghost btn-block"
style={{ marginTop: 10 }}
onClick={onMore}
disabled={loadingMore}
>
{loadingMore ? "Загружаю…" : "Показать ещё"}
</button>
);
if (items.length === 0) return <div className="muted small">Партий пока нет.</div>;
if (detail === "full") return <MatchListView items={items} />;
if (detail === "full")
return (
<>
<MatchListView items={items} />
{more}
</>
);
return (
<div className="stack">
@@ -55,6 +79,7 @@ export function MatchHistory({
</button>
);
})}
{more}
</div>
);
}