Preserve timed break when active work reopens
All checks were successful
CI / lint (pull_request) Successful in 2m55s
CI / build-release (pull_request) Successful in 6s
CI / browser-journey (pull_request) Successful in 3m34s
CI / release-candidate (pull_request) Has been skipped

This commit is contained in:
timmy 2026-08-19 18:08:35 +00:00
parent 156d4b0ffc
commit 870edda123
2 changed files with 30 additions and 1 deletions

View File

@ -114,7 +114,8 @@ function createTodayTimer({ storage, getLogin, now = () => Date.now(), onChange
activate(identity) {
if (!key() || typeof identity !== 'string' || !identity) return false;
const state = read();
if (state.active_identity === identity && state.entries[identity]?.running) return true;
if (state.active_identity === identity &&
(state.entries[identity]?.running || validBreak(state)?.identity === identity)) return true;
settle(state);
state.active_identity = identity;
const entry = state.entries[identity] || { elapsed_ms:0, started_at:null, running:false };

View File

@ -65,6 +65,34 @@ process.stdout.write(JSON.stringify(timer.snapshot()));
}
def test_reactivating_the_active_item_during_reload_preserves_its_timed_break():
script = TIMER.read_text() + r"""
const values = new Map();
const storage = {getItem:key=>values.get(key)||null,setItem:(key,value)=>values.set(key,value)};
let now = 100000;
const timer = createTodayTimer({storage,getLogin:()=> 'timmy',now:()=>now});
timer.activate('issue:r:42:');
timer.startBreak(5);
const reopened = timer.activate('issue:r:42:');
process.stdout.write(JSON.stringify({reopened,snapshot:timer.snapshot(),pending:timer.breakSnapshot()}));
"""
assert run_node(script) == {
"reopened": True,
"snapshot": {
"identity": "issue:r:42:",
"elapsed_ms": 0,
"running": False,
"break_deadline_at": 400_000,
},
"pending": {
"identity": "issue:r:42:",
"deadline_at": 400_000,
"expired": False,
},
}
def test_break_expiry_never_restarts_time_and_resume_is_explicit_and_idempotent():
script = TIMER.read_text() + r"""
const values = new Map();