8881214213
Mechanical, behaviour-preserving removal of Stage N / TODO-N / phase (RN) references from comments, doc-comments, service READMEs, the current-state docs (ARCHITECTURE, FUNCTIONAL+_ru, TESTING, UI_DESIGN), config-file comments, and the .fbs/.proto schema comments. PLAN.md / PRERELEASE.md / CLAUDE.md keep the stage history. - Rename the only stage-named identifiers: registerStage8 -> registerSocialOps, registerStage11 -> registerLinkOps (gateway transcode). - Split stage6_test.go: TestEmailLoginFlow -> email_test.go, TestGuestAutoMatchLeavesNoStats (+ provisionGuest) -> account_test.go. - Regenerated proto bindings (push.pb.go, telegram_grpc.pb.go) from the de-staged .proto comments; FB Go/TS bindings unchanged (flatc strips schema comments). go build/vet/gofmt clean across modules; integration typecheck and pnpm check green.
40 lines
1.6 KiB
TypeScript
40 lines
1.6 KiB
TypeScript
// Pure grouping + ordering of the lobby's game list. The lobby shows three
|
|
// sections — games awaiting the caller's move, games awaiting the opponent, and finished
|
|
// games — each ordered by last activity: your-turn oldest-first (the longest-neglected on
|
|
// top), the other two newest-first.
|
|
|
|
import type { GameView } from './model';
|
|
|
|
/** isMyTurn reports whether an active game's seat-to-move belongs to the caller. */
|
|
export function isMyTurn(game: GameView, myId: string): boolean {
|
|
const me = game.seats.find((s) => s.accountId === myId);
|
|
return game.status === 'active' && !!me && game.toMove === me.seat;
|
|
}
|
|
|
|
/** LobbyGroups holds the three ordered lobby sections. */
|
|
export interface LobbyGroups {
|
|
yourTurn: GameView[];
|
|
theirTurn: GameView[];
|
|
finished: GameView[];
|
|
}
|
|
|
|
/**
|
|
* groupGames partitions games for myId into the three lobby sections and orders each: the
|
|
* your-turn games by ascending last activity (the longest-waiting first), the opponent-turn
|
|
* and finished games by descending last activity (the most recent first).
|
|
*/
|
|
export function groupGames(games: GameView[], myId: string): LobbyGroups {
|
|
const yourTurn: GameView[] = [];
|
|
const theirTurn: GameView[] = [];
|
|
const finished: GameView[] = [];
|
|
for (const g of games) {
|
|
if (g.status !== 'active') finished.push(g);
|
|
else if (isMyTurn(g, myId)) yourTurn.push(g);
|
|
else theirTurn.push(g);
|
|
}
|
|
yourTurn.sort((a, b) => a.lastActivityUnix - b.lastActivityUnix);
|
|
theirTurn.sort((a, b) => b.lastActivityUnix - a.lastActivityUnix);
|
|
finished.sort((a, b) => b.lastActivityUnix - a.lastActivityUnix);
|
|
return { yourTurn, theirTurn, finished };
|
|
}
|