feat(ui): мгновенное открытие партии — предзагрузка идущих партий + кэш черновика без «прыжка» #58
Reference in New Issue
Block a user
Delete Branch "feature/instant-game-open"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что и зачем
Две UX-шероховатости при открытии партии из лобби:
load()).onMountпоказывал полный rack, затемload()отдельным запросомdraftGetперекладывал фишки на доску.Общий корень: полное состояние и черновик не доступны синхронно к первому кадру.
Решение
CachedGame.draft);applyDraftстал синхронным и принимает уже полученный JSON;draftGetушёл в тот жеPromise.all, чтоgame.state+game.history.setCachedGameсохраняет черновик, когда дельта-путь его не передаёт (ход соперника), и очищает на завершённом ходе (зеркалит сервер).lib/preload.tsпрогревает кэш (state+history+draft) для идущих партий лобби с ограниченной конкурентностью (по решению владельца — только идущие; завершённые не греем).После этого открытие из лобби мгновенное, а сохранённая раскладка нарисована на доске уже с первого кадра — без перекладки.
Тесты
gamecache.test.ts(новый) — сохранение/очистка черновика,setCachedDraft.preload.test.ts(новый) — греет идущие незакэшированные, пропускает завершённые/закэшированные.pnpm check,pnpm test:unit(195),pnpm build,pnpm test:e2e(118, Chromium + WebKit).Как посмотреть на контуре
Открыть из лобби несколько идущих партий (в т.ч. с незакоммиченными фишками на доске) — не должно быть ни «подгруза», ни «прыжка» фишек.