fix(web): свежий звук сервера виден в настройках и при ошибке списка

`GUILD_SOUNDS_UPDATE` приносит набор звуков целиком, но раздел «Звуки» читает
REST-кэш: клиент инвалидировал запрос вместо того, чтобы положить в кэш сам
payload события. Под нагрузкой повторный `GET /guilds/{id}/sounds` попадает
под лимит частоты (429), а запрос списка идёт с `retry: 0` — список оставался
старым, и новый звук не появлялся в разделе. Так падал пункт 5 матрицы 11.6 в
полной прогонке (build/e2e-all-run8.log, run9): в логах стенда видно
`POST .../sounds 200`, следом `GET .../sounds 200` (первый звук) и
`GET .../sounds 429` (второй) — без единой повторной попытки.

Теперь событие пишет список в кэш запроса, а ошибка перезапроса не прячет уже
полученный список: раздел показывает актуальный набор из снапшота.

Тест: web/tests/soundSettings.test.tsx — звук из `GUILD_SOUNDS_UPDATE`
появляется, когда список по REST отвечает 429.
This commit is contained in:
2026-09-26 15:06:26 +03:00
parent ad7b3d21bb
commit 4175b1436e
3 changed files with 43 additions and 6 deletions
@@ -73,6 +73,9 @@ export function GuildSoundsSection({ guildId }: GuildSoundsSectionProps) {
});
const sounds = list.data ?? [];
// Ошибка перезапроса не должна прятать уже полученный список: под нагрузкой
// ручка отвечает 429, а снапшот события шлюза при этом свежий (7.13).
const failed = list.isError && list.data === undefined;
const soundboard = sounds.filter((sound) => sound.kind === 'soundboard');
const palette = sounds.filter((sound) => sound.kind === 'ui');
const current = kind === 'soundboard' ? soundboard : palette;
@@ -269,7 +272,7 @@ export function GuildSoundsSection({ guildId }: GuildSoundsSectionProps) {
{list.isPending ? (
<SkeletonLines className="mt-4" rows={3} />
) : list.isError ? (
) : failed ? (
<ErrorNotice className="mt-4" error={list.error} onRetry={() => void list.refetch()} />
) : current.length === 0 ? (
<p className="mt-4 text-sm text-fg-muted">{t('settings.servers.sounds.empty')}</p>