const phaseTimes = Object.freeze({ queued: 0, assigned: 800, filling: 2800, review: 5000, }); export function createAgentState(search = "", reduced = false) { const params = new URLSearchParams(search); const capture = params.get("capture") === "1"; const requested = params.get("phase"); const phase = Object.hasOwn(phaseTimes, requested) ? requested : "review"; return { elapsed: reduced ? 5000 : capture ? phaseTimes[phase] : 0, locked: capture || reduced, }; } export function advanceAgent(state, milliseconds, active) { if ( state.locked || !active || !Number.isFinite(milliseconds) || milliseconds < 0 ) return { ...state }; return { ...state, elapsed: Math.min(5000, state.elapsed + milliseconds) }; } export function replayAgent(state) { return state.locked ? { ...state } : { ...state, elapsed: 0 }; } export function describeAgent({ elapsed }) { const phase = elapsed >= 5000 ? "review" : elapsed >= 1700 ? "filling" : elapsed >= 800 ? "assigned" : "queued"; const groups = elapsed >= 3800 ? 3 : elapsed >= 2800 ? 2 : elapsed >= 1700 ? 1 : 0; return { phase, groups }; } export function eligibleAgentVisibility( height, intersectionHeight, viewportHeight, ) { return ( height > 0 && intersectionHeight >= Math.min(height, viewportHeight) / 2 ); }