feat(app): signing in with SimpleLogin, its sheet and the start screen's offer (ADR 0020)
All checks were successful
CI / check (push) Successful in 31m49s
CI / deploy (push) Has been skipped

Where the instance offers SimpleLogin, the start screen offers it first,
saying that the instance keeps only the SimpleLogin ID, and opens a sheet
that waits for SimpleLogin's page in the browser (Cancel ends the wait),
then: for someone new, the choice between creating an account (the
suggested handle or another, checked with the instance, the password
twice, the recovery phrase shown once and three of its words typed back,
nothing reaching the instance before) and linking theirs again with its
handle and recovery phrase; for an account, its password opening its
keys; for an account of before, the keys made with the handle it lacks.
SimpleLoginCubit holds the steps, each refusal shown where it is mended
(a handle's on the handle, a sign-in to begin again on the browser's),
and closing the sheet stops waiting on the loopback.

The suggested handle is never checked: the instance suggests none that
anybody has, and every answer about a handle counts against its limit
(D5). The fake's handle rule is now the module's.

Learn and Todo build it with SimpleLogin's browser (halkyon_oidc_flutter,
now a direct dependency of both, with their names on the loopback's
page), their schemes and their loopback ports (43823, 43824), as the
instance's forwarding page has them. Their tests offer no SimpleLogin;
halkyon_app's test the sheet.

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-24 01:21:29 +02:00
commit 3a93dc4fd8
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -894,6 +894,144 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
@override
String get passwordSignedInBefore =>
'Only a device signed in since then can dismiss this warning: sign in again on this one, or change your password.';
@override
String get simpleLoginContinue => 'Continue with SimpleLogin';
@override
String simpleLoginNote(String instance) {
return 'SimpleLogin is Proton\'s sign-in, and a Proton account works there too. It learns that you use $instance, which keeps only your SimpleLogin ID: your name suggests a handle once, and nothing else is kept.';
}
@override
String get simpleLoginTitle => 'Sign in with SimpleLogin';
@override
String get simpleLoginAddTitle => 'Add SimpleLogin';
@override
String get simpleLoginInBrowser => 'Continue in your browser.';
@override
String get simpleLoginNewcomerTitle => 'New here?';
@override
String simpleLoginNewcomerIntro(String instance) {
return 'Your SimpleLogin account has no account on $instance yet.';
}
@override
String get simpleLoginCreateHint =>
'Choose a handle and a password; you get a recovery phrase.';
@override
String get simpleLoginHaveOne => 'I already have one';
@override
String get simpleLoginHaveOneHint =>
'Link it again with your handle and your recovery phrase.';
@override
String get simpleLoginHandleIntro =>
'Others find you by your handle. It stays private until you publish something or fill in your profile, and can change until your first publish.';
@override
String get simpleLoginHandle => 'Handle';
@override
String simpleLoginHandleFree(String handle) {
return '@$handle is free';
}
@override
String get simpleLoginPasswordIntro =>
'Choose a password: you type it when you sign in on another device. It never leaves this device: the instance can\'t read it, and can\'t reset it without what it protects being lost.';
@override
String get simpleLoginCreate => 'Create the account';
@override
String get simpleLoginUnlockTitle => 'Your password';
@override
String simpleLoginUnlockIntroAs(String handle) {
return 'Signed in with SimpleLogin as @$handle. Your password opens your keys on this device.';
}
@override
String get simpleLoginUnlockIntro =>
'Signed in with SimpleLogin. Your password opens your keys on this device.';
@override
String get simpleLoginOpen => 'Open';
@override
String get simpleLoginMendTitle => 'Link your account';
@override
String get simpleLoginMendIntro =>
'Your SimpleLogin account isn\'t the one your account knows any more. Link them again with your handle and your recovery phrase: your other devices are then signed out.';
@override
String get simpleLoginMend => 'Link';
@override
String get simpleLoginWrongPassword => 'The password isn\'t right.';
@override
String get simpleLoginMendDoesNotFit =>
'The handle or the recovery phrase isn\'t right.';
@override
String get simpleLoginUnavailable =>
'This instance doesn\'t offer sign-in with SimpleLogin.';
@override
String get simpleLoginDenied =>
'SimpleLogin\'s sign-in was declined, so nothing was shared.';
@override
String get simpleLoginNoBrowser =>
'There\'s no browser to open SimpleLogin\'s page in.';
@override
String get simpleLoginStartAgain =>
'The sign-in took too long, or another one took its place. Begin it again.';
@override
String get simpleLoginRejected =>
'SimpleLogin didn\'t confirm the sign-in. Begin it again.';
@override
String get simpleLoginProviderUnavailable =>
'The instance can\'t reach SimpleLogin right now. Try again later.';
@override
String get simpleLoginTakenByAnotherPerson =>
'This SimpleLogin account belongs to another account here.';
@override
String get simpleLoginOtherIdentityLinked =>
'Your account has another SimpleLogin account already.';
@override
String get simpleLoginTooManyAttempts =>
'Too many sign-ins began from this network. Try again in an hour.';
@override
String get simpleLoginHandleInvalid =>
'A handle is 1 to 30 letters (a to z), digits or underscores.';
@override
String get simpleLoginHandleReserved =>
'This handle is kept for the instance.';
@override
String get simpleLoginHandleTaken => 'Someone else has this handle.';
@override
String get simpleLoginTooManyHandleChecks =>
'Too many handles were tried. Try again in an hour.';
}
/// The translations for English, as used in the United Kingdom (`en_GB`).