feat(app): a wait screen for accounts that wait for the operator (ADR 0021, step 1)

An account signed in or up to on an instance whose operator approves
new accounts, or one suspended, gets no session but a wait: the device
keeps its pass, words and handle in the keyring per instance
(SecureAccountWaitStore, InstanceStorage.waitOf), the auth status is
Waiting, and SessionGate shows WaitScreen in its own app, so the start
screen's sheets go with it. Every sign-in flow hands over to it: the
password's sign-in, sign-up, reset and account reset, SimpleLogin's
sign-in, sign-up and mending; their cubits show no problem then.

The wait screen shows the handle, the four words the operator reads out
for the person to match, and that Halkyon never asks anyone to read them
out (D33); it asks where the wait stands as it opens, every 30 seconds,
as the app comes back and when asked. A new account can be deleted with
its pass, a suspended one can't (ADR 0017). Approved, it leads to the
usual sign-in, once more as before (D31); a pass the instance knows no
more ends the wait. The start screen says where new accounts wait for
approval, and offers no Create an account where the operator takes none;
both refusals (closed, too many waiting) have their words, en and de.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-25 15:29:22 +01:00
commit 7ac715cd97
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -46,6 +46,8 @@
"startOn": "Starte auf {instance}:",
"startOtherInstance": "Andere Instanz verwenden",
"startNoWay": "{instance} bietet keinen Weg, ein Konto zu erstellen.",
"startSignUpsApproved": "Neue Konten auf {instance} warten, bis sie freigegeben werden.",
"startSignUpsClosed": "{instance} nimmt keine neuen Konten an: Melde dich mit deinem an.",
"syncTitle": "Synchronisierung",
"syncNow": "Jetzt synchronisieren",
"syncStateSyncing": "Wird synchronisiert…",
@ -63,6 +65,19 @@
"syncMismatchMore": "Mehr",
"startSignIn": "Anmelden",
"startCreateAccount": "Konto erstellen",
"waitWaiting": "Dein Konto wartet, bis {instance} es freigibt.",
"waitSuspended": "{instance} hat dein Konto gesperrt. Nur wer {instance} betreibt, kann die Sperre aufheben.",
"waitApproved": "{instance} hat dein Konto freigegeben. Melde dich noch einmal an, so wie vorhin.",
"waitEnded": "Diese Registrierung ist beendet: {instance} hat das Konto abgelehnt, oder es hat zu lange gewartet.",
"waitBack": "Zurück zum Start",
"waitMatchingCode": "Kontrollwörter",
"waitMatchingNote": "Wenn dir jemand von {instance} vier Wörter vorliest, prüf, ob es diese sind. Lies sie selbst nie vor: Halkyon bittet niemanden darum.",
"waitCheckNow": "Jetzt nachsehen",
"waitUnreachable": "{instance} war nicht erreichbar. Alle 30 Sekunden wird erneut nachgefragt.",
"waitDelete": "Dieses Konto löschen",
"waitDeleteTitle": "Dieses Konto löschen?",
"waitDeleteMessage": "Es wird mit allem gelöscht, was es hat, und niemand kann sich mehr damit anmelden.",
"waitDeleteFailed": "Das Konto konnte nicht gelöscht werden. Versuch es noch einmal.",
"passwordAddress": "E-Mail-Adresse",
"passwordPassword": "Passwort",
"passwordNewPassword": "Neues Passwort",
@ -200,6 +215,8 @@
"passwordUnusable": "Dieses Passwort geht nicht: Es ist leer oder enthält Zeichen, die kein Text sind.",
"passwordInstanceUnproven": "Die Instanz konnte nicht beweisen, dass sie dein Passwort kennt, daher vertraut dieses Gerät ihr nicht. Versuch es noch einmal; passiert es wieder, ist die Instanz nicht die, die sie zu sein behauptet.",
"passwordKeysMissing": "Die Schlüssel deines Kontos sind nicht auf diesem Gerät. Melde dich hier ab und mit deinem Passwort wieder an.",
"signUpsClosed": "Diese Instanz nimmt keine neuen Konten an.",
"signUpsTooManyWaiting": "Es warten schon so viele neue Konten auf ihre Freigabe, wie dürfen. Versuch es später noch einmal.",
"passwordUnsafeCosts": "Die Instanz wollte dein Passwort auf eine Weise prüfen lassen, die kein Konto nutzt, daher wurde nichts gesendet. Passiert es wieder, ist die Instanz nicht die, die sie zu sein behauptet.",
"passwordFailed": "Die Instanz war nicht erreichbar. Prüf die Verbindung und versuch es noch einmal.",
"passwordMinLength": "Mindestens {count} Zeichen",