fix(call-to-play): expire elapsed calls clearly
Deadline completion previously shared the green Ready presentation with a full roster and remained visible forever. An abandoned call therefore looked ready to launch and required its creator to return and cancel it. Give elapsed calls a distinct Time's up state and a five-minute grace period in which the creator can start or extend them. After that, both the reducer and peer store remove the call as a unit. Filled calls remain ready until their deadline, and active calls continue to retain complete history for late joiners. Test Plan: - `just fmt` -- passed - `just clippy` -- passed - `just test` -- passed, 147 peer tests - `just frontend-test` -- passed, 22 tests - `just build` -- passed - `git diff --cached --check` -- passed
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import {
|
||||
CHECKIN_LEAD_MS,
|
||||
EXPIRED_RETENTION_MS,
|
||||
phaseOf,
|
||||
bumpTime,
|
||||
normalizeTimeInput,
|
||||
@@ -89,6 +90,19 @@ Deno.test('call resolves when the roster fills or its deadline elapses', () => {
|
||||
);
|
||||
});
|
||||
|
||||
Deno.test('elapsed calls show as expired briefly and then disappear', () => {
|
||||
const deadline = NOW + 30 * 60_000;
|
||||
const events = [create(null, deadline)];
|
||||
const [expired] = reduceCallToPlayEvents(events, deadline + 1);
|
||||
assert(expired, 'freshly expired call remains visible');
|
||||
assertEquals(statusOf(expired, deadline + 1), 'expired', 'elapsed status');
|
||||
assertEquals(
|
||||
reduceCallToPlayEvents(events, deadline + EXPIRED_RETENTION_MS + 1).length,
|
||||
0,
|
||||
'expired call retention',
|
||||
);
|
||||
});
|
||||
|
||||
Deno.test('creator-only controls cannot be forged by another participant', () => {
|
||||
const forged = [
|
||||
create(),
|
||||
|
||||
Reference in New Issue
Block a user