Geef de toestemmingspoort een uitweg zonder akkoord (#1207) #1212

Merged
brenno merged 3 commits from fix/1207-consent-exit into main 2026-08-04 12:42:01 +00:00
Owner

Wat

Fix voor #1207: op Windows zat een gebruiker die de voorwaarden bij de eerste
start niet accepteerde klem — geen weg vooruit of terug, alleen de app killen.

Waarom het vastliep

configureNativeWindow zet setPreventClose(true), en alleen de shell
(AppShell.onWindowClose) handelt dat sluiten weer af. Zolang de
toestemmingspoort in beeld is, draait de shell nog niet — dus de kruis-knop
deed niets en er was geen uitgang.

De fix

  • quitApp() in de native-window-laag: windowManager.destroy() op desktop,
    no-op op web (native_window_io.dart / native_window_stub.dart).
  • Op desktop een knop "Niet akkoord en afsluiten" onder "Akkoord gaan" in
    ConsentDialog. De knop hangt bewust niet van het vinkje af — hij is er
    juist voor wie niet instemt. Op web valt de knop weg: een tabblad sluiten
    werkt daar altijd en een pagina kan zichzelf niet betrouwbaar afsluiten.
  • Nieuwe interfacetekst vertaald naar alle 31 talen (via make add-l10n).

Regressietest

test/consent_and_license_test.dart → "een uitweg blijft open zonder akkoord
(#1207)": pint dat de afsluitknop aanwezig én bruikbaar is terwijl "Akkoord
gaan" nog grijs is. De knop rendert op de macOS-testhost omdat isDesktopNative
op Platform.isMacOS steunt. Het feitelijke afsluiten (windowManager.destroy)
valt buiten flutter test — dat is een platformkanaal — dus de test borgt de
uitweg-affordance, niet de OS-aanroep zelf.

Poorten

  • make check — groen (format, analyze, conventies, methodelengte, dode code,
    hardcoded-text, comment-language, volledige testsuite, dekkingsvloer 87,7%).
  • make check-secrets — schoon (gitleaks + trufflehog, geen leaks).
  • make sast — schoon (semgrep, 0 findings).

Bewaker

Bewust overgeslagen: deze wijziging raakt geen bestandsformaat, opslag,
afhankelijkheid, uitgaand verkeer of publieke belofte. Ze voegt enkel een
uitweg toe aan de toestemmingspoort en verzwakt geen enkele belofte (de
gebruiker kan nu juist wél weigeren).

## Wat Fix voor #1207: op Windows zat een gebruiker die de voorwaarden bij de eerste start niet accepteerde klem — geen weg vooruit of terug, alleen de app killen. ## Waarom het vastliep `configureNativeWindow` zet `setPreventClose(true)`, en alleen de shell (`AppShell.onWindowClose`) handelt dat sluiten weer af. Zolang de toestemmingspoort in beeld is, draait de shell nog niet — dus de kruis-knop deed niets en er was geen uitgang. ## De fix - `quitApp()` in de native-window-laag: `windowManager.destroy()` op desktop, no-op op web (`native_window_io.dart` / `native_window_stub.dart`). - Op desktop een knop **"Niet akkoord en afsluiten"** onder "Akkoord gaan" in `ConsentDialog`. De knop hangt bewust *niet* van het vinkje af — hij is er juist voor wie niet instemt. Op web valt de knop weg: een tabblad sluiten werkt daar altijd en een pagina kan zichzelf niet betrouwbaar afsluiten. - Nieuwe interfacetekst vertaald naar alle 31 talen (via `make add-l10n`). ## Regressietest `test/consent_and_license_test.dart` → "een uitweg blijft open zonder akkoord (#1207)": pint dat de afsluitknop aanwezig én bruikbaar is terwijl "Akkoord gaan" nog grijs is. De knop rendert op de macOS-testhost omdat `isDesktopNative` op `Platform.isMacOS` steunt. Het feitelijke afsluiten (`windowManager.destroy`) valt buiten `flutter test` — dat is een platformkanaal — dus de test borgt de uitweg-affordance, niet de OS-aanroep zelf. ## Poorten - `make check` — groen (format, analyze, conventies, methodelengte, dode code, hardcoded-text, comment-language, volledige testsuite, dekkingsvloer 87,7%). - `make check-secrets` — schoon (gitleaks + trufflehog, geen leaks). - `make sast` — schoon (semgrep, 0 findings). ## Bewaker Bewust overgeslagen: deze wijziging raakt geen bestandsformaat, opslag, afhankelijkheid, uitgaand verkeer of publieke belofte. Ze voegt enkel een uitweg toe aan de toestemmingspoort en verzwakt geen enkele belofte (de gebruiker kan nu juist wél weigeren).
Op Windows zet configureNativeWindow setPreventClose(true), en alleen de
shell (AppShell.onWindowClose) handelt dat sluiten weer af. Zolang de poort
in beeld is draait de shell nog niet, dus de kruis-knop deed niets: wie de
voorwaarden niet accepteerde zat klem. Voeg quitApp() toe aan de
native-window-laag (destroy op desktop, no-op op web) en zet op desktop een
knop 'Niet akkoord en afsluiten' onder de akkoord-knop. Die knop hangt
bewust niet van het vinkje af, want hij is er juist voor wie niet instemt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Changelog: uitweg uit de toestemmingspoort (#1207)
All checks were successful
scans / scans (pull_request) Successful in 1m58s
static-gate / static-gate (pull_request) Successful in 3m51s
14ab033fa3
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit 2470ef1313 into main 2026-08-04 12:42:01 +00:00
Sign in to join this conversation.
No description provided.