fix timers
lint / ruff (push) Failing after 15s
tests / desktop (push) Successful in 21s
tests / web (push) Successful in 46s
docker / image (push) Failing after 1m31s
tests / android-core (push) Successful in 1m5s
tests / backend (push) Successful in 2m33s
android / apk (push) Successful in 4m34s

This commit is contained in:
timka123 committed 2026-10-27 18:52:54 +03:00
1 parent ff77d8f89f
commit 157a113c39
30 files changed
+3331 -419

No files matched your search

+9 -2
View File
@@ -63,11 +63,18 @@ def resume(session: DbSession, settings: Settings) -> dict:
@router.post("/complete")
def complete(body: CompleteTimerRequest, session: DbSession, settings: Settings) -> dict:
try:
finished, follow_on = pomodoro.complete(session, settings, auto_next=body.auto_next)
finished, follow_on = pomodoro.complete(
session,
settings,
auto_next=body.auto_next,
expect_id=body.session_id,
)
except pomodoro.TimerError as exc:
raise HTTPException(status_code=400, detail=str(exc)) from exc
celebration = _maybe_celebrate(session, settings) if finished.is_work else None
# `finished` is None when the named interval was no longer the running one:
# nothing happened, so there is nothing to celebrate and nothing to announce.
celebration = _maybe_celebrate(session, settings) if finished and finished.is_work else None
state = pomodoro.state(session, settings)
state["finished"] = pomodoro.session_dict(finished)
state["auto_started"] = pomodoro.session_dict(follow_on)
+10
View File
@@ -29,6 +29,16 @@ class AttachTaskRequest(BaseModel):
class CompleteTimerRequest(BaseModel):
auto_next: bool = True
session_id: int | None = None
"""Which interval the client believes it is finishing.
Every client ticks its own local countdown and calls `complete` when it
reaches zero, so with two of them open (the phone and the desktop, say)
both fire within the same second. Unconditionally, the second call lands
on whatever `auto_next` has just started and ends *that* — which is why a
break could vanish the instant it began. Sent along, a stale call is a
no-op instead. Omitted, the old unconditional behaviour stands.
"""
class TaskCreateRequest(BaseModel):