feat(autosave): grava por ociosidade (10s padrão, configurável) e em silêncio

- debounce de 1,5s → 10s SEM nenhuma alteração (cada tecla reinicia);
  seletor 5/10/30/60s no diálogo de Preferências (autosaveDelay, clamp 5–120)
- autosave silencioso: sem toast, só o status 'salvando…/salvo'; Ctrl+S
  manual mantém o toast com o hash da revisão
- flush de pendências ao trocar de aba do app e em visibilitychange=hidden
  /pagehide (melhor esforço) — nada se perde ao sair antes do idle
- README atualizado
This commit is contained in:
lgcosta committed 2026-11-04 17:33:30 -03:00
1 parent 993b341fc1
commit 11fc26390d
3 files changed
+35 -9

No files matched your search

+6 -3
View File
@@ -100,9 +100,12 @@ ocupa a tela inteira; menus e toolbar rolam horizontalmente com botões só de
automaticamente o diálogo *Conflito de edição* (recarregar | salvar por cima). A própria
sessão que salvou ignora o evento; reconexão do `EventSource` é automática e o fallback
continua sendo a checagem no foco da janela.
- **Autosave**: ligado por padrão — após ~1,5 s sem digitar, a alteração é salva como revisão
`autosave` (rascunho novo vira nota criada automaticamente; status *"salvando…"* na barra).
Desligável em Preferências. Conflitos durante autosave pausam o ciclo até a resolução.
- **Autosave por ociosidade**: só grava após um período **sem nenhuma alteração** — padrão
**10 s**, configurável (5/10/30/60 s em Preferências); cada tecla reinicia a contagem, então
digitação contínua nunca é interrompida por gravações. Silencioso (sem toast — apenas o
status *"salvando…/salvo"*; toast continua no `Ctrl+S` manual). A gravação também é feita
ao **trocar de aba do app** ou ao **minimizar/trocar de janela** (`visibilitychange`/
`pagehide`), para não perder edição pendente. Conflitos pausam o ciclo até a resolução.
- **Sincronia entre dispositivos** (celular + desktop no mesmo servidor):
- Cada aba lembra o hash em que se baseia (`base_hash`). Ao salvar, se o servidor mudou desde
então, a API responde **409** e a UI abre o diálogo **Conflito de edição** com as duas saídas: