События: общий рейтинг обновляется у всех, а не только в группе партии
Рейтинг с #80 один на всё приложение: завершённая или удалённая партия двигает топ, историю и профили всех, кто играл после неё, и страницы других групп. Событие match по-прежнему идёт группе партии, остальным активным игрокам — ratings без подробностей о партии. Фронт по обоим сбрасывает все рейтинговые витрины (invalidateRatingViews); participant_ids больше не нужен. #88 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import type { QueryClient } from "@tanstack/react-query";
|
||||
|
||||
export const qk = {
|
||||
me: ["me"] as const,
|
||||
adminMe: ["adminMe"] as const,
|
||||
@@ -30,10 +32,11 @@ export const qk = {
|
||||
};
|
||||
|
||||
/**
|
||||
* Ключи, которые протухают от любой партии: конкретных участников мы не знаем
|
||||
* (событие приходит на всю группу), поэтому инвалидируем по префиксу. Один
|
||||
* список на SSE-обработчик и на завершение партии — иначе переименование ключа
|
||||
* в этом файле тихо разойдётся с местами, где он написан строкой.
|
||||
* Ключи, которые протухают от любой завершённой партии: рейтинг общий и считается по
|
||||
* всей истории (#80), так что партия двигает топ, историю и профили всех, кто играл
|
||||
* после неё. Поэтому инвалидируем по префиксу. Один список на SSE-обработчик и на
|
||||
* мутации партии — иначе переименование ключа тихо разойдётся с местами, где он
|
||||
* написан строкой.
|
||||
*/
|
||||
export const matchAffectedKeys = [
|
||||
qk.home,
|
||||
@@ -42,3 +45,15 @@ export const matchAffectedKeys = [
|
||||
["userMatches"],
|
||||
["publicProfile"],
|
||||
] as const;
|
||||
|
||||
/**
|
||||
* Все рейтинговые витрины, включая статистику любой группы: рейтинг игроков в ней
|
||||
* общий, так что его двигает и партия другой группы (#88). Перезапрашиваются только
|
||||
* открытые на экране запросы, остальные лишь помечаются устаревшими.
|
||||
*/
|
||||
export function invalidateRatingViews(qc: QueryClient) {
|
||||
for (const key of matchAffectedKeys) qc.invalidateQueries({ queryKey: key });
|
||||
qc.invalidateQueries({
|
||||
predicate: (q) => q.queryKey[0] === "group" && q.queryKey[2] === "stats",
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user