Whoever operates the instance approves, refuses and suspends accounts
and names other operators in the app (D21 to D24, D34):
- halkyon_app: InstanceOperatorRepository on
ServerpodInstanceOperatorGateway (the module's instanceOperator
endpoint; refusals as OperatorFailed: notFound, isOperator,
lastOperator, notAllowed for 401 and 403, failed), in AppDependencies.
OperatingCubit counts the accounts that wait: asked as the person's
app opens, after every change, and every 5 minutes only while they
operate the instance, so nobody else's app keeps asking.
InstanceOperatorCard (or its tiles) and WaitingAccountsBadge show
nothing at all for anyone else. InstanceOperatorScreen, laid out as
Settings: the accounts that wait, each showing its four words to read
out before Approve (D33), Refuse for new ones after asking; who
operates, Take back after asking, the last always kept; Name an
operator by handle; Find an account by the start of its handle, with
Suspend after asking and Name as operator. English and German texts
("Admin" as the role word in German).
- Learn: the card right after the Sync card in Settings, which the
cogs' count leads to as their dot leads to Sync; the count on the
Settings cogs of Home and Profile.
- Todo: the tiles in the account sheet and the count on its button.
Todo's server is a member, whose `operating()` is always null, so
nothing shows there until it holds the register.
Tests: the gateway's mapping, the repository, both cubits with their
denials, the card, the badge and the screen; Learn's Settings shows the
card and the count to an operator and neither to anyone else.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
136 lines
7 KiB
Dart
136 lines
7 KiB
Dart
/// What every Halkyon app is built around, on an instance's halkyon_base:
|
|
///
|
|
/// - **Instances**: the ones a device keeps an account on, one in use at a
|
|
/// time (`InstanceChoice`), chosen at first start (`FirstStartScreen`) or
|
|
/// added later (`showAccountSwitcher`), each checked before the app moves
|
|
/// there (`InstanceChecker`) and saying where it keeps people's data.
|
|
/// - **Gates**: `InstanceGate` opens the app's dependencies on the instance
|
|
/// in use (`AppDependencies`, `AppScope`); `SessionGate` keeps a person
|
|
/// signed in and asks how to start once signed out (`StartScreen`);
|
|
/// `PersonScope` opens each person's own dependencies. While an account
|
|
/// waits for the instance's operator, `WaitScreen` shows where its wait
|
|
/// stands (Halkyon Learn's ADR 0021, D31).
|
|
/// - **The account and About**: `AccountTiles` for an app's settings,
|
|
/// `showAppAbout` with the source of what the instance runs, and
|
|
/// `resolveAppLocale`, the language every Halkyon app picks.
|
|
/// - **The instance's operators**: `InstanceOperatorCard` (or
|
|
/// `InstanceOperatorTiles`) and `WaitingAccountsBadge` for whoever
|
|
/// operates the instance, on `OperatingCubit`, leading to
|
|
/// `InstanceOperatorScreen`, where accounts are approved, refused and
|
|
/// suspended and operators named (Halkyon Learn's ADR 0021, D21 to D24).
|
|
/// - **Signing in**: with SimpleLogin (ADR 0020: `SimpleLoginRepository`,
|
|
/// its sheet and `SimpleLoginSection`), with a password and TOTP (ADR
|
|
/// 0017: `PasswordRepository`, its sheets and `AccountSecuritySection`),
|
|
/// the session on `AuthRepository` and `ServerpodAuthGateway`, the
|
|
/// account's keys on the device. Every account has a way in: there are no
|
|
/// anonymous ones (ADR 0020, D4).
|
|
/// - **Sync**: `SyncService` on triggers, the changes still waiting, and
|
|
/// where it stands (`SyncStatusBloc`, `SyncStatusCard`, `AppMismatchBanner`,
|
|
/// `SyncTroubleBadge`).
|
|
///
|
|
/// An app gives its name, look and own words as an `AppFrame`, and installs
|
|
/// `HalkyonAppLocalizations.delegate` beside its own.
|
|
library;
|
|
|
|
export 'l10n/halkyon_app_localizations.dart';
|
|
export 'src/app/about.dart';
|
|
export 'src/app/app_frame.dart' show AppFrame, AppFrameScope, LookSettings;
|
|
export 'src/app/app_locale.dart';
|
|
export 'src/app/app_scope.dart';
|
|
export 'src/app/instance_gate.dart';
|
|
export 'src/app/person_scope.dart';
|
|
export 'src/auth/bloc/session_bloc.dart';
|
|
export 'src/auth/bloc/sign_in_ways_cubit.dart';
|
|
export 'src/auth/bloc/wait_cubit.dart';
|
|
export 'src/auth/data/account_wait_store.dart';
|
|
export 'src/auth/data/auth_gateway.dart';
|
|
export 'src/auth/data/auth_repository.dart';
|
|
export 'src/auth/data/serverpod_auth_gateway.dart';
|
|
export 'src/auth/data/sign_in_addresses.dart';
|
|
export 'src/auth/model/account_wait.dart';
|
|
export 'src/auth/model/auth_status.dart';
|
|
export 'src/auth/model/session_grant.dart';
|
|
export 'src/auth/model/sign_in_ways.dart';
|
|
export 'src/auth/model/sign_ups.dart';
|
|
export 'src/auth/widget/account_tiles.dart';
|
|
export 'src/auth/widget/session_gate.dart';
|
|
export 'src/auth/widget/start_screen.dart';
|
|
export 'src/auth/widget/wait_screen.dart';
|
|
export 'src/base/base_client.dart';
|
|
export 'src/files/file_saver.dart';
|
|
export 'src/handle/bloc/handle_check_cubit.dart';
|
|
export 'src/handle/model/handle_problem.dart';
|
|
export 'src/handle/widget/handle_field.dart';
|
|
export 'src/instance/cldr_license.dart';
|
|
export 'src/instance/country_names.dart';
|
|
export 'src/instance/european_union.dart';
|
|
export 'src/instance/flag_icons_license.dart';
|
|
export 'src/instance/instance.dart';
|
|
export 'src/instance/instance_checker.dart';
|
|
export 'src/instance/instance_choice.dart';
|
|
export 'src/instance/instance_locations.dart';
|
|
export 'src/instance/instance_scope.dart';
|
|
export 'src/instance/instance_storage.dart';
|
|
export 'src/instance/instance_store.dart';
|
|
export 'src/instance/subdivision_names.dart';
|
|
export 'src/instance/widget/account_switcher_sheet.dart';
|
|
export 'src/instance/widget/first_start_screen.dart';
|
|
export 'src/instance/widget/instance_location.dart';
|
|
export 'src/instance/widget/instance_location_words.dart';
|
|
export 'src/instance/widget/instance_step.dart';
|
|
export 'src/instance/widget/instance_tile.dart';
|
|
export 'src/operator/bloc/instance_operator_cubit.dart';
|
|
export 'src/operator/bloc/operating_cubit.dart';
|
|
export 'src/operator/data/instance_operator_gateway.dart';
|
|
export 'src/operator/data/instance_operator_repository.dart';
|
|
export 'src/operator/data/serverpod_instance_operator_gateway.dart';
|
|
export 'src/operator/model/operated_account.dart';
|
|
export 'src/operator/widget/instance_operator_card.dart';
|
|
export 'src/operator/widget/instance_operator_screen.dart';
|
|
export 'src/password/bloc/account_recovery_cubit.dart';
|
|
export 'src/password/bloc/account_security_cubit.dart';
|
|
export 'src/password/bloc/account_setup_cubit.dart';
|
|
export 'src/password/bloc/password_sign_in_cubit.dart';
|
|
export 'src/password/data/account_crypto.dart';
|
|
export 'src/password/data/account_key_store.dart';
|
|
export 'src/password/data/password_gateway.dart';
|
|
export 'src/password/data/password_repository.dart';
|
|
export 'src/password/data/serverpod_password_gateway.dart';
|
|
export 'src/password/data/sodium_account_crypto.dart';
|
|
export 'src/password/model/account_authenticator.dart';
|
|
export 'src/password/model/account_security.dart';
|
|
export 'src/password/model/mail_code_purpose.dart';
|
|
export 'src/password/model/password_failed.dart';
|
|
export 'src/password/model/phrase_check.dart';
|
|
export 'src/password/model/unlocked_account_keys.dart';
|
|
export 'src/password/widget/account_recovery_sheet.dart';
|
|
export 'src/password/widget/account_security_section.dart';
|
|
export 'src/password/widget/account_setup_sheet.dart';
|
|
export 'src/password/widget/password_sign_in_sheet.dart';
|
|
export 'src/password/widget/password_texts.dart';
|
|
export 'src/password/widget/password_widgets.dart';
|
|
export 'src/password/widget/secret_screen.dart';
|
|
export 'src/person/person_folders.dart';
|
|
export 'src/privacy/content_cipher.dart';
|
|
export 'src/simplelogin/bloc/simplelogin_cubit.dart';
|
|
export 'src/simplelogin/bloc/simplelogin_standing_cubit.dart';
|
|
export 'src/simplelogin/data/serverpod_simplelogin_gateway.dart';
|
|
export 'src/simplelogin/data/simplelogin_gateway.dart';
|
|
export 'src/simplelogin/data/simplelogin_repository.dart';
|
|
export 'src/simplelogin/model/simplelogin_arrival.dart';
|
|
export 'src/simplelogin/model/simplelogin_failed.dart';
|
|
export 'src/simplelogin/model/simplelogin_standing.dart';
|
|
export 'src/simplelogin/widget/keys_reset.dart';
|
|
export 'src/simplelogin/widget/simplelogin_section.dart';
|
|
export 'src/simplelogin/widget/simplelogin_sheet.dart';
|
|
export 'src/simplelogin/widget/simplelogin_standing_scope.dart';
|
|
export 'src/simplelogin/widget/simplelogin_texts.dart';
|
|
export 'src/sync/app_compatibility.dart';
|
|
export 'src/sync/bloc/sync_status_bloc.dart';
|
|
export 'src/sync/pending_changes_store.dart';
|
|
export 'src/sync/sync_service.dart';
|
|
export 'src/sync/sync_status.dart';
|
|
export 'src/sync/widget/app_mismatch_banner.dart';
|
|
export 'src/sync/widget/sync_and_wait.dart';
|
|
export 'src/sync/widget/sync_status_card.dart';
|
|
export 'src/sync/widget/sync_trouble_badge.dart';
|