fix(timer): dismiss actually cancels on server + shorter retention
All checks were successful
Deploy / deploy (push) Successful in 3m10s

Bug: после перезагрузки страницы оверлей «Таймер прозвенел» открывался
снова и снова. Две причины:

- dismissTimer в TimerWidget удалял таймер только из локального
  useState, но /data/tablet-timers.json оставался нетронутым. После
  reload таймер возвращался в список и firedRef (которая пустая после
  reload) снова триггерила alarm.
- lib/timers.ts держал просроченные таймеры 30 минут, давая им шанс
  повторно сработать при каждом reload в этом окне.

Фикс:
- dismissTimer теперь POST /api/voice/timer {action:cancel, id} через
  cookie auth (endpoint с прошлого коммита принимает и cookie, и bearer).
- Retention в listActive снижена до 30 секунд — этого хватает чтобы
  клиент увидел свежий звонок; старше = самоудаление.
- TimerWidget клиентский фильтр тоже 30 секунд.
This commit is contained in:
Cosmo
2026-04-23 13:58:53 +00:00
parent e2b2a5d82f
commit fa583cd279
2 changed files with 18 additions and 10 deletions

View File

@@ -28,8 +28,10 @@ function save(list: Timer[]) {
}
function cleanup(list: Timer[]): Timer[] {
// Drop items expired more than 30 min ago
const cutoff = Date.now() - 30 * 60 * 1000
// Drop items expired more than 30 seconds ago. Достаточно чтобы показать
// «звенит» при активной странице, но не воскрешать alarm после перезагрузки
// через час.
const cutoff = Date.now() - 30 * 1000
return list.filter(t => new Date(t.endsAt).getTime() > cutoff)
}