6e77de4c1e
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 13s
CI / ui (pull_request) Successful in 53s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m26s
Three owner-requested polish changes: - robot: replace the lengthening 60-90 min -> 6 h proactive-nudge ramp with a flat uniform 9-12 h wait before every nudge; the existing sleep-window gate still skips and defers a nudge that would land in the robot's night. - ui: colour the lobby/in-game unread dot by type -- the regular danger colour when a chat message is unread, a softer amber (--warn) when only nudges are. Adds a per-viewer unread_messages flag (chat_messages.kind='message') across the backend DTO, FlatBuffers wire, gateway transcode and the UI store. - ui: float games with any unread notification to the top of the lobby's your-turn and opponent-turn sections (finished keeps its order), reusing the existing unread_chat flag. Docs (ARCHITECTURE 7, FUNCTIONAL + _ru) updated. No DB migration; the new wire field is backward-compatible.
18 lines
921 B
TypeScript
18 lines
921 B
TypeScript
// Pure resolution of the per-game unread dot's kind, kept out of the .svelte components so it can
|
|
// be unit-tested. A game's dot is shown when anything is unread; its colour distinguishes a real
|
|
// chat message (the regular danger colour) from nudge-only unread (a softer nudge colour).
|
|
|
|
/** BadgeKind is the unread dot to show for a game, or null when nothing is unread. */
|
|
export type BadgeKind = 'message' | 'nudge' | null;
|
|
|
|
/**
|
|
* badgeKind picks the unread dot for a game from its two per-viewer flags: null when nothing is
|
|
* unread, 'message' when an unread real chat message is present (the regular colour), else 'nudge'
|
|
* when only nudges are unread (the softer colour). message implies unread, so a stray message=true
|
|
* with unread=false still shows nothing.
|
|
*/
|
|
export function badgeKind(unread: boolean, message: boolean): BadgeKind {
|
|
if (!unread) return null;
|
|
return message ? 'message' : 'nudge';
|
|
}
|