From 14dbdbbc737003f2d01803c8e8b33afd21d5d571 Mon Sep 17 00:00:00 2001 From: NaiJi Date: Fri, 8 Sep 2023 02:54:28 -0300 Subject: [PATCH 1/5] feat: Implement dialogue to choose an domain from several during installation --- .../initializing/domain_setup_cubit.dart | 11 ++--- .../server_installation_repository.dart | 2 +- .../dns_providers/digital_ocean_dns.dart | 11 +++-- .../setup/initializing/initializing.dart | 41 ++++++++++++++++--- 4 files changed, 50 insertions(+), 15 deletions(-) diff --git a/lib/logic/cubit/forms/setup/initializing/domain_setup_cubit.dart b/lib/logic/cubit/forms/setup/initializing/domain_setup_cubit.dart index f4597439..bccbc551 100644 --- a/lib/logic/cubit/forms/setup/initializing/domain_setup_cubit.dart +++ b/lib/logic/cubit/forms/setup/initializing/domain_setup_cubit.dart @@ -18,13 +18,11 @@ class DomainSetupCubit extends Cubit { } else if (result.data.length == 1) { emit(Loaded(result.data.first)); } else { - emit(MoreThenOne()); + emit(MoreThenOne(result.data)); } } - Future saveDomain() async { - assert(state is Loaded, 'wrong state'); - final String domainName = (state as Loaded).domain; + Future saveDomain(final String domainName) async { emit(Loading(LoadingTypes.saving)); final dnsProvider = ProvidersController.currentDnsProvider!; @@ -45,7 +43,10 @@ class Initial extends DomainSetupState {} class Empty extends DomainSetupState {} -class MoreThenOne extends DomainSetupState {} +class MoreThenOne extends DomainSetupState { + MoreThenOne(this.domains); + final List domains; +} class Loading extends DomainSetupState { Loading(this.type); diff --git a/lib/logic/cubit/server_installation/server_installation_repository.dart b/lib/logic/cubit/server_installation/server_installation_repository.dart index 4018c7b9..30bccfd5 100644 --- a/lib/logic/cubit/server_installation/server_installation_repository.dart +++ b/lib/logic/cubit/server_installation/server_installation_repository.dart @@ -209,7 +209,7 @@ class ServerInstallationRepository { return false; } - return domain == domainResult.data[0]; + return domainResult.data.contains(domain); } Future> isDnsAddressesMatch( diff --git a/lib/logic/providers/dns_providers/digital_ocean_dns.dart b/lib/logic/providers/dns_providers/digital_ocean_dns.dart index 4fac4b65..f4dd23bd 100644 --- a/lib/logic/providers/dns_providers/digital_ocean_dns.dart +++ b/lib/logic/providers/dns_providers/digital_ocean_dns.dart @@ -59,10 +59,13 @@ class DigitalOceanDnsProvider extends DnsProvider { } domains = result.data - .map( - (final el) => el.name, - ) - .toList(); + .map( + (final el) => el.name, + ) + .toList() + + + /// TODO: OH MY GOD DON"T YOU DARE NOT REMOVING IT NAIJI NAIJIIII DON'T FORGET PLEASE I BET YOU + ['stub.test']; return GenericResult( success: true, diff --git a/lib/ui/pages/setup/initializing/initializing.dart b/lib/ui/pages/setup/initializing/initializing.dart index 4e9b1a78..db6f9af2 100644 --- a/lib/ui/pages/setup/initializing/initializing.dart +++ b/lib/ui/pages/setup/initializing/initializing.dart @@ -354,9 +354,39 @@ class InitializingPage extends StatelessWidget { style: Theme.of(context).textTheme.bodyMedium, ), if (state is MoreThenOne) - Text( - 'initializing.found_more_domains'.tr(), - style: Theme.of(context).textTheme.bodyMedium, + ...state.domains.map( + (final domain) => Column( + children: [ + SizedBox( + width: double.infinity, + child: Card( + clipBehavior: Clip.antiAlias, + child: InkResponse( + highlightShape: BoxShape.rectangle, + onTap: () => context + .read() + .saveDomain(domain), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + domain, + style: Theme.of(context) + .textTheme + .headlineMedium, + ), + ], + ), + ), + ), + ), + ), + const SizedBox(height: 8), + ], + ), ), if (state is Loaded) ...[ Row( @@ -401,8 +431,9 @@ class InitializingPage extends StatelessWidget { if (state is Loaded) ...[ const SizedBox(height: 32), BrandButton.filled( - onPressed: () => - context.read().saveDomain(), + onPressed: () => context + .read() + .saveDomain(state.domain), text: 'initializing.save_domain'.tr(), ), ], From afa83f0d29a3a971a6025d8eb6b78d5982d1c2ac Mon Sep 17 00:00:00 2001 From: NaiJi Date: Fri, 8 Sep 2023 03:08:02 -0300 Subject: [PATCH 2/5] chore: I embarrassed myself... --- .../providers/dns_providers/digital_ocean_dns.dart | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/logic/providers/dns_providers/digital_ocean_dns.dart b/lib/logic/providers/dns_providers/digital_ocean_dns.dart index f4dd23bd..4fac4b65 100644 --- a/lib/logic/providers/dns_providers/digital_ocean_dns.dart +++ b/lib/logic/providers/dns_providers/digital_ocean_dns.dart @@ -59,13 +59,10 @@ class DigitalOceanDnsProvider extends DnsProvider { } domains = result.data - .map( - (final el) => el.name, - ) - .toList() + - - /// TODO: OH MY GOD DON"T YOU DARE NOT REMOVING IT NAIJI NAIJIIII DON'T FORGET PLEASE I BET YOU - ['stub.test']; + .map( + (final el) => el.name, + ) + .toList(); return GenericResult( success: true, From 062fa725c43b316b54d014bbf85e1466449af71d Mon Sep 17 00:00:00 2001 From: Inex Code Date: Fri, 8 Sep 2023 09:38:08 +0300 Subject: [PATCH 3/5] fix(ui): DNS API key support page was using old code --- lib/ui/components/drawers/support_drawer.dart | 4 ++-- .../initializing/dns_provider_picker.dart | 21 ++++--------------- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/lib/ui/components/drawers/support_drawer.dart b/lib/ui/components/drawers/support_drawer.dart index 7b4c5c2b..01fc292d 100644 --- a/lib/ui/components/drawers/support_drawer.dart +++ b/lib/ui/components/drawers/support_drawer.dart @@ -16,8 +16,8 @@ class SupportDrawer extends StatelessWidget { return Drawer( width: 440, child: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(8.0), + child: SafeArea( + minimum: const EdgeInsets.all(8.0), child: Column( children: [ Row( diff --git a/lib/ui/pages/setup/initializing/dns_provider_picker.dart b/lib/ui/pages/setup/initializing/dns_provider_picker.dart index 772c093e..69560f5c 100644 --- a/lib/ui/pages/setup/initializing/dns_provider_picker.dart +++ b/lib/ui/pages/setup/initializing/dns_provider_picker.dart @@ -2,11 +2,10 @@ import 'package:cubit_form/cubit_form.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:selfprivacy/config/brand_theme.dart'; import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart'; import 'package:selfprivacy/logic/cubit/forms/setup/initializing/dns_provider_form_cubit.dart'; +import 'package:selfprivacy/logic/cubit/support_system/support_system_cubit.dart'; import 'package:selfprivacy/logic/models/hive/server_domain.dart'; -import 'package:selfprivacy/ui/components/brand_md/brand_md.dart'; import 'package:selfprivacy/ui/components/buttons/brand_button.dart'; import 'package:selfprivacy/ui/components/buttons/outlined_button.dart'; import 'package:selfprivacy/ui/components/cards/outlined_card.dart'; @@ -125,22 +124,10 @@ class ProviderInputDataPage extends StatelessWidget { const SizedBox(height: 10), BrandOutlinedButton( child: Text('initializing.how'.tr()), - onPressed: () => showModalBottomSheet( - context: context, - isScrollControlled: true, - backgroundColor: Colors.transparent, - builder: (final BuildContext context) => Padding( - padding: paddingH15V0, - child: ListView( - padding: const EdgeInsets.symmetric(vertical: 16), - children: [ - BrandMarkdown( - fileName: providerInfo.pathToHow, - ), - ], + onPressed: () => context.read().showArticle( + article: providerInfo.pathToHow, + context: context, ), - ), - ), ), ], ); From d5fa841747cf229fa82f82263299d91f3f40add5 Mon Sep 17 00:00:00 2001 From: Inex Code Date: Fri, 8 Sep 2023 09:57:57 +0300 Subject: [PATCH 4/5] chore: Remove unused 'cloudflare_api_token' translation string --- assets/translations/az.json | 3 +-- assets/translations/be.json | 3 +-- assets/translations/cs.json | 3 +-- assets/translations/de.json | 3 +-- assets/translations/en.json | 1 - assets/translations/pl.json | 3 +-- assets/translations/ru.json | 3 +-- assets/translations/sk.json | 3 +-- assets/translations/uk.json | 3 +-- 9 files changed, 8 insertions(+), 17 deletions(-) diff --git a/assets/translations/az.json b/assets/translations/az.json index aae7107a..14551e57 100644 --- a/assets/translations/az.json +++ b/assets/translations/az.json @@ -300,7 +300,6 @@ "manage_domain_dns": "Domeninizin DNS-ni idarə etmək üçün", "use_this_domain": "Biz bu domendən istifadə edirik?", "use_this_domain_text": "Göstərdiyiniz token bu domen üzərində nəzarəti təmin edir", - "cloudflare_api_token": "CloudFlare API Açarı", "connect_backblaze_storage": "Backblaze bulud yaddaşınızı birləşdirin", "no_connected_domains": "Hazırda heç bir bağlı domen yoxdur", "loading_domain_list": "Domenlərin siyahısı yüklənir", @@ -500,4 +499,4 @@ "reset_onboarding_description": "Enerji ekranını yenidən göstərmək üçün güc açarının sıfırlanması", "cubit_statuses": "Yükləmə kubitlərinin cari vəziyyəti" } -} \ No newline at end of file +} diff --git a/assets/translations/be.json b/assets/translations/be.json index c6dbf7e9..453ba2d9 100644 --- a/assets/translations/be.json +++ b/assets/translations/be.json @@ -32,7 +32,6 @@ "manage_domain_dns": "Для кіравання DNS вашага дамена", "use_this_domain": "Ужываем гэты дамен?", "use_this_domain_text": "Указаны вамі токен дае кантроль над гэтым даменам", - "cloudflare_api_token": "API ключ DNS правайдэра", "connect_backblaze_storage": "Падлучыце хмарнае сховішча Backblaze", "no_connected_domains": "У дадзены момант падлучаных даменаў няма", "loading_domain_list": "Загружаем спіс даменаў", @@ -510,4 +509,4 @@ "support": { "title": "Падтрымка SelfPrivacy" } -} \ No newline at end of file +} diff --git a/assets/translations/cs.json b/assets/translations/cs.json index 5186b74e..edb3c13f 100644 --- a/assets/translations/cs.json +++ b/assets/translations/cs.json @@ -144,7 +144,6 @@ "found_more_domains": "Nalezeno více než jedna doména. V zájmu vlastní bezpečnosti vás prosíme o odstranění nepotřebných domén", "server_created": "Vytvořený server. Probíhá kontrola DNS a spouštění serveru…", "choose_server_type_notice": "Důležité je zaměřit se na procesor a paměť RAM. Data vašich služeb budou uložena na připojeném svazku, který lze snadno rozšířit a za který se platí zvlášť.", - "cloudflare_api_token": "Klíč API poskytovatele DNS", "connect_backblaze_storage": "Připojení úložiště Backblaze", "save_domain": "Uložit doménu", "final": "Závěrečný krok", @@ -510,4 +509,4 @@ "ignore_tls": "Nekontrolujte certifikáty TLS", "ignore_tls_description": "Aplikace nebude při připojování k serveru ověřovat certifikáty TLS." } -} \ No newline at end of file +} diff --git a/assets/translations/de.json b/assets/translations/de.json index 86cc3518..f5505d8e 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -278,7 +278,6 @@ "manage_domain_dns": "Zum Verwalten des DNS Ihrer Domain", "use_this_domain": "Diese Domäne verwenden?", "use_this_domain_text": "Das von Ihnen bereitgestellte Token gewährt Zugriff auf die folgende Domäne", - "cloudflare_api_token": "API-Schlüssel des DNS-Anbieters", "connect_backblaze_storage": "Backblaze-Speicher verbinden", "no_connected_domains": "Derzeit keine verbundenen Domains", "loading_domain_list": "Domänenliste wird geladen", @@ -510,4 +509,4 @@ "ignore_tls": "Überprüfen Sie keine TLS-Zertifikate", "ignore_tls_description": "Die Anwendung validiert TLS-Zertifikate nicht, wenn sie eine Verbindung zum Server herstellt." } -} \ No newline at end of file +} diff --git a/assets/translations/en.json b/assets/translations/en.json index 4ba733ac..cb2ccc3b 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -370,7 +370,6 @@ "manage_domain_dns": "To manage your domain's DNS", "use_this_domain": "Use this domain?", "use_this_domain_text": "The token you provided gives access to the following domain", - "cloudflare_api_token": "DNS Provider API Token", "connect_backblaze_storage": "Connect Backblaze storage", "no_connected_domains": "No connected domains at the moment", "loading_domain_list": "Loading domain list", diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 5a90cc86..45c48293 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -321,7 +321,6 @@ "choose_server_type_payment_per_month": "{} miesięcznie", "no_server_types_found": "Nie znaleziono dostępnych typów serwerów! Proszę upewnić się, że masz dostęp do dostawcy serwera...", "use_this_domain": "Kto używa ten domen?", - "cloudflare_api_token": "Klucz API dostawcy DNS", "connect_backblaze_storage": "Dodajcie Blackblaze", "no_connected_domains": "Niema podłączonych domenów", "what": "Co to znaczy?", @@ -509,4 +508,4 @@ "cubit_statuses": "Aktualny stan qubitów ładujących", "ignore_tls": "Używane podczas konfigurowania nowego serwera." } -} \ No newline at end of file +} diff --git a/assets/translations/ru.json b/assets/translations/ru.json index d5c27d86..052b76c9 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -350,7 +350,6 @@ "manage_domain_dns": "Для управления DNS вашего домена", "use_this_domain": "Используем этот домен?", "use_this_domain_text": "Указанный вами токен даёт контроль над этим доменом", - "cloudflare_api_token": "API ключ DNS провайдера", "connect_backblaze_storage": "Подключите облачное хранилище Backblaze", "no_connected_domains": "На данный момент подлюченных доменов нет", "loading_domain_list": "Загружаем список доменов", @@ -540,4 +539,4 @@ "ignore_tls_description": "Приложение не будет проверять сертификаты TLS при подключении к серверу.", "ignore_tls": "Не проверять сертификаты TLS" } -} \ No newline at end of file +} diff --git a/assets/translations/sk.json b/assets/translations/sk.json index c79d251e..7b447173 100644 --- a/assets/translations/sk.json +++ b/assets/translations/sk.json @@ -280,7 +280,6 @@ "enter_username_and_password": "Zadajte používateľské meno a zložité heslo", "finish": "Všetko je inicializované", "use_this_domain_text": "Token, ktorý ste poskytli, poskytuje prístup k nasledujúcej doméne", - "cloudflare_api_token": "CloudFlare API Token", "connect_backblaze_storage": "Pripojte svoje cloudové úložisko Backblaze", "no_connected_domains": "Momentálne nie sú pripojené žiadne domény", "loading_domain_list": "Načítava sa zoznam domén", @@ -500,4 +499,4 @@ "reset_onboarding_description": "Resetovanie vypínača na opätovné zobrazenie obrazovky zapnutia", "cubit_statuses": "Aktuálny stav načítavania qubitov" } -} \ No newline at end of file +} diff --git a/assets/translations/uk.json b/assets/translations/uk.json index d3384ca5..af472df4 100644 --- a/assets/translations/uk.json +++ b/assets/translations/uk.json @@ -134,7 +134,6 @@ "select_dns": "Тепер давайте оберемо DNS-провайдера", "manage_domain_dns": "Для управління DNS домену", "use_this_domain": "Скористатися цим доменом?", - "cloudflare_api_token": "CloudFlare API токен", "connect_backblaze_storage": "Підключити Backblaze сховище", "no_connected_domains": "Наразі немає пов'язаних доменів", "save_domain": "Зберегти домен", @@ -469,4 +468,4 @@ "root_name": "Не може бути 'root'", "length_not_equal": "Довжина [], має бути {}" } -} \ No newline at end of file +} From 031ad474172b1c23273f471860bb35124de3f865 Mon Sep 17 00:00:00 2001 From: Inex Code Date: Fri, 8 Sep 2023 15:41:12 +0300 Subject: [PATCH 5/5] refactor(ui): Domain selection refresh --- assets/translations/en.json | 2 + .../setup/initializing/domain_picker.dart | 163 ++++++++++++++++++ .../setup/initializing/initializing.dart | 125 +------------- 3 files changed, 167 insertions(+), 123 deletions(-) create mode 100644 lib/ui/pages/setup/initializing/domain_picker.dart diff --git a/assets/translations/en.json b/assets/translations/en.json index cb2ccc3b..99c8d209 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -370,6 +370,8 @@ "manage_domain_dns": "To manage your domain's DNS", "use_this_domain": "Use this domain?", "use_this_domain_text": "The token you provided gives access to the following domain", + "multiple_domains_found": "Multiple domains found", + "multiple_domains_found_text": "The token you provided gives access to the following domains. Please select the one you want to use. For the security of your other domains, you should restrict this token's access to only the domain you want to use with SelfPrivacy.", "connect_backblaze_storage": "Connect Backblaze storage", "no_connected_domains": "No connected domains at the moment", "loading_domain_list": "Loading domain list", diff --git a/lib/ui/pages/setup/initializing/domain_picker.dart b/lib/ui/pages/setup/initializing/domain_picker.dart new file mode 100644 index 00000000..1d64349c --- /dev/null +++ b/lib/ui/pages/setup/initializing/domain_picker.dart @@ -0,0 +1,163 @@ +import 'package:cubit_form/cubit_form.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart'; +import 'package:selfprivacy/logic/cubit/forms/setup/initializing/domain_setup_cubit.dart'; +import 'package:selfprivacy/ui/components/buttons/brand_button.dart'; +import 'package:selfprivacy/ui/components/cards/outlined_card.dart'; +import 'package:selfprivacy/ui/layouts/responsive_layout_with_infobox.dart'; + +class DomainPicker extends StatefulWidget { + const DomainPicker({ + super.key, + }); + + @override + State createState() => _DomainPickerState(); +} + +class _DomainPickerState extends State { + String? selectedDomain; + + @override + Widget build(final BuildContext context) { + final DomainSetupState state = context.watch().state; + + return ResponsiveLayoutWithInfobox( + topChild: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + (state is MoreThenOne) + ? 'initializing.multiple_domains_found'.tr() + : 'initializing.use_this_domain'.tr(), + style: Theme.of(context).textTheme.headlineSmall, + ), + const SizedBox(height: 16), + Text( + (state is MoreThenOne) + ? 'initializing.multiple_domains_found_text'.tr() + : 'initializing.use_this_domain_text'.tr(), + style: Theme.of(context).textTheme.bodyMedium, + ), + ], + ), + primaryColumn: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (state is Empty) + Text( + 'initializing.no_connected_domains'.tr(), + style: Theme.of(context).textTheme.bodyMedium, + ), + if (state is Loading) + Text( + state.type == LoadingTypes.loadingDomain + ? 'initializing.loading_domain_list'.tr() + : 'basis.saving'.tr(), + style: Theme.of(context).textTheme.bodyMedium, + ), + if (state is MoreThenOne) + ...state.domains.map( + (final domain) => Column( + children: [ + SizedBox( + width: double.infinity, + child: OutlinedCard( + borderColor: domain == selectedDomain + ? Theme.of(context).colorScheme.primary + : null, + borderWidth: domain == selectedDomain ? 3 : 1, + child: InkResponse( + highlightShape: BoxShape.rectangle, + onTap: () => setState(() { + selectedDomain = domain; + }), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Radio( + value: domain, + groupValue: selectedDomain, + onChanged: (final String? value) { + setState(() { + selectedDomain = value; + }); + }, + ), + Text( + domain, + style: Theme.of(context).textTheme.bodyLarge, + ), + ], + ), + ), + ), + ), + ), + const SizedBox(height: 8), + // Button to select and save domain + ], + ), + ), + if (state is MoreThenOne) + BrandButton.filled( + onPressed: (selectedDomain != null && + state.domains.contains(selectedDomain)) + ? () => context + .read() + .saveDomain(selectedDomain!) + : null, + child: Text('initializing.use_this_domain'.tr()), + ), + if (state is Loaded) ...[ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + state.domain, + style: Theme.of(context).textTheme.headlineMedium?.copyWith( + color: Theme.of(context).colorScheme.onBackground, + ), + textAlign: TextAlign.center, + ), + ], + ), + ], + if (state is Empty) ...[ + const SizedBox(height: 30), + BrandButton.filled( + onPressed: () => context.read().load(), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon( + Icons.refresh, + color: Colors.white, + ), + const SizedBox(width: 10), + Text( + 'domain.update_list'.tr(), + style: Theme.of(context).textTheme.bodyLarge, + ), + ], + ), + ), + ], + if (state is Loaded) ...[ + const SizedBox(height: 32), + BrandButton.filled( + onPressed: () => + context.read().saveDomain(state.domain), + text: 'initializing.save_domain'.tr(), + ), + ], + ], + ), + ); + } +} diff --git a/lib/ui/pages/setup/initializing/initializing.dart b/lib/ui/pages/setup/initializing/initializing.dart index db6f9af2..60088ea3 100644 --- a/lib/ui/pages/setup/initializing/initializing.dart +++ b/lib/ui/pages/setup/initializing/initializing.dart @@ -18,6 +18,7 @@ import 'package:selfprivacy/ui/components/progress_bar/progress_bar.dart'; import 'package:selfprivacy/ui/components/drawers/support_drawer.dart'; import 'package:selfprivacy/ui/layouts/responsive_layout_with_infobox.dart'; import 'package:selfprivacy/ui/pages/setup/initializing/dns_provider_picker.dart'; +import 'package:selfprivacy/ui/pages/setup/initializing/domain_picker.dart'; import 'package:selfprivacy/ui/pages/setup/initializing/server_provider_picker.dart'; import 'package:selfprivacy/ui/pages/setup/initializing/server_type_picker.dart'; import 'package:selfprivacy/ui/pages/setup/recovering/recovery_routing.dart'; @@ -319,129 +320,7 @@ class InitializingPage extends StatelessWidget { Widget _stepDomain(final ServerInstallationCubit initializingCubit) => BlocProvider( create: (final context) => DomainSetupCubit(initializingCubit)..load(), - child: Builder( - builder: (final context) { - final DomainSetupState state = - context.watch().state; - return ResponsiveLayoutWithInfobox( - topChild: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'initializing.use_this_domain'.tr(), - style: Theme.of(context).textTheme.headlineSmall, - ), - const SizedBox(height: 16), - Text( - 'initializing.use_this_domain_text'.tr(), - style: Theme.of(context).textTheme.bodyMedium, - ), - ], - ), - primaryColumn: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (state is Empty) - Text( - 'initializing.no_connected_domains'.tr(), - style: Theme.of(context).textTheme.bodyMedium, - ), - if (state is Loading) - Text( - state.type == LoadingTypes.loadingDomain - ? 'initializing.loading_domain_list'.tr() - : 'basis.saving'.tr(), - style: Theme.of(context).textTheme.bodyMedium, - ), - if (state is MoreThenOne) - ...state.domains.map( - (final domain) => Column( - children: [ - SizedBox( - width: double.infinity, - child: Card( - clipBehavior: Clip.antiAlias, - child: InkResponse( - highlightShape: BoxShape.rectangle, - onTap: () => context - .read() - .saveDomain(domain), - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - domain, - style: Theme.of(context) - .textTheme - .headlineMedium, - ), - ], - ), - ), - ), - ), - ), - const SizedBox(height: 8), - ], - ), - ), - if (state is Loaded) ...[ - Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - state.domain, - style: Theme.of(context) - .textTheme - .headlineMedium - ?.copyWith( - color: - Theme.of(context).colorScheme.onBackground, - ), - textAlign: TextAlign.center, - ), - ], - ), - ], - if (state is Empty) ...[ - const SizedBox(height: 30), - BrandButton.filled( - onPressed: () => context.read().load(), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Icon( - Icons.refresh, - color: Colors.white, - ), - const SizedBox(width: 10), - Text( - 'domain.update_list'.tr(), - style: Theme.of(context).textTheme.bodyLarge, - ), - ], - ), - ), - ], - if (state is Loaded) ...[ - const SizedBox(height: 32), - BrandButton.filled( - onPressed: () => context - .read() - .saveDomain(state.domain), - text: 'initializing.save_domain'.tr(), - ), - ], - ], - ), - ); - }, - ), + child: DomainPicker(), ); Widget _stepUser(final ServerInstallationCubit initializingCubit) =>