From 4db0413c425cf45d81f188b19f0566e0e21193aa Mon Sep 17 00:00:00 2001 From: Inex Code Date: Sun, 5 Jun 2022 22:36:32 +0300 Subject: [PATCH] Linting --- analysis_options.yaml | 37 ++ lib/config/bloc_config.dart | 42 +- lib/config/bloc_observer.dart | 9 +- lib/config/brand_colors.dart | 24 +- lib/config/brand_theme.dart | 10 +- lib/config/get_it_config.dart | 2 +- lib/config/hive_config.dart | 18 +- lib/config/localization.dart | 10 +- lib/config/text_themes.dart | 32 +- lib/logic/api_maps/api_map.dart | 28 +- lib/logic/api_maps/backblaze.dart | 44 +- lib/logic/api_maps/cloudflare.dart | 140 +++-- lib/logic/api_maps/hetzner.dart | 114 ++-- lib/logic/api_maps/server.dart | 191 +++---- .../authentication_dependend_cubit.dart | 6 +- .../app_settings/app_settings_cubit.dart | 14 +- .../app_settings/app_settings_state.dart | 4 +- lib/logic/cubit/backups/backups_cubit.dart | 56 +- lib/logic/cubit/backups/backups_state.dart | 18 +- lib/logic/cubit/devices/devices_cubit.dart | 24 +- lib/logic/cubit/devices/devices_state.dart | 16 +- .../cubit/dns_records/dns_records_cubit.dart | 48 +- .../cubit/dns_records/dns_records_state.dart | 28 +- .../forms/factories/field_cubit_factory.dart | 24 +- .../initializing/backblaze_form_cubit.dart | 6 +- .../initializing/cloudflare_form_cubit.dart | 8 +- .../setup/initializing/domain_cloudflare.dart | 18 +- .../initializing/hetzner_form_cubit.dart | 8 +- .../initializing/root_user_form_cubit.dart | 6 +- .../recovery_device_form_cubit.dart | 4 +- .../recovery_domain_form_cubit.dart | 10 +- .../cubit/forms/user/ssh_form_cubit.dart | 12 +- .../cubit/forms/user/user_form_cubit.dart | 12 +- .../cubit/forms/validations/validations.dart | 23 +- .../hetzner_metrics_cubit.dart | 12 +- .../hetzner_metrics_repository.dart | 22 +- .../hetzner_metrics_state.dart | 2 + lib/logic/cubit/jobs/jobs_cubit.dart | 42 +- lib/logic/cubit/jobs/jobs_state.dart | 6 +- .../cubit/providers/providers_cubit.dart | 4 +- .../cubit/providers/providers_state.dart | 14 +- .../recovery_key/recovery_key_cubit.dart | 18 +- .../recovery_key/recovery_key_state.dart | 12 +- .../server_detailed_info_cubit.dart | 6 +- .../server_detailed_info_repository.dart | 14 +- .../server_detailed_info_state.dart | 14 +- .../server_installation_cubit.dart | 496 ++++++++++-------- .../server_installation_repository.dart | 250 ++++----- .../server_installation_state.dart | 141 ++--- lib/logic/cubit/services/services_cubit.dart | 6 +- lib/logic/cubit/services/services_state.dart | 38 +- lib/logic/cubit/users/users_cubit.dart | 132 ++--- lib/logic/cubit/users/users_state.dart | 16 +- lib/logic/get_it/api_config.dart | 16 +- lib/logic/get_it/console.dart | 4 +- lib/logic/get_it/navigation.dart | 12 +- lib/logic/models/hive/backblaze_bucket.dart | 6 +- .../models/hive/backblaze_credential.dart | 12 +- lib/logic/models/hive/server_details.dart | 4 +- lib/logic/models/hive/server_domain.dart | 4 +- lib/logic/models/hive/user.dart | 6 +- lib/logic/models/hive/user.g.dart | 12 +- lib/logic/models/job.dart | 13 +- lib/logic/models/json/api_token.dart | 6 +- .../models/json/auto_upgrade_settings.dart | 10 +- lib/logic/models/json/backup.dart | 12 +- lib/logic/models/json/device_token.dart | 6 +- lib/logic/models/json/dns_records.dart | 2 +- .../models/json/hetzner_server_info.dart | 58 +- .../models/json/recovery_token_status.dart | 8 +- .../models/json/server_configurations.dart | 8 +- lib/logic/models/message.dart | 4 +- lib/logic/models/provider.dart | 4 +- lib/logic/models/server_basic_info.dart | 53 +- lib/logic/models/server_status.dart | 12 +- lib/logic/models/timezone_settings.dart | 22 +- lib/main.dart | 36 +- lib/theming/factory/app_theme_factory.dart | 35 +- .../action_button/action_button.dart | 8 +- .../components/brand_alert/brand_alert.dart | 10 +- .../brand_bottom_sheet.dart | 10 +- .../components/brand_button/brand_button.dart | 37 +- .../brand_button/filled_button.dart | 6 +- .../components/brand_cards/brand_cards.dart | 94 ++-- .../brand_divider/brand_divider.dart | 6 +- .../components/brand_header/brand_header.dart | 10 +- .../brand_hero_screen/brand_hero_screen.dart | 12 +- .../components/brand_icons/brand_icons.dart | 2 +- .../components/brand_loader/brand_loader.dart | 6 +- lib/ui/components/brand_md/brand_md.dart | 16 +- .../components/brand_radio/brand_radio.dart | 12 +- .../brand_radio_tile/brand_radio_tile.dart | 8 +- .../brand_span_button/brand_span_button.dart | 16 +- .../components/brand_switch/brand_switch.dart | 8 +- .../brand_tab_bar/brand_tab_bar.dart | 12 +- lib/ui/components/brand_text/brand_text.dart | 180 +++---- .../components/brand_timer/brand_timer.dart | 22 +- .../dots_indicator/dots_indicator.dart | 10 +- lib/ui/components/error/error.dart | 6 +- .../icon_status_mask/icon_status_mask.dart | 8 +- .../components/jobs_content/jobs_content.dart | 25 +- .../not_ready_card/not_ready_card.dart | 8 +- lib/ui/components/one_page/one_page.dart | 10 +- .../components/pre_styled_buttons/close.dart | 6 +- .../components/pre_styled_buttons/flash.dart | 22 +- .../pre_styled_buttons/flash_fab.dart | 41 +- .../pre_styled_buttons.dart | 2 +- .../components/progress_bar/progress_bar.dart | 46 +- .../components/switch_block/switch_bloc.dart | 10 +- lib/ui/helpers/modals.dart | 4 +- .../pages/backup_details/backup_details.dart | 40 +- lib/ui/pages/devices/devices.dart | 26 +- lib/ui/pages/devices/new_device.dart | 14 +- lib/ui/pages/dns_details/dns_details.dart | 26 +- lib/ui/pages/more/about/about.dart | 8 +- .../pages/more/app_settings/app_setting.dart | 58 +- lib/ui/pages/more/console/console.dart | 18 +- lib/ui/pages/more/info/info.dart | 14 +- lib/ui/pages/more/more.dart | 26 +- lib/ui/pages/onboarding/onboarding.dart | 32 +- lib/ui/pages/providers/providers.dart | 32 +- lib/ui/pages/recovery_key/recovery_key.dart | 53 +- .../recovery_key/recovery_key_receiving.dart | 9 +- lib/ui/pages/root_route.dart | 12 +- lib/ui/pages/server_details/chart.dart | 34 +- lib/ui/pages/setup/initializing.dart | 4 +- .../recovering/recover_by_new_device_key.dart | 12 +- .../recovering/recover_by_old_token.dart | 23 +- .../recovering/recover_by_recovery_key.dart | 12 +- .../recovery_confirm_backblaze.dart | 20 +- .../recovery_confirm_cloudflare.dart | 24 +- .../recovering/recovery_confirm_server.dart | 6 +- .../recovery_hentzner_connected.dart | 14 +- lib/utils/extensions/duration.dart | 12 +- lib/utils/extensions/elevation_extension.dart | 22 +- lib/utils/extensions/text_extensions.dart | 32 +- lib/utils/password_generator.dart | 34 +- lib/utils/route_transitions/basic.dart | 10 +- lib/utils/route_transitions/slide_bottom.dart | 22 +- lib/utils/route_transitions/slide_right.dart | 22 +- lib/utils/ui_helpers.dart | 2 +- test/widget_test.dart | 46 +- 142 files changed, 2047 insertions(+), 2001 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 11ccd2ae..4aab61a8 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -12,6 +12,7 @@ include: package:flutter_lints/flutter.yaml analyzer: exclude: - lib/generated_plugin_registrant.dart + - lib/**.g.dart linter: # The lint rules applied to this project can be customized in the @@ -28,6 +29,42 @@ linter: rules: avoid_print: false # Uncomment to disable the `avoid_print` rule prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + always_use_package_imports: true + invariant_booleans: true + no_adjacent_strings_in_list: true + unnecessary_statements: true + always_declare_return_types: true + always_put_required_named_parameters_first: true + always_put_control_body_on_new_line: true + always_specify_types: true + avoid_escaping_inner_quotes: true + avoid_setters_without_getters: true + eol_at_end_of_file: true + prefer_constructors_over_static_methods: true + prefer_expression_function_bodies: true + prefer_final_in_for_each: true + prefer_final_locals: true + prefer_final_parameters: true + prefer_foreach: true + prefer_if_elements_to_conditional_expressions: true + prefer_mixin: true + prefer_null_aware_method_calls: true + require_trailing_commas: true + sized_box_shrink_expand: true + sort_constructors_first: true + unnecessary_await_in_return: true + unnecessary_lambdas: true + unnecessary_null_checks: true + unnecessary_parenthesis: true + use_enums: true + use_if_null_to_convert_nulls_to_bools: true + use_is_even_rather_than_modulo: true + use_late_for_private_fields_and_variables: true + use_named_constants: true + use_setters_to_change_properties: true + use_string_buffers: true + use_super_parameters: true + use_to_and_as_if_applicable: true # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options diff --git a/lib/config/bloc_config.dart b/lib/config/bloc_config.dart index 9fce0383..f800a4e2 100644 --- a/lib/config/bloc_config.dart +++ b/lib/config/bloc_config.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:selfprivacy/logic/cubit/devices/devices_cubit.dart'; @@ -12,38 +14,38 @@ import 'package:selfprivacy/logic/cubit/services/services_cubit.dart'; import 'package:selfprivacy/logic/cubit/users/users_cubit.dart'; class BlocAndProviderConfig extends StatelessWidget { - const BlocAndProviderConfig({Key? key, this.child}) : super(key: key); + const BlocAndProviderConfig({final super.key, this.child}); final Widget? child; @override - Widget build(BuildContext context) { - var isDark = false; - var serverInstallationCubit = ServerInstallationCubit()..load(); - var usersCubit = UsersCubit(serverInstallationCubit); - var servicesCubit = ServicesCubit(serverInstallationCubit); - var backupsCubit = BackupsCubit(serverInstallationCubit); - var dnsRecordsCubit = DnsRecordsCubit(serverInstallationCubit); - var recoveryKeyCubit = RecoveryKeyCubit(serverInstallationCubit); - var apiDevicesCubit = ApiDevicesCubit(serverInstallationCubit); + Widget build(final BuildContext context) { + const bool isDark = false; + final ServerInstallationCubit serverInstallationCubit = ServerInstallationCubit()..load(); + final UsersCubit usersCubit = UsersCubit(serverInstallationCubit); + final ServicesCubit servicesCubit = ServicesCubit(serverInstallationCubit); + final BackupsCubit backupsCubit = BackupsCubit(serverInstallationCubit); + final DnsRecordsCubit dnsRecordsCubit = DnsRecordsCubit(serverInstallationCubit); + final RecoveryKeyCubit recoveryKeyCubit = RecoveryKeyCubit(serverInstallationCubit); + final ApiDevicesCubit apiDevicesCubit = ApiDevicesCubit(serverInstallationCubit); return MultiProvider( providers: [ BlocProvider( - create: (_) => AppSettingsCubit( + create: (final _) => AppSettingsCubit( isDarkModeOn: isDark, isOnboardingShowing: true, )..load(), ), - BlocProvider(create: (_) => serverInstallationCubit, lazy: false), - BlocProvider(create: (_) => ProvidersCubit()), - BlocProvider(create: (_) => usersCubit..load(), lazy: false), - BlocProvider(create: (_) => servicesCubit..load(), lazy: false), - BlocProvider(create: (_) => backupsCubit..load(), lazy: false), - BlocProvider(create: (_) => dnsRecordsCubit..load()), - BlocProvider(create: (_) => recoveryKeyCubit..load()), - BlocProvider(create: (_) => apiDevicesCubit..load()), + BlocProvider(create: (final _) => serverInstallationCubit, lazy: false), + BlocProvider(create: (final _) => ProvidersCubit()), + BlocProvider(create: (final _) => usersCubit..load(), lazy: false), + BlocProvider(create: (final _) => servicesCubit..load(), lazy: false), + BlocProvider(create: (final _) => backupsCubit..load(), lazy: false), + BlocProvider(create: (final _) => dnsRecordsCubit..load()), + BlocProvider(create: (final _) => recoveryKeyCubit..load()), + BlocProvider(create: (final _) => apiDevicesCubit..load()), BlocProvider( - create: (_) => + create: (final _) => JobsCubit(usersCubit: usersCubit, servicesCubit: servicesCubit), ), ], diff --git a/lib/config/bloc_observer.dart b/lib/config/bloc_observer.dart index c53f5961..56fa5a32 100644 --- a/lib/config/bloc_observer.dart +++ b/lib/config/bloc_observer.dart @@ -1,15 +1,18 @@ +// ignore_for_file: always_specify_types + +import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:selfprivacy/ui/components/error/error.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart'; -import './get_it_config.dart'; +import 'package:selfprivacy/config/get_it_config.dart'; class SimpleBlocObserver extends BlocObserver { SimpleBlocObserver(); @override - void onError(BlocBase bloc, Object error, StackTrace stackTrace) { - final navigator = getIt.get().navigator!; + void onError(final BlocBase bloc, final Object error, final StackTrace stackTrace) { + final NavigatorState navigator = getIt.get().navigator!; navigator.push( materialRoute( diff --git a/lib/config/brand_colors.dart b/lib/config/brand_colors.dart index a06b8895..f6866c2d 100644 --- a/lib/config/brand_colors.dart +++ b/lib/config/brand_colors.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:flutter/material.dart'; class BrandColors { @@ -20,8 +22,8 @@ class BrandColors { static const Color green2 = Color(0xFF0F8849); - static get navBackgroundLight => white.withOpacity(0.8); - static get navBackgroundDark => black.withOpacity(0.8); + static Color get navBackgroundLight => white.withOpacity(0.8); + static Color get navBackgroundDark => black.withOpacity(0.8); static const List uninitializedGradientColors = [ Color(0xFF555555), @@ -41,14 +43,14 @@ class BrandColors { Color(0xFFEFD135), ]; - static const primary = blue; - static const headlineColor = black; - static const inactive = gray2; - static const scaffoldBackground = gray3; - static const inputInactive = gray4; + static const Color primary = blue; + static const Color headlineColor = black; + static const Color inactive = gray2; + static const Color scaffoldBackground = gray3; + static const Color inputInactive = gray4; - static const textColor1 = black; - static const textColor2 = gray1; - static const dividerColor = gray5; - static const warning = red1; + static const Color textColor1 = black; + static const Color textColor2 = gray1; + static const Color dividerColor = gray5; + static const Color warning = red1; } diff --git a/lib/config/brand_theme.dart b/lib/config/brand_theme.dart index 5837748b..9487fe5c 100644 --- a/lib/config/brand_theme.dart +++ b/lib/config/brand_theme.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:selfprivacy/config/text_themes.dart'; -import 'brand_colors.dart'; +import 'package:selfprivacy/config/brand_colors.dart'; -final lightTheme = ThemeData( +final ThemeData lightTheme = ThemeData( useMaterial3: true, primaryColor: BrandColors.primary, fontFamily: 'Inter', @@ -52,7 +52,7 @@ final lightTheme = ThemeData( ), ); -var darkTheme = lightTheme.copyWith( +ThemeData darkTheme = lightTheme.copyWith( brightness: Brightness.dark, scaffoldBackgroundColor: const Color(0xFF202120), iconTheme: const IconThemeData(color: BrandColors.gray3), @@ -82,6 +82,6 @@ var darkTheme = lightTheme.copyWith( ), ); -const paddingH15V30 = EdgeInsets.symmetric(horizontal: 15, vertical: 30); +const EdgeInsets paddingH15V30 = EdgeInsets.symmetric(horizontal: 15, vertical: 30); -const paddingH15V0 = EdgeInsets.symmetric(horizontal: 15); +const EdgeInsets paddingH15V0 = EdgeInsets.symmetric(horizontal: 15); diff --git a/lib/config/get_it_config.dart b/lib/config/get_it_config.dart index 1b9fd1f0..6961ea94 100644 --- a/lib/config/get_it_config.dart +++ b/lib/config/get_it_config.dart @@ -9,7 +9,7 @@ export 'package:selfprivacy/logic/get_it/console.dart'; export 'package:selfprivacy/logic/get_it/navigation.dart'; export 'package:selfprivacy/logic/get_it/timer.dart'; -final getIt = GetIt.instance; +final GetIt getIt = GetIt.instance; Future getItSetup() async { getIt.registerSingleton(NavigationService()); diff --git a/lib/config/hive_config.dart b/lib/config/hive_config.dart index e3db5dc7..f4d67c7c 100644 --- a/lib/config/hive_config.dart +++ b/lib/config/hive_config.dart @@ -24,15 +24,15 @@ class HiveConfig { await Hive.openBox(BNames.appSettingsBox); - var cipher = HiveAesCipher( - await getEncryptedKey(BNames.serverInstallationEncryptionKey)); + final HiveAesCipher cipher = HiveAesCipher( + await getEncryptedKey(BNames.serverInstallationEncryptionKey),); await Hive.openBox(BNames.usersDeprecated); await Hive.openBox(BNames.usersBox, encryptionCipher: cipher); - Box deprecatedUsers = Hive.box(BNames.usersDeprecated); + final Box deprecatedUsers = Hive.box(BNames.usersDeprecated); if (deprecatedUsers.isNotEmpty) { - Box users = Hive.box(BNames.usersBox); + final Box users = Hive.box(BNames.usersBox); users.addAll(deprecatedUsers.values.toList()); deprecatedUsers.clear(); } @@ -40,15 +40,15 @@ class HiveConfig { await Hive.openBox(BNames.serverInstallationBox, encryptionCipher: cipher); } - static Future getEncryptedKey(String encKey) async { - const secureStorage = FlutterSecureStorage(); - var hasEncryptionKey = await secureStorage.containsKey(key: encKey); + static Future getEncryptedKey(final String encKey) async { + const FlutterSecureStorage secureStorage = FlutterSecureStorage(); + final bool hasEncryptionKey = await secureStorage.containsKey(key: encKey); if (!hasEncryptionKey) { - var key = Hive.generateSecureKey(); + final List key = Hive.generateSecureKey(); await secureStorage.write(key: encKey, value: base64UrlEncode(key)); } - String? string = await secureStorage.read(key: encKey); + final String? string = await secureStorage.read(key: encKey); return base64Url.decode(string!); } } diff --git a/lib/config/localization.dart b/lib/config/localization.dart index 9fe2dc20..e3f6d8d2 100644 --- a/lib/config/localization.dart +++ b/lib/config/localization.dart @@ -1,16 +1,17 @@ +// ignore_for_file: always_specify_types + import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; class Localization extends StatelessWidget { const Localization({ - Key? key, + final super.key, this.child, - }) : super(key: key); + }); final Widget? child; @override - Widget build(BuildContext context) { - return EasyLocalization( + Widget build(final BuildContext context) => EasyLocalization( supportedLocales: const [Locale('ru'), Locale('en')], path: 'assets/translations', fallbackLocale: const Locale('en'), @@ -18,5 +19,4 @@ class Localization extends StatelessWidget { useOnlyLangCode: true, child: child!, ); - } } diff --git a/lib/config/text_themes.dart b/lib/config/text_themes.dart index ae166980..b7224622 100644 --- a/lib/config/text_themes.dart +++ b/lib/config/text_themes.dart @@ -1,78 +1,78 @@ import 'package:flutter/material.dart'; import 'package:selfprivacy/utils/named_font_weight.dart'; -import 'brand_colors.dart'; +import 'package:selfprivacy/config/brand_colors.dart'; -const defaultTextStyle = TextStyle( +const TextStyle defaultTextStyle = TextStyle( fontSize: 15, color: BrandColors.textColor1, ); -final headline1Style = defaultTextStyle.copyWith( +final TextStyle headline1Style = defaultTextStyle.copyWith( fontSize: 40, fontWeight: NamedFontWeight.extraBold, color: BrandColors.headlineColor, ); -final headline2Style = defaultTextStyle.copyWith( +final TextStyle headline2Style = defaultTextStyle.copyWith( fontSize: 24, fontWeight: NamedFontWeight.extraBold, color: BrandColors.headlineColor, ); -final onboardingTitle = defaultTextStyle.copyWith( +final TextStyle onboardingTitle = defaultTextStyle.copyWith( fontSize: 30, fontWeight: NamedFontWeight.extraBold, color: BrandColors.headlineColor, ); -final headline3Style = defaultTextStyle.copyWith( +final TextStyle headline3Style = defaultTextStyle.copyWith( fontSize: 20, fontWeight: NamedFontWeight.extraBold, color: BrandColors.headlineColor, ); -final headline4Style = defaultTextStyle.copyWith( +final TextStyle headline4Style = defaultTextStyle.copyWith( fontSize: 18, fontWeight: NamedFontWeight.medium, color: BrandColors.headlineColor, ); -final headline4UnderlinedStyle = defaultTextStyle.copyWith( +final TextStyle headline4UnderlinedStyle = defaultTextStyle.copyWith( fontSize: 18, fontWeight: NamedFontWeight.medium, color: BrandColors.headlineColor, decoration: TextDecoration.underline, ); -final headline5Style = defaultTextStyle.copyWith( +final TextStyle headline5Style = defaultTextStyle.copyWith( fontSize: 15, fontWeight: NamedFontWeight.medium, color: BrandColors.headlineColor.withOpacity(0.8), ); -const body1Style = defaultTextStyle; -final body2Style = defaultTextStyle.copyWith( +const TextStyle body1Style = defaultTextStyle; +final TextStyle body2Style = defaultTextStyle.copyWith( color: BrandColors.textColor2, ); -final buttonTitleText = defaultTextStyle.copyWith( +final TextStyle buttonTitleText = defaultTextStyle.copyWith( color: BrandColors.white, fontSize: 16, fontWeight: FontWeight.bold, height: 1, ); -final mediumStyle = defaultTextStyle.copyWith(fontSize: 13, height: 1.53); +final TextStyle mediumStyle = defaultTextStyle.copyWith(fontSize: 13, height: 1.53); -final smallStyle = defaultTextStyle.copyWith(fontSize: 11, height: 1.45); +final TextStyle smallStyle = defaultTextStyle.copyWith(fontSize: 11, height: 1.45); -const progressTextStyleLight = TextStyle( +const TextStyle progressTextStyleLight = TextStyle( fontSize: 11, color: BrandColors.textColor1, height: 1.7, ); -final progressTextStyleDark = progressTextStyleLight.copyWith( +final TextStyle progressTextStyleDark = progressTextStyleLight.copyWith( color: BrandColors.white, ); diff --git a/lib/logic/api_maps/api_map.dart b/lib/logic/api_maps/api_map.dart index a00757fe..ce1a54b2 100644 --- a/lib/logic/api_maps/api_map.dart +++ b/lib/logic/api_maps/api_map.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:async'; import 'dart:developer'; import 'dart:io'; @@ -10,19 +12,19 @@ import 'package:selfprivacy/logic/models/message.dart'; abstract class ApiMap { Future getClient() async { - var dio = Dio(await options); + final Dio dio = Dio(await options); if (hasLogger) { dio.interceptors.add(PrettyDioLogger()); } dio.interceptors.add(ConsoleInterceptor()); (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = - (HttpClient client) { + (final HttpClient client) { client.badCertificateCallback = - (X509Certificate cert, String host, int port) => true; + (final X509Certificate cert, final String host, final int port) => true; return client; }; - dio.interceptors.add(InterceptorsWrapper(onError: (DioError e, handler) { + dio.interceptors.add(InterceptorsWrapper(onError: (final DioError e, final ErrorInterceptorHandler handler) { print(e.requestOptions.path); print(e.requestOptions.data); @@ -30,7 +32,7 @@ abstract class ApiMap { print(e.response); return handler.next(e); - })); + },),); return dio; } @@ -42,21 +44,21 @@ abstract class ApiMap { ValidateStatus? validateStatus; - void close(Dio client) { + void close(final Dio client) { client.close(); validateStatus = null; } } class ConsoleInterceptor extends InterceptorsWrapper { - void addMessage(Message message) { + void addMessage(final Message message) { getIt.get().addMessage(message); } @override Future onRequest( - RequestOptions options, - RequestInterceptorHandler handler, + final RequestOptions options, + final RequestInterceptorHandler handler, ) async { addMessage( Message( @@ -69,8 +71,8 @@ class ConsoleInterceptor extends InterceptorsWrapper { @override Future onResponse( - Response response, - ResponseInterceptorHandler handler, + final Response response, + final ResponseInterceptorHandler handler, ) async { addMessage( Message( @@ -85,8 +87,8 @@ class ConsoleInterceptor extends InterceptorsWrapper { } @override - Future onError(DioError err, ErrorInterceptorHandler handler) async { - var response = err.response; + Future onError(final DioError err, final ErrorInterceptorHandler handler) async { + final Response? response = err.response; log(err.toString()); addMessage( Message.warn( diff --git a/lib/logic/api_maps/backblaze.dart b/lib/logic/api_maps/backblaze.dart index abf460ea..0957df2d 100644 --- a/lib/logic/api_maps/backblaze.dart +++ b/lib/logic/api_maps/backblaze.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:io'; import 'package:dio/dio.dart'; @@ -14,7 +16,7 @@ class BackblazeApiAuth { class BackblazeApplicationKey { BackblazeApplicationKey( - {required this.applicationKeyId, required this.applicationKey}); + {required this.applicationKeyId, required this.applicationKey,}); final String applicationKeyId; final String applicationKey; @@ -25,10 +27,10 @@ class BackblazeApi extends ApiMap { @override BaseOptions get options { - var options = BaseOptions(baseUrl: rootAddress); + final BaseOptions options = BaseOptions(baseUrl: rootAddress); if (isWithToken) { - var backblazeCredential = getIt().backblazeCredential; - var token = backblazeCredential!.applicationKey; + final BackblazeCredential? backblazeCredential = getIt().backblazeCredential; + final String token = backblazeCredential!.applicationKey; options.headers = {'Authorization': 'Basic $token'}; } @@ -45,14 +47,14 @@ class BackblazeApi extends ApiMap { String apiPrefix = '/b2api/v2'; Future getAuthorizationToken() async { - var client = await getClient(); - var backblazeCredential = getIt().backblazeCredential; + final Dio client = await getClient(); + final BackblazeCredential? backblazeCredential = getIt().backblazeCredential; if (backblazeCredential == null) { throw Exception('Backblaze credential is null'); } final String encodedApiKey = encodedBackblazeKey( - backblazeCredential.keyId, backblazeCredential.applicationKey); - var response = await client.get( + backblazeCredential.keyId, backblazeCredential.applicationKey,); + final Response response = await client.get( 'b2_authorize_account', options: Options(headers: {'Authorization': 'Basic $encodedApiKey'}), ); @@ -65,9 +67,9 @@ class BackblazeApi extends ApiMap { ); } - Future isValid(String encodedApiKey) async { - var client = await getClient(); - Response response = await client.get( + Future isValid(final String encodedApiKey) async { + final Dio client = await getClient(); + final Response response = await client.get( 'b2_authorize_account', options: Options(headers: {'Authorization': 'Basic $encodedApiKey'}), ); @@ -85,12 +87,12 @@ class BackblazeApi extends ApiMap { } // Create bucket - Future createBucket(String bucketName) async { - final auth = await getAuthorizationToken(); - var backblazeCredential = getIt().backblazeCredential; - var client = await getClient(); + Future createBucket(final String bucketName) async { + final BackblazeApiAuth auth = await getAuthorizationToken(); + final BackblazeCredential? backblazeCredential = getIt().backblazeCredential; + final Dio client = await getClient(); client.options.baseUrl = auth.apiUrl; - var response = await client.post( + final Response response = await client.post( '$apiPrefix/b2_create_bucket', data: { 'accountId': backblazeCredential!.keyId, @@ -117,11 +119,11 @@ class BackblazeApi extends ApiMap { } // Create a limited capability key with access to the given bucket - Future createKey(String bucketId) async { - final auth = await getAuthorizationToken(); - var client = await getClient(); + Future createKey(final String bucketId) async { + final BackblazeApiAuth auth = await getAuthorizationToken(); + final Dio client = await getClient(); client.options.baseUrl = auth.apiUrl; - var response = await client.post( + final Response response = await client.post( '$apiPrefix/b2_create_key', data: { 'accountId': getIt().backblazeCredential!.keyId, @@ -137,7 +139,7 @@ class BackblazeApi extends ApiMap { if (response.statusCode == HttpStatus.ok) { return BackblazeApplicationKey( applicationKeyId: response.data['applicationKeyId'], - applicationKey: response.data['applicationKey']); + applicationKey: response.data['applicationKey'],); } else { throw Exception('code: ${response.statusCode}'); } diff --git a/lib/logic/api_maps/cloudflare.dart b/lib/logic/api_maps/cloudflare.dart index 8fc4aa1c..29fb2c46 100644 --- a/lib/logic/api_maps/cloudflare.dart +++ b/lib/logic/api_maps/cloudflare.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:io'; import 'package:dio/dio.dart'; @@ -7,11 +9,17 @@ import 'package:selfprivacy/logic/models/hive/server_domain.dart'; import 'package:selfprivacy/logic/models/json/dns_records.dart'; class DomainNotFoundException implements Exception { - final String message; DomainNotFoundException(this.message); + final String message; } class CloudflareApi extends ApiMap { + + CloudflareApi({ + this.hasLogger = false, + this.isWithToken = true, + this.customToken, + }); @override final bool hasLogger; @override @@ -19,17 +27,11 @@ class CloudflareApi extends ApiMap { final String? customToken; - CloudflareApi({ - this.hasLogger = false, - this.isWithToken = true, - this.customToken, - }); - @override BaseOptions get options { - var options = BaseOptions(baseUrl: rootAddress); + final BaseOptions options = BaseOptions(baseUrl: rootAddress); if (isWithToken) { - var token = getIt().cloudFlareKey; + final String? token = getIt().cloudFlareKey; assert(token != null); options.headers = {'Authorization': 'Bearer $token'}; } @@ -47,14 +49,12 @@ class CloudflareApi extends ApiMap { @override String rootAddress = 'https://api.cloudflare.com/client/v4'; - Future isValid(String token) async { - validateStatus = (status) { - return status == HttpStatus.ok || status == HttpStatus.unauthorized; - }; + Future isValid(final String token) async { + validateStatus = (final status) => status == HttpStatus.ok || status == HttpStatus.unauthorized; - var client = await getClient(); - Response response = await client.get('/user/tokens/verify', - options: Options(headers: {'Authorization': 'Bearer $token'})); + final Dio client = await getClient(); + final Response response = await client.get('/user/tokens/verify', + options: Options(headers: {'Authorization': 'Bearer $token'}),); close(client); @@ -67,12 +67,10 @@ class CloudflareApi extends ApiMap { } } - Future getZoneId(String domain) async { - validateStatus = (status) { - return status == HttpStatus.ok || status == HttpStatus.forbidden; - }; - var client = await getClient(); - Response response = await client.get( + Future getZoneId(final String domain) async { + validateStatus = (final status) => status == HttpStatus.ok || status == HttpStatus.forbidden; + final Dio client = await getClient(); + final Response response = await client.get( '/zones', queryParameters: {'name': domain}, ); @@ -87,21 +85,21 @@ class CloudflareApi extends ApiMap { } Future removeSimilarRecords({ - String? ip4, - required ServerDomain cloudFlareDomain, + required final ServerDomain cloudFlareDomain, + final String? ip4, }) async { - var domainName = cloudFlareDomain.domainName; - var domainZoneId = cloudFlareDomain.zoneId; + final String domainName = cloudFlareDomain.domainName; + final String domainZoneId = cloudFlareDomain.zoneId; - var url = '/zones/$domainZoneId/dns_records'; + final String url = '/zones/$domainZoneId/dns_records'; - var client = await getClient(); - Response response = await client.get(url); + final Dio client = await getClient(); + final Response response = await client.get(url); - List records = response.data['result'] ?? []; - var allDeleteFutures = []; + final List records = response.data['result'] ?? []; + final List allDeleteFutures = []; - for (var record in records) { + for (final record in records) { if (record['zone_name'] == domainName) { allDeleteFutures.add( client.delete('$url/${record["id"]}'), @@ -114,20 +112,20 @@ class CloudflareApi extends ApiMap { } Future> getDnsRecords({ - required ServerDomain cloudFlareDomain, + required final ServerDomain cloudFlareDomain, }) async { - var domainName = cloudFlareDomain.domainName; - var domainZoneId = cloudFlareDomain.zoneId; + final String domainName = cloudFlareDomain.domainName; + final String domainZoneId = cloudFlareDomain.zoneId; - var url = '/zones/$domainZoneId/dns_records'; + final String url = '/zones/$domainZoneId/dns_records'; - var client = await getClient(); - Response response = await client.get(url); + final Dio client = await getClient(); + final Response response = await client.get(url); - List records = response.data['result'] ?? []; - var allRecords = []; + final List records = response.data['result'] ?? []; + final List allRecords = []; - for (var record in records) { + for (final record in records) { if (record['zone_name'] == domainName) { allRecords.add(DnsRecord( name: record['name'], @@ -135,7 +133,7 @@ class CloudflareApi extends ApiMap { content: record['content'], ttl: record['ttl'], proxied: record['proxied'], - )); + ),); } } @@ -144,17 +142,17 @@ class CloudflareApi extends ApiMap { } Future createMultipleDnsRecords({ - String? ip4, - required ServerDomain cloudFlareDomain, + required final ServerDomain cloudFlareDomain, + final String? ip4, }) async { - var domainName = cloudFlareDomain.domainName; - var domainZoneId = cloudFlareDomain.zoneId; - var listDnsRecords = projectDnsRecords(domainName, ip4); - var allCreateFutures = []; + final String domainName = cloudFlareDomain.domainName; + final String domainZoneId = cloudFlareDomain.zoneId; + final List listDnsRecords = projectDnsRecords(domainName, ip4); + final List allCreateFutures = []; - var client = await getClient(); + final Dio client = await getClient(); try { - for (var record in listDnsRecords) { + for (final DnsRecord record in listDnsRecords) { allCreateFutures.add( client.post( '/zones/$domainZoneId/dns_records', @@ -171,26 +169,26 @@ class CloudflareApi extends ApiMap { } } - List projectDnsRecords(String? domainName, String? ip4) { - var domainA = DnsRecord(type: 'A', name: domainName, content: ip4); + List projectDnsRecords(final String? domainName, final String? ip4) { + final DnsRecord domainA = DnsRecord(type: 'A', name: domainName, content: ip4); - var mx = DnsRecord(type: 'MX', name: '@', content: domainName); - var apiA = DnsRecord(type: 'A', name: 'api', content: ip4); - var cloudA = DnsRecord(type: 'A', name: 'cloud', content: ip4); - var gitA = DnsRecord(type: 'A', name: 'git', content: ip4); - var meetA = DnsRecord(type: 'A', name: 'meet', content: ip4); - var passwordA = DnsRecord(type: 'A', name: 'password', content: ip4); - var socialA = DnsRecord(type: 'A', name: 'social', content: ip4); - var vpn = DnsRecord(type: 'A', name: 'vpn', content: ip4); + final DnsRecord mx = DnsRecord(type: 'MX', name: '@', content: domainName); + final DnsRecord apiA = DnsRecord(type: 'A', name: 'api', content: ip4); + final DnsRecord cloudA = DnsRecord(type: 'A', name: 'cloud', content: ip4); + final DnsRecord gitA = DnsRecord(type: 'A', name: 'git', content: ip4); + final DnsRecord meetA = DnsRecord(type: 'A', name: 'meet', content: ip4); + final DnsRecord passwordA = DnsRecord(type: 'A', name: 'password', content: ip4); + final DnsRecord socialA = DnsRecord(type: 'A', name: 'social', content: ip4); + final DnsRecord vpn = DnsRecord(type: 'A', name: 'vpn', content: ip4); - var txt1 = DnsRecord( + final DnsRecord txt1 = DnsRecord( type: 'TXT', name: '_dmarc', content: 'v=DMARC1; p=none', ttl: 18000, ); - var txt2 = DnsRecord( + final DnsRecord txt2 = DnsRecord( type: 'TXT', name: domainName, content: 'v=spf1 a mx ip4:$ip4 -all', @@ -213,18 +211,18 @@ class CloudflareApi extends ApiMap { } Future setDkim( - String dkimRecordString, ServerDomain cloudFlareDomain) async { - final domainZoneId = cloudFlareDomain.zoneId; - final url = '$rootAddress/zones/$domainZoneId/dns_records'; + final String dkimRecordString, final ServerDomain cloudFlareDomain,) async { + final String domainZoneId = cloudFlareDomain.zoneId; + final String url = '$rootAddress/zones/$domainZoneId/dns_records'; - final dkimRecord = DnsRecord( + final DnsRecord dkimRecord = DnsRecord( type: 'TXT', name: 'selector._domainkey', content: dkimRecordString, ttl: 18000, ); - var client = await getClient(); + final Dio client = await getClient(); await client.post( url, data: dkimRecord.toJson(), @@ -234,17 +232,17 @@ class CloudflareApi extends ApiMap { } Future> domainList() async { - var url = '$rootAddress/zones'; - var client = await getClient(); + final String url = '$rootAddress/zones'; + final Dio client = await getClient(); - var response = await client.get( + final Response response = await client.get( url, queryParameters: {'per_page': 50}, ); close(client); return response.data['result'] - .map((el) => el['name'] as String) + .map((final el) => el['name'] as String) .toList(); } } diff --git a/lib/logic/api_maps/hetzner.dart b/lib/logic/api_maps/hetzner.dart index aa1d19b6..3901cb40 100644 --- a/lib/logic/api_maps/hetzner.dart +++ b/lib/logic/api_maps/hetzner.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:convert'; import 'dart:io'; @@ -10,18 +12,18 @@ import 'package:selfprivacy/logic/models/hive/user.dart'; import 'package:selfprivacy/utils/password_generator.dart'; class HetznerApi extends ApiMap { + + HetznerApi({this.hasLogger = false, this.isWithToken = true}); @override bool hasLogger; @override bool isWithToken; - HetznerApi({this.hasLogger = false, this.isWithToken = true}); - @override BaseOptions get options { - var options = BaseOptions(baseUrl: rootAddress); + final BaseOptions options = BaseOptions(baseUrl: rootAddress); if (isWithToken) { - var token = getIt().hetznerKey; + final String? token = getIt().hetznerKey; assert(token != null); options.headers = {'Authorization': 'Bearer $token'}; } @@ -36,12 +38,10 @@ class HetznerApi extends ApiMap { @override String rootAddress = 'https://api.hetzner.cloud/v1'; - Future isValid(String token) async { - validateStatus = (status) { - return status == HttpStatus.ok || status == HttpStatus.unauthorized; - }; - var client = await getClient(); - Response response = await client.get( + Future isValid(final String token) async { + validateStatus = (final int? status) => status == HttpStatus.ok || status == HttpStatus.unauthorized; + final Dio client = await getClient(); + final Response response = await client.get( '/servers', options: Options( headers: {'Authorization': 'Bearer $token'}, @@ -59,8 +59,8 @@ class HetznerApi extends ApiMap { } Future createVolume() async { - var client = await getClient(); - Response dbCreateResponse = await client.post( + final Dio client = await getClient(); + final Response dbCreateResponse = await client.post( '/volumes', data: { 'size': 10, @@ -71,7 +71,7 @@ class HetznerApi extends ApiMap { 'format': 'ext4' }, ); - var dbId = dbCreateResponse.data['volume']['id']; + final dbId = dbCreateResponse.data['volume']['id']; return ServerVolume( id: dbId, name: dbCreateResponse.data['volume']['name'], @@ -79,21 +79,21 @@ class HetznerApi extends ApiMap { } Future createServer({ - required String cloudFlareKey, - required User rootUser, - required String domainName, - required ServerVolume dataBase, + required final String cloudFlareKey, + required final User rootUser, + required final String domainName, + required final ServerVolume dataBase, }) async { - var client = await getClient(); + final Dio client = await getClient(); - var dbPassword = StringGenerators.dbPassword(); - var dbId = dataBase.id; + final String dbPassword = StringGenerators.dbPassword(); + final int dbId = dataBase.id; - final apiToken = StringGenerators.apiToken(); + final String apiToken = StringGenerators.apiToken(); - final hostname = getHostnameFromDomain(domainName); + final String hostname = getHostnameFromDomain(domainName); - final base64Password = + final String base64Password = base64.encode(utf8.encode(rootUser.password ?? 'PASS')); print('hostname: $hostname'); @@ -101,11 +101,11 @@ class HetznerApi extends ApiMap { /// add ssh key when you need it: e.g. "ssh_keys":["kherel"] /// check the branch name, it could be "development" or "master". /// - final userdataString = + final String userdataString = "#cloud-config\nruncmd:\n- curl https://git.selfprivacy.org/SelfPrivacy/selfprivacy-nixos-infect/raw/branch/master/nixos-infect | PROVIDER=hetzner NIX_CHANNEL=nixos-21.05 DOMAIN='$domainName' LUSER='${rootUser.login}' ENCODED_PASSWORD='$base64Password' CF_TOKEN=$cloudFlareKey DB_PASSWORD=$dbPassword API_TOKEN=$apiToken HOSTNAME=$hostname bash 2>&1 | tee /tmp/infect.log"; print(userdataString); - final data = { + final Map data = { 'name': hostname, 'server_type': 'cx11', 'start_after_create': false, @@ -119,7 +119,7 @@ class HetznerApi extends ApiMap { }; print('Decoded data: $data'); - Response serverCreateResponse = await client.post( + final Response serverCreateResponse = await client.post( '/servers', data: data, ); @@ -136,9 +136,9 @@ class HetznerApi extends ApiMap { ); } - static String getHostnameFromDomain(String domain) { + static String getHostnameFromDomain(final String domain) { // Replace all non-alphanumeric characters with an underscore - var hostname = + String hostname = domain.split('.')[0].replaceAll(RegExp(r'[^a-zA-Z0-9]'), '-'); if (hostname.endsWith('-')) { hostname = hostname.substring(0, hostname.length - 1); @@ -154,24 +154,24 @@ class HetznerApi extends ApiMap { } Future deleteSelfprivacyServerAndAllVolumes({ - required String domainName, + required final String domainName, }) async { - var client = await getClient(); + final Dio client = await getClient(); - final hostname = getHostnameFromDomain(domainName); + final String hostname = getHostnameFromDomain(domainName); - Response serversReponse = await client.get('/servers'); - List servers = serversReponse.data['servers']; - Map server = servers.firstWhere((el) => el['name'] == hostname); - List volumes = server['volumes']; - var laterFutures = []; + final Response serversReponse = await client.get('/servers'); + final List servers = serversReponse.data['servers']; + final Map server = servers.firstWhere((final el) => el['name'] == hostname); + final List volumes = server['volumes']; + final List laterFutures = []; - for (var volumeId in volumes) { + for (final volumeId in volumes) { await client.post('/volumes/$volumeId/actions/detach'); } await Future.delayed(const Duration(seconds: 10)); - for (var volumeId in volumes) { + for (final volumeId in volumes) { laterFutures.add(client.delete('/volumes/$volumeId')); } laterFutures.add(client.delete('/servers/${server['id']}')); @@ -181,9 +181,9 @@ class HetznerApi extends ApiMap { } Future reset() async { - var server = getIt().serverDetails!; + final ServerHostingDetails server = getIt().serverDetails!; - var client = await getClient(); + final Dio client = await getClient(); await client.post('/servers/${server.id}/actions/reset'); close(client); @@ -191,9 +191,9 @@ class HetznerApi extends ApiMap { } Future powerOn() async { - var server = getIt().serverDetails!; + final ServerHostingDetails server = getIt().serverDetails!; - var client = await getClient(); + final Dio client = await getClient(); await client.post('/servers/${server.id}/actions/poweron'); close(client); @@ -201,16 +201,16 @@ class HetznerApi extends ApiMap { } Future> getMetrics( - DateTime start, DateTime end, String type) async { - var hetznerServer = getIt().serverDetails; - var client = await getClient(); + final DateTime start, final DateTime end, final String type,) async { + final ServerHostingDetails? hetznerServer = getIt().serverDetails; + final Dio client = await getClient(); - Map queryParameters = { + final Map queryParameters = { 'start': start.toUtc().toIso8601String(), 'end': end.toUtc().toIso8601String(), 'type': type }; - var res = await client.get( + final Response res = await client.get( '/servers/${hetznerServer!.id}/metrics', queryParameters: queryParameters, ); @@ -219,30 +219,30 @@ class HetznerApi extends ApiMap { } Future getInfo() async { - var hetznerServer = getIt().serverDetails; - var client = await getClient(); - Response response = await client.get('/servers/${hetznerServer!.id}'); + final ServerHostingDetails? hetznerServer = getIt().serverDetails; + final Dio client = await getClient(); + final Response response = await client.get('/servers/${hetznerServer!.id}'); close(client); return HetznerServerInfo.fromJson(response.data!['server']); } Future> getServers() async { - var client = await getClient(); - Response response = await client.get('/servers'); + final Dio client = await getClient(); + final Response response = await client.get('/servers'); close(client); return (response.data!['servers'] as List) - .map((e) => HetznerServerInfo.fromJson(e)) + .map((final e) => HetznerServerInfo.fromJson(e)) .toList(); } Future createReverseDns({ - required String ip4, - required String domainName, + required final String ip4, + required final String domainName, }) async { - var hetznerServer = getIt().serverDetails; - var client = await getClient(); + final ServerHostingDetails? hetznerServer = getIt().serverDetails; + final Dio client = await getClient(); await client.post( '/servers/${hetznerServer!.id}/actions/change_dns_ptr', data: { diff --git a/lib/logic/api_maps/server.dart b/lib/logic/api_maps/server.dart index 71bd03f1..522ee528 100644 --- a/lib/logic/api_maps/server.dart +++ b/lib/logic/api_maps/server.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:async'; import 'dart:convert'; import 'dart:io'; @@ -6,6 +8,7 @@ import 'package:dio/dio.dart'; import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/logic/models/hive/backblaze_bucket.dart'; +import 'package:selfprivacy/logic/models/hive/server_domain.dart'; import 'package:selfprivacy/logic/models/hive/user.dart'; import 'package:selfprivacy/logic/models/json/api_token.dart'; import 'package:selfprivacy/logic/models/json/auto_upgrade_settings.dart'; @@ -14,23 +17,29 @@ import 'package:selfprivacy/logic/models/json/device_token.dart'; import 'package:selfprivacy/logic/models/json/recovery_token_status.dart'; import 'package:selfprivacy/logic/models/timezone_settings.dart'; -import 'api_map.dart'; +import 'package:selfprivacy/logic/api_maps/api_map.dart'; class ApiResponse { + + ApiResponse({ + required this.statusCode, + required this.data, + this.errorMessage, + }); final int statusCode; final String? errorMessage; final D data; bool get isSuccess => statusCode >= 200 && statusCode < 300; - - ApiResponse({ - required this.statusCode, - this.errorMessage, - required this.data, - }); } class ServerApi extends ApiMap { + + ServerApi( + {this.hasLogger = false, + this.isWithToken = true, + this.overrideDomain, + this.customToken,}); @override bool hasLogger; @override @@ -38,24 +47,18 @@ class ServerApi extends ApiMap { String? overrideDomain; String? customToken; - ServerApi( - {this.hasLogger = false, - this.isWithToken = true, - this.overrideDomain, - this.customToken}); - @override BaseOptions get options { - var options = BaseOptions(); + BaseOptions options = BaseOptions(); if (isWithToken) { - var cloudFlareDomain = getIt().serverDomain; - var domainName = cloudFlareDomain!.domainName; - var apiToken = getIt().serverDetails?.apiToken; + final ServerDomain? cloudFlareDomain = getIt().serverDomain; + final String domainName = cloudFlareDomain!.domainName; + final String? apiToken = getIt().serverDetails?.apiToken; options = BaseOptions(baseUrl: 'https://api.$domainName', headers: { 'Authorization': 'Bearer $apiToken', - }); + },); } if (overrideDomain != null) { @@ -73,7 +76,7 @@ class ServerApi extends ApiMap { Future getApiVersion() async { Response response; - var client = await getClient(); + final Dio client = await getClient(); String? apiVersion; try { @@ -91,7 +94,7 @@ class ServerApi extends ApiMap { bool res = false; Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.get('/services/status'); res = response.statusCode == HttpStatus.ok; @@ -103,10 +106,10 @@ class ServerApi extends ApiMap { return res; } - Future> createUser(User user) async { + Future> createUser(final User user) async { Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.post( '/users', @@ -154,15 +157,15 @@ class ServerApi extends ApiMap { ); } - Future>> getUsersList({withMainUser = false}) async { - List res = []; + Future>> getUsersList({final withMainUser = false}) async { + final List res = []; Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.get('/users', - queryParameters: withMainUser ? {'withMainUser': 'true'} : null); - for (var user in response.data) { + queryParameters: withMainUser ? {'withMainUser': 'true'} : null,); + for (final user in response.data) { res.add(user.toString()); } } on DioError catch (e) { @@ -191,10 +194,10 @@ class ServerApi extends ApiMap { ); } - Future> addUserSshKey(User user, String sshKey) async { + Future> addUserSshKey(final User user, final String sshKey) async { late Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.post( '/services/ssh/keys/${user.login}', @@ -221,10 +224,10 @@ class ServerApi extends ApiMap { ); } - Future> addRootSshKey(String ssh) async { + Future> addRootSshKey(final String ssh) async { late Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.put( '/services/ssh/key/send', @@ -249,14 +252,14 @@ class ServerApi extends ApiMap { ); } - Future>> getUserSshKeys(User user) async { + Future>> getUserSshKeys(final User user) async { List res; Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.get('/services/ssh/keys/${user.login}'); - res = (response.data as List).map((e) => e as String).toList(); + res = (response.data as List).map((final e) => e as String).toList(); } on DioError catch (e) { print(e.message); return ApiResponse>( @@ -287,10 +290,10 @@ class ServerApi extends ApiMap { ); } - Future> deleteUserSshKey(User user, String sshKey) async { + Future> deleteUserSshKey(final User user, final String sshKey) async { Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.delete( '/services/ssh/keys/${user.login}', @@ -318,11 +321,11 @@ class ServerApi extends ApiMap { ); } - Future deleteUser(User user) async { + Future deleteUser(final User user) async { bool res = false; Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.delete('/users/${user.login}'); res = response.statusCode == HttpStatus.ok || @@ -344,7 +347,7 @@ class ServerApi extends ApiMap { bool res = false; Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.get('/system/configuration/apply'); res = response.statusCode == HttpStatus.ok; @@ -357,8 +360,8 @@ class ServerApi extends ApiMap { return res; } - Future switchService(ServiceTypes type, bool needToTurnOn) async { - var client = await getClient(); + Future switchService(final ServiceTypes type, final bool needToTurnOn) async { + final Dio client = await getClient(); try { client.post( '/services/${type.url}/${needToTurnOn ? 'enable' : 'disable'}', @@ -373,7 +376,7 @@ class ServerApi extends ApiMap { Future> servicesPowerCheck() async { Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.get('/services/status'); } on DioError catch (e) { @@ -392,8 +395,8 @@ class ServerApi extends ApiMap { }; } - Future uploadBackblazeConfig(BackblazeBucket bucket) async { - var client = await getClient(); + Future uploadBackblazeConfig(final BackblazeBucket bucket) async { + final Dio client = await getClient(); try { client.put( '/services/restic/backblaze/config', @@ -411,7 +414,7 @@ class ServerApi extends ApiMap { } Future startBackup() async { - var client = await getClient(); + final Dio client = await getClient(); try { client.put('/services/restic/backup/create'); } on DioError catch (e) { @@ -425,10 +428,10 @@ class ServerApi extends ApiMap { Response response; List backups = []; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.get('/services/restic/backup/list'); - backups = response.data.map((e) => Backup.fromJson(e)).toList(); + backups = response.data.map((final e) => Backup.fromJson(e)).toList(); } on DioError catch (e) { print(e.message); } catch (e) { @@ -447,7 +450,7 @@ class ServerApi extends ApiMap { progress: 0, ); - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.get('/services/restic/backup/status'); status = BackupStatus.fromJson(response.data); @@ -460,7 +463,7 @@ class ServerApi extends ApiMap { } Future forceBackupListReload() async { - var client = await getClient(); + final Dio client = await getClient(); try { client.get('/services/restic/backup/reload'); } on DioError catch (e) { @@ -470,8 +473,8 @@ class ServerApi extends ApiMap { } } - Future restoreBackup(String backupId) async { - var client = await getClient(); + Future restoreBackup(final String backupId) async { + final Dio client = await getClient(); try { client.put( '/services/restic/backup/restore', @@ -488,7 +491,7 @@ class ServerApi extends ApiMap { Response response; bool result = false; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.get('/system/configuration/pull'); result = (response.statusCode != null) @@ -506,7 +509,7 @@ class ServerApi extends ApiMap { Response response; bool result = false; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.get('/system/reboot'); result = (response.statusCode != null) @@ -524,7 +527,7 @@ class ServerApi extends ApiMap { Response response; bool result = false; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.get('/system/configuration/upgrade'); result = (response.statusCode != null) @@ -545,7 +548,7 @@ class ServerApi extends ApiMap { allowReboot: false, ); - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.get('/system/configuration/autoUpgrade'); if (response.data != null) { @@ -559,8 +562,8 @@ class ServerApi extends ApiMap { return settings; } - Future updateAutoUpgradeSettings(AutoUpgradeSettings settings) async { - var client = await getClient(); + Future updateAutoUpgradeSettings(final AutoUpgradeSettings settings) async { + final Dio client = await getClient(); try { await client.put( '/system/configuration/autoUpgrade', @@ -575,15 +578,15 @@ class ServerApi extends ApiMap { Future getServerTimezone() async { // I am not sure how to initialize TimeZoneSettings with default value... - var client = await getClient(); - Response response = await client.get('/system/configuration/timezone'); + final Dio client = await getClient(); + final Response response = await client.get('/system/configuration/timezone'); close(client); return TimeZoneSettings.fromString(response.data); } - Future updateServerTimezone(TimeZoneSettings settings) async { - var client = await getClient(); + Future updateServerTimezone(final TimeZoneSettings settings) async { + final Dio client = await getClient(); try { await client.put( '/system/configuration/timezone', @@ -599,7 +602,7 @@ class ServerApi extends ApiMap { Future getDkim() async { Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.get('/services/mailserver/dkim'); } on DioError catch (e) { @@ -621,7 +624,7 @@ class ServerApi extends ApiMap { return ''; } - final base64toString = utf8.fuse(base64); + final Codec base64toString = utf8.fuse(base64); return base64toString .decode(response.data) @@ -633,7 +636,7 @@ class ServerApi extends ApiMap { Future> getRecoveryTokenStatus() async { Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.get('/auth/recovery_token'); } on DioError catch (e) { @@ -641,7 +644,7 @@ class ServerApi extends ApiMap { return ApiResponse( errorMessage: e.message, statusCode: e.response?.statusCode ?? HttpStatus.internalServerError, - data: const RecoveryKeyStatus(exists: false, valid: false)); + data: const RecoveryKeyStatus(exists: false, valid: false),); } finally { close(client); } @@ -652,17 +655,17 @@ class ServerApi extends ApiMap { statusCode: code, data: response.data != null ? RecoveryKeyStatus.fromJson(response.data) - : null); + : null,); } Future> generateRecoveryToken( - DateTime? expiration, - int? uses, + final DateTime? expiration, + final int? uses, ) async { Response response; - var client = await getClient(); - var data = {}; + final Dio client = await getClient(); + final Map data = {}; if (expiration != null) { data['expiration'] = '${expiration.toIso8601String()}Z'; print(data['expiration']); @@ -680,7 +683,7 @@ class ServerApi extends ApiMap { return ApiResponse( errorMessage: e.message, statusCode: e.response?.statusCode ?? HttpStatus.internalServerError, - data: ''); + data: '',); } finally { close(client); } @@ -689,13 +692,13 @@ class ServerApi extends ApiMap { return ApiResponse( statusCode: code, - data: response.data != null ? response.data['token'] : ''); + data: response.data != null ? response.data['token'] : '',); } - Future> useRecoveryToken(DeviceToken token) async { + Future> useRecoveryToken(final DeviceToken token) async { Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.post( '/auth/recovery_token/use', @@ -709,7 +712,7 @@ class ServerApi extends ApiMap { return ApiResponse( errorMessage: e.message, statusCode: e.response?.statusCode ?? HttpStatus.internalServerError, - data: ''); + data: '',); } finally { client.close(); } @@ -718,13 +721,13 @@ class ServerApi extends ApiMap { return ApiResponse( statusCode: code, - data: response.data != null ? response.data['token'] : ''); + data: response.data != null ? response.data['token'] : '',); } - Future> authorizeDevice(DeviceToken token) async { + Future> authorizeDevice(final DeviceToken token) async { Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.post( '/auth/new_device/authorize', @@ -738,7 +741,7 @@ class ServerApi extends ApiMap { return ApiResponse( errorMessage: e.message, statusCode: e.response?.statusCode ?? HttpStatus.internalServerError, - data: ''); + data: '',); } finally { client.close(); } @@ -751,7 +754,7 @@ class ServerApi extends ApiMap { Future> createDeviceToken() async { Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.post('/auth/new_device'); } on DioError catch (e) { @@ -759,7 +762,7 @@ class ServerApi extends ApiMap { return ApiResponse( errorMessage: e.message, statusCode: e.response?.statusCode ?? HttpStatus.internalServerError, - data: ''); + data: '',); } finally { client.close(); } @@ -768,13 +771,13 @@ class ServerApi extends ApiMap { return ApiResponse( statusCode: code, - data: response.data != null ? response.data['token'] : ''); + data: response.data != null ? response.data['token'] : '',); } Future> deleteDeviceToken() async { Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.delete('/auth/new_device'); } on DioError catch (e) { @@ -782,7 +785,7 @@ class ServerApi extends ApiMap { return ApiResponse( errorMessage: e.message, statusCode: e.response?.statusCode ?? HttpStatus.internalServerError, - data: ''); + data: '',); } finally { client.close(); } @@ -795,7 +798,7 @@ class ServerApi extends ApiMap { Future>> getApiTokens() async { Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.get('/auth/tokens'); } on DioError catch (e) { @@ -803,7 +806,7 @@ class ServerApi extends ApiMap { return ApiResponse( errorMessage: e.message, statusCode: e.response?.statusCode ?? HttpStatus.internalServerError, - data: []); + data: [],); } finally { client.close(); } @@ -813,14 +816,14 @@ class ServerApi extends ApiMap { return ApiResponse( statusCode: code, data: (response.data != null) - ? response.data.map((e) => ApiToken.fromJson(e)).toList() - : []); + ? response.data.map((final e) => ApiToken.fromJson(e)).toList() + : [],); } Future> refreshCurrentApiToken() async { Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.post('/auth/tokens'); } on DioError catch (e) { @@ -828,7 +831,7 @@ class ServerApi extends ApiMap { return ApiResponse( errorMessage: e.message, statusCode: e.response?.statusCode ?? HttpStatus.internalServerError, - data: ''); + data: '',); } finally { client.close(); } @@ -837,12 +840,12 @@ class ServerApi extends ApiMap { return ApiResponse( statusCode: code, - data: response.data != null ? response.data['token'] : ''); + data: response.data != null ? response.data['token'] : '',); } - Future> deleteApiToken(String device) async { + Future> deleteApiToken(final String device) async { Response response; - var client = await getClient(); + final Dio client = await getClient(); try { response = await client.delete( '/auth/tokens', @@ -855,7 +858,7 @@ class ServerApi extends ApiMap { return ApiResponse( errorMessage: e.message, statusCode: e.response?.statusCode ?? HttpStatus.internalServerError, - data: null); + data: null,); } finally { client.close(); } diff --git a/lib/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart b/lib/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart index 080fd684..68705b5b 100644 --- a/lib/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart +++ b/lib/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:equatable/equatable.dart'; @@ -11,14 +13,14 @@ abstract class ServerInstallationDependendCubit< T extends ServerInstallationDependendState> extends Cubit { ServerInstallationDependendCubit( this.serverInstallationCubit, - T initState, + final T initState, ) : super(initState) { authCubitSubscription = serverInstallationCubit.stream.listen(checkAuthStatus); checkAuthStatus(serverInstallationCubit.state); } - void checkAuthStatus(ServerInstallationState state) { + void checkAuthStatus(final ServerInstallationState state) { if (state is ServerInstallationFinished) { load(); } else if (state is ServerInstallationEmpty) { diff --git a/lib/logic/cubit/app_settings/app_settings_cubit.dart b/lib/logic/cubit/app_settings/app_settings_cubit.dart index bafc1d96..7c2d55e3 100644 --- a/lib/logic/cubit/app_settings/app_settings_cubit.dart +++ b/lib/logic/cubit/app_settings/app_settings_cubit.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:hive/hive.dart'; @@ -9,8 +11,8 @@ part 'app_settings_state.dart'; class AppSettingsCubit extends Cubit { AppSettingsCubit({ - required bool isDarkModeOn, - required bool isOnboardingShowing, + required final bool isDarkModeOn, + required final bool isOnboardingShowing, }) : super( AppSettingsState( isDarkModeOn: isDarkModeOn, @@ -21,15 +23,15 @@ class AppSettingsCubit extends Cubit { Box box = Hive.box(BNames.appSettingsBox); void load() { - bool? isDarkModeOn = box.get(BNames.isDarkModeOn); - bool? isOnboardingShowing = box.get(BNames.isOnboardingShowing); + final bool? isDarkModeOn = box.get(BNames.isDarkModeOn); + final bool? isOnboardingShowing = box.get(BNames.isOnboardingShowing); emit(state.copyWith( isDarkModeOn: isDarkModeOn, isOnboardingShowing: isOnboardingShowing, - )); + ),); } - void updateDarkMode({required bool isDarkModeOn}) { + void updateDarkMode({required final bool isDarkModeOn}) { box.put(BNames.isDarkModeOn, isDarkModeOn); emit(state.copyWith(isDarkModeOn: isDarkModeOn)); } diff --git a/lib/logic/cubit/app_settings/app_settings_state.dart b/lib/logic/cubit/app_settings/app_settings_state.dart index 1300dcf4..6000fc55 100644 --- a/lib/logic/cubit/app_settings/app_settings_state.dart +++ b/lib/logic/cubit/app_settings/app_settings_state.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + part of 'app_settings_cubit.dart'; class AppSettingsState extends Equatable { @@ -9,7 +11,7 @@ class AppSettingsState extends Equatable { final bool isDarkModeOn; final bool isOnboardingShowing; - AppSettingsState copyWith({isDarkModeOn, isOnboardingShowing}) => + AppSettingsState copyWith({final isDarkModeOn, final isOnboardingShowing}) => AppSettingsState( isDarkModeOn: isDarkModeOn ?? this.isDarkModeOn, isOnboardingShowing: isOnboardingShowing ?? this.isOnboardingShowing, diff --git a/lib/logic/cubit/backups/backups_cubit.dart b/lib/logic/cubit/backups/backups_cubit.dart index 45e24717..e77156db 100644 --- a/lib/logic/cubit/backups/backups_cubit.dart +++ b/lib/logic/cubit/backups/backups_cubit.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; @@ -11,22 +13,22 @@ import 'package:selfprivacy/logic/models/json/backup.dart'; part 'backups_state.dart'; class BackupsCubit extends ServerInstallationDependendCubit { - BackupsCubit(ServerInstallationCubit serverInstallationCubit) + BackupsCubit(final ServerInstallationCubit serverInstallationCubit) : super( - serverInstallationCubit, const BackupsState(preventActions: true)); + serverInstallationCubit, const BackupsState(preventActions: true),); - final api = ServerApi(); - final backblaze = BackblazeApi(); + final ServerApi api = ServerApi(); + final BackblazeApi backblaze = BackblazeApi(); @override Future load() async { if (serverInstallationCubit.state is ServerInstallationFinished) { - final bucket = getIt().backblazeBucket; + final BackblazeBucket? bucket = getIt().backblazeBucket; if (bucket == null) { emit(const BackupsState( - isInitialized: false, preventActions: false, refreshing: false)); + isInitialized: false, preventActions: false, refreshing: false,),); } else { - final status = await api.getBackupStatus(); + final BackupStatus status = await api.getBackupStatus(); switch (status.status) { case BackupStatusEnum.noKey: case BackupStatusEnum.notInitialized: @@ -37,7 +39,7 @@ class BackupsCubit extends ServerInstallationDependendCubit { progress: 0, status: status.status, refreshing: false, - )); + ),); break; case BackupStatusEnum.initializing: emit(BackupsState( @@ -48,11 +50,11 @@ class BackupsCubit extends ServerInstallationDependendCubit { status: status.status, refreshTimer: const Duration(seconds: 10), refreshing: false, - )); + ),); break; case BackupStatusEnum.initialized: case BackupStatusEnum.error: - final backups = await api.getBackups(); + final List backups = await api.getBackups(); emit(BackupsState( backups: backups, isInitialized: true, @@ -61,11 +63,11 @@ class BackupsCubit extends ServerInstallationDependendCubit { status: status.status, error: status.errorMessage ?? '', refreshing: false, - )); + ),); break; case BackupStatusEnum.backingUp: case BackupStatusEnum.restoring: - final backups = await api.getBackups(); + final List backups = await api.getBackups(); emit(BackupsState( backups: backups, isInitialized: true, @@ -75,7 +77,7 @@ class BackupsCubit extends ServerInstallationDependendCubit { error: status.errorMessage ?? '', refreshTimer: const Duration(seconds: 5), refreshing: false, - )); + ),); break; default: emit(const BackupsState()); @@ -87,22 +89,22 @@ class BackupsCubit extends ServerInstallationDependendCubit { Future createBucket() async { emit(state.copyWith(preventActions: true)); - final domain = serverInstallationCubit.state.serverDomain!.domainName + final String domain = serverInstallationCubit.state.serverDomain!.domainName .replaceAll(RegExp(r'[^a-zA-Z0-9]'), '-'); - final serverId = serverInstallationCubit.state.serverDetails!.id; - var bucketName = 'selfprivacy-$domain-$serverId'; + final int serverId = serverInstallationCubit.state.serverDetails!.id; + String bucketName = 'selfprivacy-$domain-$serverId'; // If bucket name is too long, shorten it if (bucketName.length > 49) { bucketName = bucketName.substring(0, 49); } - final bucketId = await backblaze.createBucket(bucketName); + final String bucketId = await backblaze.createBucket(bucketName); - final key = await backblaze.createKey(bucketId); - final bucket = BackblazeBucket( + final BackblazeApplicationKey key = await backblaze.createKey(bucketId); + final BackblazeBucket bucket = BackblazeBucket( bucketId: bucketId, bucketName: bucketName, applicationKey: key.applicationKey, - applicationKeyId: key.applicationKeyId); + applicationKeyId: key.applicationKeyId,); await getIt().storeBackblazeBucket(bucket); await api.uploadBackblazeConfig(bucket); @@ -113,7 +115,7 @@ class BackupsCubit extends ServerInstallationDependendCubit { Future reuploadKey() async { emit(state.copyWith(preventActions: true)); - final bucket = getIt().backblazeBucket; + final BackblazeBucket? bucket = getIt().backblazeBucket; if (bucket == null) { emit(state.copyWith(isInitialized: false)); } else { @@ -123,7 +125,7 @@ class BackupsCubit extends ServerInstallationDependendCubit { } } - Duration refreshTimeFromState(BackupStatusEnum status) { + Duration refreshTimeFromState(final BackupStatusEnum status) { switch (status) { case BackupStatusEnum.backingUp: case BackupStatusEnum.restoring: @@ -135,10 +137,10 @@ class BackupsCubit extends ServerInstallationDependendCubit { } } - Future updateBackups({bool useTimer = false}) async { + Future updateBackups({final bool useTimer = false}) async { emit(state.copyWith(refreshing: true)); - final backups = await api.getBackups(); - final status = await api.getBackupStatus(); + final List backups = await api.getBackups(); + final BackupStatus status = await api.getBackupStatus(); emit(state.copyWith( backups: backups, progress: status.progress, @@ -146,7 +148,7 @@ class BackupsCubit extends ServerInstallationDependendCubit { error: status.errorMessage, refreshTimer: refreshTimeFromState(status.status), refreshing: false, - )); + ),); if (useTimer) { Timer(state.refreshTimer, () => updateBackups(useTimer: true)); } @@ -167,7 +169,7 @@ class BackupsCubit extends ServerInstallationDependendCubit { emit(state.copyWith(preventActions: false)); } - Future restoreBackup(String backupId) async { + Future restoreBackup(final String backupId) async { emit(state.copyWith(preventActions: true)); await api.restoreBackup(backupId); emit(state.copyWith(preventActions: false)); diff --git a/lib/logic/cubit/backups/backups_state.dart b/lib/logic/cubit/backups/backups_state.dart index 3f0e2c3f..3600c7a2 100644 --- a/lib/logic/cubit/backups/backups_state.dart +++ b/lib/logic/cubit/backups/backups_state.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + part of 'backups_cubit.dart'; class BackupsState extends ServerInstallationDependendState { @@ -34,14 +36,14 @@ class BackupsState extends ServerInstallationDependendState { ]; BackupsState copyWith({ - bool? isInitialized, - List? backups, - double? progress, - BackupStatusEnum? status, - bool? preventActions, - String? error, - Duration? refreshTimer, - bool? refreshing, + final bool? isInitialized, + final List? backups, + final double? progress, + final BackupStatusEnum? status, + final bool? preventActions, + final String? error, + final Duration? refreshTimer, + final bool? refreshing, }) => BackupsState( isInitialized: isInitialized ?? this.isInitialized, diff --git a/lib/logic/cubit/devices/devices_cubit.dart b/lib/logic/cubit/devices/devices_cubit.dart index 4ec51d84..ec302477 100644 --- a/lib/logic/cubit/devices/devices_cubit.dart +++ b/lib/logic/cubit/devices/devices_cubit.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/logic/api_maps/server.dart'; import 'package:selfprivacy/logic/common_enum/common_enum.dart'; @@ -8,16 +10,16 @@ part 'devices_state.dart'; class ApiDevicesCubit extends ServerInstallationDependendCubit { - ApiDevicesCubit(ServerInstallationCubit serverInstallationCubit) + ApiDevicesCubit(final ServerInstallationCubit serverInstallationCubit) : super(serverInstallationCubit, const ApiDevicesState.initial()); - final api = ServerApi(); + final ServerApi api = ServerApi(); @override void load() async { if (serverInstallationCubit.state is ServerInstallationFinished) { emit(const ApiDevicesState([], LoadingStatus.refreshing)); - final devices = await _getApiTokens(); + final List? devices = await _getApiTokens(); if (devices != null) { emit(ApiDevicesState(devices, LoadingStatus.success)); } else { @@ -28,7 +30,7 @@ class ApiDevicesCubit Future refresh() async { emit(const ApiDevicesState([], LoadingStatus.refreshing)); - final devices = await _getApiTokens(); + final List? devices = await _getApiTokens(); if (devices != null) { emit(ApiDevicesState(devices, LoadingStatus.success)); } else { @@ -37,7 +39,7 @@ class ApiDevicesCubit } Future?> _getApiTokens() async { - final response = await api.getApiTokens(); + final ApiResponse> response = await api.getApiTokens(); if (response.isSuccess) { return response.data; } else { @@ -45,12 +47,12 @@ class ApiDevicesCubit } } - Future deleteDevice(ApiToken device) async { - final response = await api.deleteApiToken(device.name); + Future deleteDevice(final ApiToken device) async { + final ApiResponse response = await api.deleteApiToken(device.name); if (response.isSuccess) { emit(ApiDevicesState( - state.devices.where((d) => d.name != device.name).toList(), - LoadingStatus.success)); + state.devices.where((final d) => d.name != device.name).toList(), + LoadingStatus.success,),); } else { getIt() .showSnackBar(response.errorMessage ?? 'Error deleting device'); @@ -58,12 +60,12 @@ class ApiDevicesCubit } Future getNewDeviceKey() async { - final response = await api.createDeviceToken(); + final ApiResponse response = await api.createDeviceToken(); if (response.isSuccess) { return response.data; } else { getIt().showSnackBar( - response.errorMessage ?? 'Error getting new device key'); + response.errorMessage ?? 'Error getting new device key',); return null; } } diff --git a/lib/logic/cubit/devices/devices_state.dart b/lib/logic/cubit/devices/devices_state.dart index bccc5e29..ba7d7e90 100644 --- a/lib/logic/cubit/devices/devices_state.dart +++ b/lib/logic/cubit/devices/devices_state.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + part of 'devices_cubit.dart'; class ApiDevicesState extends ServerInstallationDependendState { @@ -8,25 +10,23 @@ class ApiDevicesState extends ServerInstallationDependendState { final LoadingStatus status; List get devices => _devices; - ApiToken get thisDevice => _devices.firstWhere((device) => device.isCaller, + ApiToken get thisDevice => _devices.firstWhere((final device) => device.isCaller, orElse: () => ApiToken( name: 'Error fetching device', isCaller: true, date: DateTime.now(), - )); + ),); List get otherDevices => - _devices.where((device) => !device.isCaller).toList(); + _devices.where((final device) => !device.isCaller).toList(); ApiDevicesState copyWith({ - List? devices, - LoadingStatus? status, - }) { - return ApiDevicesState( + final List? devices, + final LoadingStatus? status, + }) => ApiDevicesState( devices ?? _devices, status ?? this.status, ); - } @override List get props => [_devices]; diff --git a/lib/logic/cubit/dns_records/dns_records_cubit.dart b/lib/logic/cubit/dns_records/dns_records_cubit.dart index 9d9bdf8e..d6faba8e 100644 --- a/lib/logic/cubit/dns_records/dns_records_cubit.dart +++ b/lib/logic/cubit/dns_records/dns_records_cubit.dart @@ -1,28 +1,30 @@ +// ignore_for_file: always_specify_types + import 'package:cubit_form/cubit_form.dart'; import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart'; import 'package:selfprivacy/logic/models/hive/server_domain.dart'; import 'package:selfprivacy/logic/models/json/dns_records.dart'; -import '../../api_maps/cloudflare.dart'; -import '../../api_maps/server.dart'; +import 'package:selfprivacy/logic/api_maps/cloudflare.dart'; +import 'package:selfprivacy/logic/api_maps/server.dart'; part 'dns_records_state.dart'; class DnsRecordsCubit extends ServerInstallationDependendCubit { - DnsRecordsCubit(ServerInstallationCubit serverInstallationCubit) + DnsRecordsCubit(final ServerInstallationCubit serverInstallationCubit) : super(serverInstallationCubit, - const DnsRecordsState(dnsState: DnsRecordsStatus.refreshing)); + const DnsRecordsState(dnsState: DnsRecordsStatus.refreshing),); - final api = ServerApi(); - final cloudflare = CloudflareApi(); + final ServerApi api = ServerApi(); + final CloudflareApi cloudflare = CloudflareApi(); @override Future load() async { emit(DnsRecordsState( dnsState: DnsRecordsStatus.refreshing, dnsRecords: _getDesiredDnsRecords( - serverInstallationCubit.state.serverDomain?.domainName, '', ''))); + serverInstallationCubit.state.serverDomain?.domainName, '', '',),),); print('Loading DNS status'); if (serverInstallationCubit.state is ServerInstallationFinished) { final ServerDomain? domain = serverInstallationCubit.state.serverDomain; @@ -31,37 +33,37 @@ class DnsRecordsCubit if (domain != null && ipAddress != null) { final List records = await cloudflare.getDnsRecords(cloudFlareDomain: domain); - final dkimPublicKey = await api.getDkim(); - final desiredRecords = + final String? dkimPublicKey = await api.getDkim(); + final List desiredRecords = _getDesiredDnsRecords(domain.domainName, ipAddress, dkimPublicKey); - List foundRecords = []; - for (final record in desiredRecords) { + final List foundRecords = []; + for (final DesiredDnsRecord record in desiredRecords) { if (record.description == 'providers.domain.record_description.dkim') { - final foundRecord = records.firstWhere( - (r) => r.name == record.name && r.type == record.type, + final DnsRecord foundRecord = records.firstWhere( + (final r) => r.name == record.name && r.type == record.type, orElse: () => DnsRecord( name: record.name, type: record.type, content: '', ttl: 800, - proxied: false)); + proxied: false,),); // remove all spaces and tabulators from // the foundRecord.content and the record.content // to compare them - final foundContent = + final String? foundContent = foundRecord.content?.replaceAll(RegExp(r'\s+'), ''); - final content = record.content.replaceAll(RegExp(r'\s+'), ''); + final String content = record.content.replaceAll(RegExp(r'\s+'), ''); if (foundContent == content) { foundRecords.add(record.copyWith(isSatisfied: true)); } else { foundRecords.add(record.copyWith(isSatisfied: false)); } } else { - if (records.any((r) => + if (records.any((final r) => r.name == record.name && r.type == record.type && - r.content == record.content)) { + r.content == record.content,)) { foundRecords.add(record.copyWith(isSatisfied: true)); } else { foundRecords.add(record.copyWith(isSatisfied: false)); @@ -70,10 +72,10 @@ class DnsRecordsCubit } emit(DnsRecordsState( dnsRecords: foundRecords, - dnsState: foundRecords.any((r) => r.isSatisfied == false) + dnsState: foundRecords.any((final r) => r.isSatisfied == false) ? DnsRecordsStatus.error : DnsRecordsStatus.good, - )); + ),); } else { emit(const DnsRecordsState()); } @@ -81,7 +83,7 @@ class DnsRecordsCubit } @override - void onChange(Change change) { + void onChange(final Change change) { // print(change); super.onChange(change); } @@ -103,13 +105,13 @@ class DnsRecordsCubit final String? dkimPublicKey = await api.getDkim(); await cloudflare.removeSimilarRecords(cloudFlareDomain: domain!); await cloudflare.createMultipleDnsRecords( - cloudFlareDomain: domain, ip4: ipAddress); + cloudFlareDomain: domain, ip4: ipAddress,); await cloudflare.setDkim(dkimPublicKey ?? '', domain); await load(); } List _getDesiredDnsRecords( - String? domainName, String? ipAddress, String? dkimPublicKey) { + final String? domainName, final String? ipAddress, final String? dkimPublicKey,) { if (domainName == null || ipAddress == null || dkimPublicKey == null) { return []; } diff --git a/lib/logic/cubit/dns_records/dns_records_state.dart b/lib/logic/cubit/dns_records/dns_records_state.dart index 59c266b7..d6d0c67b 100644 --- a/lib/logic/cubit/dns_records/dns_records_state.dart +++ b/lib/logic/cubit/dns_records/dns_records_state.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + part of 'dns_records_cubit.dart'; enum DnsRecordsStatus { @@ -29,21 +31,19 @@ class DnsRecordsState extends ServerInstallationDependendState { ]; DnsRecordsState copyWith({ - DnsRecordsStatus? dnsState, - List? dnsRecords, - }) { - return DnsRecordsState( + final DnsRecordsStatus? dnsState, + final List? dnsRecords, + }) => DnsRecordsState( dnsState: dnsState ?? this.dnsState, dnsRecords: dnsRecords ?? this.dnsRecords, ); - } } class DesiredDnsRecord { const DesiredDnsRecord({ required this.name, - this.type = 'A', required this.content, + this.type = 'A', this.description = '', this.category = DnsRecordsCategory.services, this.isSatisfied = false, @@ -57,14 +57,13 @@ class DesiredDnsRecord { final bool isSatisfied; DesiredDnsRecord copyWith({ - String? name, - String? type, - String? content, - String? description, - DnsRecordsCategory? category, - bool? isSatisfied, - }) { - return DesiredDnsRecord( + final String? name, + final String? type, + final String? content, + final String? description, + final DnsRecordsCategory? category, + final bool? isSatisfied, + }) => DesiredDnsRecord( name: name ?? this.name, type: type ?? this.type, content: content ?? this.content, @@ -72,5 +71,4 @@ class DesiredDnsRecord { category: category ?? this.category, isSatisfied: isSatisfied ?? this.isSatisfied, ); - } } diff --git a/lib/logic/cubit/forms/factories/field_cubit_factory.dart b/lib/logic/cubit/forms/factories/field_cubit_factory.dart index 86f3b70b..d71f3a7b 100644 --- a/lib/logic/cubit/forms/factories/field_cubit_factory.dart +++ b/lib/logic/cubit/forms/factories/field_cubit_factory.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:flutter/material.dart'; import 'package:selfprivacy/logic/cubit/forms/validations/validations.dart'; import 'package:easy_localization/easy_localization.dart'; @@ -16,21 +18,21 @@ class FieldCubitFactory { /// - Must not be a reserved root login /// - Must be unique FieldCubit createUserLoginField() { - final userAllowedRegExp = RegExp(r'^[a-z_][a-z0-9_]+$'); - const userMaxLength = 31; + final RegExp userAllowedRegExp = RegExp(r'^[a-z_][a-z0-9_]+$'); + const int userMaxLength = 31; return FieldCubit( initalValue: '', validations: [ ValidationModel( - (s) => s.toLowerCase() == 'root', 'validations.root_name'.tr()), + (final String s) => s.toLowerCase() == 'root', 'validations.root_name'.tr(),), ValidationModel( - (login) => context.read().state.isLoginRegistered(login), + (final String login) => context.read().state.isLoginRegistered(login), 'validations.user_already_exist'.tr(), ), RequiredStringValidation('validations.required'.tr()), LengthStringLongerValidation(userMaxLength), - ValidationModel((s) => !userAllowedRegExp.hasMatch(s), - 'validations.invalid_format'.tr()), + ValidationModel((final String s) => !userAllowedRegExp.hasMatch(s), + 'validations.invalid_format'.tr(),), ], ); } @@ -40,26 +42,24 @@ class FieldCubitFactory { /// - Must fail on the regural expression of invalid matches: [\n\r\s]+ /// - Must not be empty FieldCubit createUserPasswordField() { - var passwordForbiddenRegExp = RegExp(r'[\n\r\s]+'); + final RegExp passwordForbiddenRegExp = RegExp(r'[\n\r\s]+'); return FieldCubit( initalValue: '', validations: [ RequiredStringValidation('validations.required'.tr()), ValidationModel( - (password) => passwordForbiddenRegExp.hasMatch(password), - 'validations.invalid_format'.tr()), + passwordForbiddenRegExp.hasMatch, + 'validations.invalid_format'.tr(),), ], ); } - FieldCubit createRequiredStringField() { - return FieldCubit( + FieldCubit createRequiredStringField() => FieldCubit( initalValue: '', validations: [ RequiredStringValidation('validations.required'.tr()), ], ); - } final BuildContext context; } diff --git a/lib/logic/cubit/forms/setup/initializing/backblaze_form_cubit.dart b/lib/logic/cubit/forms/setup/initializing/backblaze_form_cubit.dart index 9958effa..0ac87e30 100644 --- a/lib/logic/cubit/forms/setup/initializing/backblaze_form_cubit.dart +++ b/lib/logic/cubit/forms/setup/initializing/backblaze_form_cubit.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:async'; import 'package:cubit_form/cubit_form.dart'; import 'package:selfprivacy/logic/api_maps/backblaze.dart'; @@ -41,10 +43,10 @@ class BackblazeFormCubit extends FormCubit { @override FutureOr asyncValidation() async { late bool isKeyValid; - BackblazeApi apiClient = BackblazeApi(isWithToken: false); + final BackblazeApi apiClient = BackblazeApi(isWithToken: false); try { - String encodedApiKey = encodedBackblazeKey( + final String encodedApiKey = encodedBackblazeKey( keyId.state.value, applicationKey.state.value, ); diff --git a/lib/logic/cubit/forms/setup/initializing/cloudflare_form_cubit.dart b/lib/logic/cubit/forms/setup/initializing/cloudflare_form_cubit.dart index fd700633..c8dc14d1 100644 --- a/lib/logic/cubit/forms/setup/initializing/cloudflare_form_cubit.dart +++ b/lib/logic/cubit/forms/setup/initializing/cloudflare_form_cubit.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:async'; import 'package:cubit_form/cubit_form.dart'; @@ -8,13 +10,13 @@ import 'package:selfprivacy/logic/cubit/forms/validations/validations.dart'; class CloudFlareFormCubit extends FormCubit { CloudFlareFormCubit(this.initializingCubit) { - var regExp = RegExp(r'\s+|[!$%^&*()@+|~=`{}\[\]:<>?,.\/]'); + final RegExp regExp = RegExp(r'\s+|[!$%^&*()@+|~=`{}\[\]:<>?,.\/]'); apiKey = FieldCubit( initalValue: '', validations: [ RequiredStringValidation('validations.required'.tr()), ValidationModel( - (s) => regExp.hasMatch(s), 'validations.key_format'.tr()), + regExp.hasMatch, 'validations.key_format'.tr(),), LengthStringNotEqualValidation(40) ], ); @@ -34,7 +36,7 @@ class CloudFlareFormCubit extends FormCubit { @override FutureOr asyncValidation() async { late bool isKeyValid; - CloudflareApi apiClient = CloudflareApi(isWithToken: false); + final CloudflareApi apiClient = CloudflareApi(isWithToken: false); try { isKeyValid = await apiClient.isValid(apiKey.state.value); diff --git a/lib/logic/cubit/forms/setup/initializing/domain_cloudflare.dart b/lib/logic/cubit/forms/setup/initializing/domain_cloudflare.dart index bf9e1eb0..db7044f4 100644 --- a/lib/logic/cubit/forms/setup/initializing/domain_cloudflare.dart +++ b/lib/logic/cubit/forms/setup/initializing/domain_cloudflare.dart @@ -10,9 +10,9 @@ class DomainSetupCubit extends Cubit { Future load() async { emit(Loading(LoadingTypes.loadingDomain)); - var api = CloudflareApi(); + final CloudflareApi api = CloudflareApi(); - var list = await api.domainList(); + final List list = await api.domainList(); if (list.isEmpty) { emit(Empty()); } else if (list.length == 1) { @@ -23,20 +23,18 @@ class DomainSetupCubit extends Cubit { } @override - Future close() { - return super.close(); - } + Future close() => super.close(); Future saveDomain() async { assert(state is Loaded, 'wrong state'); - var domainName = (state as Loaded).domain; - var api = CloudflareApi(); + final String domainName = (state as Loaded).domain; + final CloudflareApi api = CloudflareApi(); emit(Loading(LoadingTypes.saving)); - var zoneId = await api.getZoneId(domainName); + final String zoneId = await api.getZoneId(domainName); - var domain = ServerDomain( + final ServerDomain domain = ServerDomain( domainName: domainName, zoneId: zoneId, provider: DnsProvider.cloudflare, @@ -63,9 +61,9 @@ class Loading extends DomainSetupState { enum LoadingTypes { loadingDomain, saving } class Loaded extends DomainSetupState { - final String domain; Loaded(this.domain); + final String domain; } class DomainSet extends DomainSetupState {} diff --git a/lib/logic/cubit/forms/setup/initializing/hetzner_form_cubit.dart b/lib/logic/cubit/forms/setup/initializing/hetzner_form_cubit.dart index 0d343191..a7e2bb1d 100644 --- a/lib/logic/cubit/forms/setup/initializing/hetzner_form_cubit.dart +++ b/lib/logic/cubit/forms/setup/initializing/hetzner_form_cubit.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:async'; import 'package:cubit_form/cubit_form.dart'; @@ -8,13 +10,13 @@ import 'package:selfprivacy/logic/cubit/forms/validations/validations.dart'; class HetznerFormCubit extends FormCubit { HetznerFormCubit(this.serverInstallationCubit) { - var regExp = RegExp(r'\s+|[-!$%^&*()@+|~=`{}\[\]:<>?,.\/]'); + final RegExp regExp = RegExp(r'\s+|[-!$%^&*()@+|~=`{}\[\]:<>?,.\/]'); apiKey = FieldCubit( initalValue: '', validations: [ RequiredStringValidation('validations.required'.tr()), ValidationModel( - (s) => regExp.hasMatch(s), 'validations.key_format'.tr()), + regExp.hasMatch, 'validations.key_format'.tr(),), LengthStringNotEqualValidation(64) ], ); @@ -34,7 +36,7 @@ class HetznerFormCubit extends FormCubit { @override FutureOr asyncValidation() async { late bool isKeyValid; - HetznerApi apiClient = HetznerApi(isWithToken: false); + final HetznerApi apiClient = HetznerApi(isWithToken: false); try { isKeyValid = await apiClient.isValid(apiKey.state.value); diff --git a/lib/logic/cubit/forms/setup/initializing/root_user_form_cubit.dart b/lib/logic/cubit/forms/setup/initializing/root_user_form_cubit.dart index 6e3e5c3d..0914d86b 100644 --- a/lib/logic/cubit/forms/setup/initializing/root_user_form_cubit.dart +++ b/lib/logic/cubit/forms/setup/initializing/root_user_form_cubit.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:async'; import 'package:cubit_form/cubit_form.dart'; @@ -7,7 +9,7 @@ import 'package:selfprivacy/logic/models/hive/user.dart'; class RootUserFormCubit extends FormCubit { RootUserFormCubit( - this.serverInstallationCubit, final FieldCubitFactory fieldFactory) { + this.serverInstallationCubit, final FieldCubitFactory fieldFactory,) { userName = fieldFactory.createUserLoginField(); password = fieldFactory.createUserPasswordField(); @@ -18,7 +20,7 @@ class RootUserFormCubit extends FormCubit { @override FutureOr onSubmit() async { - var user = User( + final User user = User( login: userName.state.value, password: password.state.value, ); diff --git a/lib/logic/cubit/forms/setup/recovering/recovery_device_form_cubit.dart b/lib/logic/cubit/forms/setup/recovering/recovery_device_form_cubit.dart index 98c08f5c..00f5b685 100644 --- a/lib/logic/cubit/forms/setup/recovering/recovery_device_form_cubit.dart +++ b/lib/logic/cubit/forms/setup/recovering/recovery_device_form_cubit.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:async'; import 'package:cubit_form/cubit_form.dart'; @@ -6,7 +8,7 @@ import 'package:selfprivacy/logic/cubit/forms/factories/field_cubit_factory.dart class RecoveryDeviceFormCubit extends FormCubit { RecoveryDeviceFormCubit(this.installationCubit, - final FieldCubitFactory fieldFactory, this.recoveryMethod) { + final FieldCubitFactory fieldFactory, this.recoveryMethod,) { tokenField = fieldFactory.createRequiredStringField(); super.addFields([tokenField]); diff --git a/lib/logic/cubit/forms/setup/recovering/recovery_domain_form_cubit.dart b/lib/logic/cubit/forms/setup/recovering/recovery_domain_form_cubit.dart index 0064cae8..d2bea806 100644 --- a/lib/logic/cubit/forms/setup/recovering/recovery_domain_form_cubit.dart +++ b/lib/logic/cubit/forms/setup/recovering/recovery_domain_form_cubit.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:async'; import 'package:cubit_form/cubit_form.dart'; @@ -8,7 +10,7 @@ import 'package:selfprivacy/logic/cubit/forms/factories/field_cubit_factory.dart class RecoveryDomainFormCubit extends FormCubit { RecoveryDomainFormCubit( - this.initializingCubit, final FieldCubitFactory fieldFactory) { + this.initializingCubit, final FieldCubitFactory fieldFactory,) { serverDomainField = fieldFactory.createRequiredStringField(); super.addFields([serverDomainField]); @@ -22,10 +24,10 @@ class RecoveryDomainFormCubit extends FormCubit { @override FutureOr asyncValidation() async { - var api = ServerApi( + final ServerApi api = ServerApi( hasLogger: false, isWithToken: false, - overrideDomain: serverDomainField.state.value); + overrideDomain: serverDomainField.state.value,); // API version doesn't require access token, // so if the entered domain is indeed valid @@ -40,7 +42,7 @@ class RecoveryDomainFormCubit extends FormCubit { return domainValid; } - FutureOr setCustomError(String error) { + FutureOr setCustomError(final String error) { serverDomainField.setError(error); } diff --git a/lib/logic/cubit/forms/user/ssh_form_cubit.dart b/lib/logic/cubit/forms/user/ssh_form_cubit.dart index bebbbcd5..4262939e 100644 --- a/lib/logic/cubit/forms/user/ssh_form_cubit.dart +++ b/lib/logic/cubit/forms/user/ssh_form_cubit.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:async'; import 'package:cubit_form/cubit_form.dart'; @@ -11,22 +13,22 @@ class SshFormCubit extends FormCubit { required this.jobsCubit, required this.user, }) { - var keyRegExp = RegExp( - r'^(ssh-rsa AAAAB3NzaC1yc2|ssh-ed25519 AAAAC3NzaC1lZDI1NTE5)[0-9A-Za-z+/]+[=]{0,3}( .*)?$'); + final RegExp keyRegExp = RegExp( + r'^(ssh-rsa AAAAB3NzaC1yc2|ssh-ed25519 AAAAC3NzaC1lZDI1NTE5)[0-9A-Za-z+/]+[=]{0,3}( .*)?$',); key = FieldCubit( initalValue: '', validations: [ ValidationModel( - (newKey) => user.sshKeys.any((key) => key == newKey), + (final String newKey) => user.sshKeys.any((final String key) => key == newKey), 'validations.key_already_exists'.tr(), ), RequiredStringValidation('validations.required'.tr()), - ValidationModel((s) { + ValidationModel((final String s) { print(s); print(keyRegExp.hasMatch(s)); return !keyRegExp.hasMatch(s); - }, 'validations.invalid_format'.tr()), + }, 'validations.invalid_format'.tr(),), ], ); diff --git a/lib/logic/cubit/forms/user/user_form_cubit.dart b/lib/logic/cubit/forms/user/user_form_cubit.dart index dbe19ad5..30d83e26 100644 --- a/lib/logic/cubit/forms/user/user_form_cubit.dart +++ b/lib/logic/cubit/forms/user/user_form_cubit.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:async'; import 'package:cubit_form/cubit_form.dart'; @@ -10,23 +12,23 @@ import 'package:selfprivacy/utils/password_generator.dart'; class UserFormCubit extends FormCubit { UserFormCubit({ required this.jobsCubit, - required FieldCubitFactory fieldFactory, - User? user, + required final FieldCubitFactory fieldFactory, + final User? user, }) { - var isEdit = user != null; + final bool isEdit = user != null; login = fieldFactory.createUserLoginField(); login.setValue(isEdit ? user.login : ''); password = fieldFactory.createUserPasswordField(); password.setValue( - isEdit ? (user.password ?? '') : StringGenerators.userPassword()); + isEdit ? (user.password ?? '') : StringGenerators.userPassword(),); super.addFields([login, password]); } @override FutureOr onSubmit() { - var user = User( + final User user = User( login: login.state.value, password: password.state.value, ); diff --git a/lib/logic/cubit/forms/validations/validations.dart b/lib/logic/cubit/forms/validations/validations.dart index 800ca77b..dd2e653b 100644 --- a/lib/logic/cubit/forms/validations/validations.dart +++ b/lib/logic/cubit/forms/validations/validations.dart @@ -1,28 +1,29 @@ +// ignore_for_file: always_specify_types + import 'package:cubit_form/cubit_form.dart'; import 'package:easy_localization/easy_localization.dart'; abstract class LengthStringValidation extends ValidationModel { - LengthStringValidation(bool Function(String) predicate, String errorMessage) - : super(predicate, errorMessage); + LengthStringValidation(super.predicate, super.errorMessage); @override - String? check(String val) { - var length = val.length; - var errorMessage = errorMassage.replaceAll('[]', length.toString()); + String? check(final String val) { + final int length = val.length; + final String errorMessage = errorMassage.replaceAll('[]', length.toString()); return test(val) ? errorMessage : null; } } class LengthStringNotEqualValidation extends LengthStringValidation { /// String must be equal to [length] - LengthStringNotEqualValidation(int length) - : super((n) => n.length != length, - 'validations.length_not_equal'.tr(args: [length.toString()])); + LengthStringNotEqualValidation(final int length) + : super((final n) => n.length != length, + 'validations.length_not_equal'.tr(args: [length.toString()]),); } class LengthStringLongerValidation extends LengthStringValidation { /// String must be shorter than or equal to [length] - LengthStringLongerValidation(int length) - : super((n) => n.length > length, - 'validations.length_longer'.tr(args: [length.toString()])); + LengthStringLongerValidation(final int length) + : super((final n) => n.length > length, + 'validations.length_longer'.tr(args: [length.toString()]),); } diff --git a/lib/logic/cubit/hetzner_metrics/hetzner_metrics_cubit.dart b/lib/logic/cubit/hetzner_metrics/hetzner_metrics_cubit.dart index d16b13b0..aaae36c5 100644 --- a/lib/logic/cubit/hetzner_metrics/hetzner_metrics_cubit.dart +++ b/lib/logic/cubit/hetzner_metrics/hetzner_metrics_cubit.dart @@ -5,19 +5,19 @@ import 'package:equatable/equatable.dart'; import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/logic/models/hetzner_metrics.dart'; -import 'hetzner_metrics_repository.dart'; +import 'package:selfprivacy/logic/cubit/hetzner_metrics/hetzner_metrics_repository.dart'; part 'hetzner_metrics_state.dart'; class HetznerMetricsCubit extends Cubit { HetznerMetricsCubit() : super(const HetznerMetricsLoading(Period.day)); - final repository = HetznerMetricsRepository(); + final HetznerMetricsRepository repository = HetznerMetricsRepository(); Timer? timer; @override - close() { + Future close() { closeTimer(); return super.close(); } @@ -28,7 +28,7 @@ class HetznerMetricsCubit extends Cubit { } } - void changePeriod(Period period) async { + void changePeriod(final Period period) async { closeTimer(); emit(HetznerMetricsLoading(period)); load(period); @@ -38,8 +38,8 @@ class HetznerMetricsCubit extends Cubit { load(state.period); } - void load(Period period) async { - var newState = await repository.getMetrics(period); + void load(final Period period) async { + final HetznerMetricsLoaded newState = await repository.getMetrics(period); timer = Timer( Duration(seconds: newState.stepInSeconds.toInt()), () => load(newState.period), diff --git a/lib/logic/cubit/hetzner_metrics/hetzner_metrics_repository.dart b/lib/logic/cubit/hetzner_metrics/hetzner_metrics_repository.dart index fe601cc6..f9bcf15f 100644 --- a/lib/logic/cubit/hetzner_metrics/hetzner_metrics_repository.dart +++ b/lib/logic/cubit/hetzner_metrics/hetzner_metrics_repository.dart @@ -1,12 +1,14 @@ +// ignore_for_file: always_specify_types + import 'package:selfprivacy/logic/api_maps/hetzner.dart'; import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/logic/models/hetzner_metrics.dart'; -import 'hetzner_metrics_cubit.dart'; +import 'package:selfprivacy/logic/cubit/hetzner_metrics/hetzner_metrics_cubit.dart'; class HetznerMetricsRepository { - Future getMetrics(Period period) async { - var end = DateTime.now(); + Future getMetrics(final Period period) async { + final DateTime end = DateTime.now(); DateTime start; switch (period) { @@ -21,15 +23,15 @@ class HetznerMetricsRepository { break; } - var api = HetznerApi(hasLogger: true); + final HetznerApi api = HetznerApi(hasLogger: true); - var results = await Future.wait([ + final List> results = await Future.wait([ api.getMetrics(start, end, 'cpu'), api.getMetrics(start, end, 'network'), ]); - var cpuMetricsData = results[0]['metrics']; - var networkMetricsData = results[1]['metrics']; + final cpuMetricsData = results[0]['metrics']; + final networkMetricsData = results[1]['metrics']; return HetznerMetricsLoaded( period: period, @@ -50,7 +52,7 @@ class HetznerMetricsRepository { } List timeSeriesSerializer( - Map json, String type) { - List list = json['time_series'][type]['values']; - return list.map((el) => TimeSeriesData(el[0], double.parse(el[1]))).toList(); + final Map json, final String type,) { + final List list = json['time_series'][type]['values']; + return list.map((final el) => TimeSeriesData(el[0], double.parse(el[1]))).toList(); } diff --git a/lib/logic/cubit/hetzner_metrics/hetzner_metrics_state.dart b/lib/logic/cubit/hetzner_metrics/hetzner_metrics_state.dart index b6204db9..793bfdfc 100644 --- a/lib/logic/cubit/hetzner_metrics/hetzner_metrics_state.dart +++ b/lib/logic/cubit/hetzner_metrics/hetzner_metrics_state.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + part of 'hetzner_metrics_cubit.dart'; abstract class HetznerMetricsState extends Equatable { diff --git a/lib/logic/cubit/jobs/jobs_cubit.dart b/lib/logic/cubit/jobs/jobs_cubit.dart index f2ce57d1..7f116f1d 100644 --- a/lib/logic/cubit/jobs/jobs_cubit.dart +++ b/lib/logic/cubit/jobs/jobs_cubit.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:easy_localization/easy_localization.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -17,12 +19,12 @@ class JobsCubit extends Cubit { required this.servicesCubit, }) : super(JobsStateEmpty()); - final api = ServerApi(); + final ServerApi api = ServerApi(); final UsersCubit usersCubit; final ServicesCubit servicesCubit; - void addJob(Job job) { - var newJobsList = []; + void addJob(final Job job) { + final List newJobsList = []; if (state is JobsStateWithJobs) { newJobsList.addAll((state as JobsStateWithJobs).jobList); } @@ -31,21 +33,21 @@ class JobsCubit extends Cubit { emit(JobsStateWithJobs(newJobsList)); } - void removeJob(String id) { - final newState = (state as JobsStateWithJobs).removeById(id); + void removeJob(final String id) { + final JobsState newState = (state as JobsStateWithJobs).removeById(id); emit(newState); } - void createOrRemoveServiceToggleJob(ToggleJob job) { - var newJobsList = []; + void createOrRemoveServiceToggleJob(final ToggleJob job) { + final List newJobsList = []; if (state is JobsStateWithJobs) { newJobsList.addAll((state as JobsStateWithJobs).jobList); } - var needToRemoveJob = - newJobsList.any((el) => el is ServiceToggleJob && el.type == job.type); + final bool needToRemoveJob = + newJobsList.any((final el) => el is ServiceToggleJob && el.type == job.type); if (needToRemoveJob) { - var removingJob = newJobsList - .firstWhere(((el) => el is ServiceToggleJob && el.type == job.type)); + final Job removingJob = newJobsList + .firstWhere((final el) => el is ServiceToggleJob && el.type == job.type); removeJob(removingJob.id); } else { newJobsList.add(job); @@ -54,12 +56,12 @@ class JobsCubit extends Cubit { } } - void createShhJobIfNotExist(CreateSSHKeyJob job) { - var newJobsList = []; + void createShhJobIfNotExist(final CreateSSHKeyJob job) { + final List newJobsList = []; if (state is JobsStateWithJobs) { newJobsList.addAll((state as JobsStateWithJobs).jobList); } - var isExistInJobList = newJobsList.any((el) => el is CreateSSHKeyJob); + final bool isExistInJobList = newJobsList.any((final el) => el is CreateSSHKeyJob); if (!isExistInJobList) { newJobsList.add(job); getIt().showSnackBar('jobs.jobAdded'.tr()); @@ -69,7 +71,7 @@ class JobsCubit extends Cubit { Future rebootServer() async { emit(JobsStateLoading()); - final isSuccessful = await api.reboot(); + final bool isSuccessful = await api.reboot(); if (isSuccessful) { getIt().showSnackBar('jobs.rebootSuccess'.tr()); } else { @@ -80,8 +82,8 @@ class JobsCubit extends Cubit { Future upgradeServer() async { emit(JobsStateLoading()); - final isPullSuccessful = await api.pullConfigurationUpdate(); - final isSuccessful = await api.upgrade(); + final bool isPullSuccessful = await api.pullConfigurationUpdate(); + final bool isSuccessful = await api.upgrade(); if (isSuccessful) { if (!isPullSuccessful) { getIt().showSnackBar('jobs.configPullFailed'.tr()); @@ -96,10 +98,10 @@ class JobsCubit extends Cubit { Future applyAll() async { if (state is JobsStateWithJobs) { - var jobs = (state as JobsStateWithJobs).jobList; + final List jobs = (state as JobsStateWithJobs).jobList; emit(JobsStateLoading()); - var hasServiceJobs = false; - for (var job in jobs) { + bool hasServiceJobs = false; + for (final Job job in jobs) { if (job is CreateUserJob) { await usersCubit.createUser(job.user); } diff --git a/lib/logic/cubit/jobs/jobs_state.dart b/lib/logic/cubit/jobs/jobs_state.dart index 972f4b3d..0817dfbf 100644 --- a/lib/logic/cubit/jobs/jobs_state.dart +++ b/lib/logic/cubit/jobs/jobs_state.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + part of 'jobs_cubit.dart'; abstract class JobsState extends Equatable { @@ -13,8 +15,8 @@ class JobsStateWithJobs extends JobsState { JobsStateWithJobs(this.jobList); final List jobList; - JobsState removeById(String id) { - var newJobsList = jobList.where((element) => element.id != id).toList(); + JobsState removeById(final String id) { + final List newJobsList = jobList.where((final element) => element.id != id).toList(); if (newJobsList.isEmpty) { return JobsStateEmpty(); diff --git a/lib/logic/cubit/providers/providers_cubit.dart b/lib/logic/cubit/providers/providers_cubit.dart index 5d48ecda..eb33046f 100644 --- a/lib/logic/cubit/providers/providers_cubit.dart +++ b/lib/logic/cubit/providers/providers_cubit.dart @@ -11,8 +11,8 @@ part 'providers_state.dart'; class ProvidersCubit extends Cubit { ProvidersCubit() : super(InitialProviderState()); - void connect(ProviderModel provider) { - var newState = state.updateElement(provider, StateType.stable); + void connect(final ProviderModel provider) { + final ProvidersState newState = state.updateElement(provider, StateType.stable); emit(newState); } } diff --git a/lib/logic/cubit/providers/providers_state.dart b/lib/logic/cubit/providers/providers_state.dart index 8297699d..89951b60 100644 --- a/lib/logic/cubit/providers/providers_state.dart +++ b/lib/logic/cubit/providers/providers_state.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + part of 'providers_cubit.dart'; class ProvidersState extends Equatable { @@ -5,18 +7,18 @@ class ProvidersState extends Equatable { final List all; - ProvidersState updateElement(ProviderModel provider, StateType newState) { - var newList = [...all]; - var index = newList.indexOf(provider); + ProvidersState updateElement(final ProviderModel provider, final StateType newState) { + final List newList = [...all]; + final int index = newList.indexOf(provider); newList[index] = provider.updateState(newState); return ProvidersState(newList); } List get connected => - all.where((service) => service.state != StateType.uninitialized).toList(); + all.where((final service) => service.state != StateType.uninitialized).toList(); List get uninitialized => - all.where((service) => service.state == StateType.uninitialized).toList(); + all.where((final service) => service.state == StateType.uninitialized).toList(); bool get isFullyInitialized => uninitialized.isEmpty; @@ -29,7 +31,7 @@ class InitialProviderState extends ProvidersState { : super( ProviderType.values .map( - (type) => ProviderModel( + (final type) => ProviderModel( state: StateType.uninitialized, type: type, ), diff --git a/lib/logic/cubit/recovery_key/recovery_key_cubit.dart b/lib/logic/cubit/recovery_key/recovery_key_cubit.dart index 6b120d0e..032fd31b 100644 --- a/lib/logic/cubit/recovery_key/recovery_key_cubit.dart +++ b/lib/logic/cubit/recovery_key/recovery_key_cubit.dart @@ -7,20 +7,20 @@ part 'recovery_key_state.dart'; class RecoveryKeyCubit extends ServerInstallationDependendCubit { - RecoveryKeyCubit(ServerInstallationCubit serverInstallationCubit) + RecoveryKeyCubit(final ServerInstallationCubit serverInstallationCubit) : super(serverInstallationCubit, const RecoveryKeyState.initial()); - final api = ServerApi(); + final ServerApi api = ServerApi(); @override void load() async { if (serverInstallationCubit.state is ServerInstallationFinished) { - final status = await _getRecoveryKeyStatus(); + final RecoveryKeyStatus? status = await _getRecoveryKeyStatus(); if (status == null) { emit(state.copyWith(loadingStatus: LoadingStatus.error)); } else { emit(state.copyWith( - status: status, loadingStatus: LoadingStatus.success)); + status: status, loadingStatus: LoadingStatus.success,),); } } else { emit(state.copyWith(loadingStatus: LoadingStatus.uninitialized)); @@ -39,18 +39,18 @@ class RecoveryKeyCubit Future refresh() async { emit(state.copyWith(loadingStatus: LoadingStatus.refreshing)); - final status = await _getRecoveryKeyStatus(); + final RecoveryKeyStatus? status = await _getRecoveryKeyStatus(); if (status == null) { emit(state.copyWith(loadingStatus: LoadingStatus.error)); } else { emit( - state.copyWith(status: status, loadingStatus: LoadingStatus.success)); + state.copyWith(status: status, loadingStatus: LoadingStatus.success),); } } Future generateRecoveryKey({ - DateTime? expirationDate, - int? numberOfUses, + final DateTime? expirationDate, + final int? numberOfUses, }) async { final ApiResponse response = await api.generateRecoveryToken(expirationDate, numberOfUses); @@ -69,7 +69,7 @@ class RecoveryKeyCubit } class GenerationError extends Error { - final String message; GenerationError(this.message); + final String message; } diff --git a/lib/logic/cubit/recovery_key/recovery_key_state.dart b/lib/logic/cubit/recovery_key/recovery_key_state.dart index f5eb1090..bd6664ef 100644 --- a/lib/logic/cubit/recovery_key/recovery_key_state.dart +++ b/lib/logic/cubit/recovery_key/recovery_key_state.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + part of 'recovery_key_cubit.dart'; class RecoveryKeyState extends ServerInstallationDependendState { @@ -5,7 +7,7 @@ class RecoveryKeyState extends ServerInstallationDependendState { const RecoveryKeyState.initial() : this(const RecoveryKeyStatus(exists: false, valid: false), - LoadingStatus.refreshing); + LoadingStatus.refreshing,); final RecoveryKeyStatus _status; final LoadingStatus loadingStatus; @@ -19,12 +21,10 @@ class RecoveryKeyState extends ServerInstallationDependendState { List get props => [_status, loadingStatus]; RecoveryKeyState copyWith({ - RecoveryKeyStatus? status, - LoadingStatus? loadingStatus, - }) { - return RecoveryKeyState( + final RecoveryKeyStatus? status, + final LoadingStatus? loadingStatus, + }) => RecoveryKeyState( status ?? _status, loadingStatus ?? this.loadingStatus, ); - } } diff --git a/lib/logic/cubit/server_detailed_info/server_detailed_info_cubit.dart b/lib/logic/cubit/server_detailed_info/server_detailed_info_cubit.dart index dea0081a..ac5cbec5 100644 --- a/lib/logic/cubit/server_detailed_info/server_detailed_info_cubit.dart +++ b/lib/logic/cubit/server_detailed_info/server_detailed_info_cubit.dart @@ -14,16 +14,16 @@ class ServerDetailsCubit extends Cubit { ServerDetailsRepository repository = ServerDetailsRepository(); void check() async { - var isReadyToCheck = getIt().serverDetails != null; + final bool isReadyToCheck = getIt().serverDetails != null; if (isReadyToCheck) { emit(ServerDetailsLoading()); - var data = await repository.load(); + final ServerDetailsRepositoryDto data = await repository.load(); emit(Loaded( serverInfo: data.hetznerServerInfo, autoUpgradeSettings: data.autoUpgradeSettings, serverTimezone: data.serverTimezone, checkTime: DateTime.now(), - )); + ),); } else { emit(ServerDetailsNotReady()); } diff --git a/lib/logic/cubit/server_detailed_info/server_detailed_info_repository.dart b/lib/logic/cubit/server_detailed_info/server_detailed_info_repository.dart index 842fa527..00bd9ec4 100644 --- a/lib/logic/cubit/server_detailed_info/server_detailed_info_repository.dart +++ b/lib/logic/cubit/server_detailed_info/server_detailed_info_repository.dart @@ -5,8 +5,8 @@ import 'package:selfprivacy/logic/models/json/hetzner_server_info.dart'; import 'package:selfprivacy/logic/models/timezone_settings.dart'; class ServerDetailsRepository { - var hetznerAPi = HetznerApi(); - var selfprivacyServer = ServerApi(); + HetznerApi hetznerAPi = HetznerApi(); + ServerApi selfprivacyServer = ServerApi(); Future load() async { print('load'); @@ -19,15 +19,15 @@ class ServerDetailsRepository { } class ServerDetailsRepositoryDto { - final HetznerServerInfo hetznerServerInfo; - - final TimeZoneSettings serverTimezone; - - final AutoUpgradeSettings autoUpgradeSettings; ServerDetailsRepositoryDto({ required this.hetznerServerInfo, required this.serverTimezone, required this.autoUpgradeSettings, }); + final HetznerServerInfo hetznerServerInfo; + + final TimeZoneSettings serverTimezone; + + final AutoUpgradeSettings autoUpgradeSettings; } diff --git a/lib/logic/cubit/server_detailed_info/server_detailed_info_state.dart b/lib/logic/cubit/server_detailed_info/server_detailed_info_state.dart index 034d2a47..6a984328 100644 --- a/lib/logic/cubit/server_detailed_info/server_detailed_info_state.dart +++ b/lib/logic/cubit/server_detailed_info/server_detailed_info_state.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + part of 'server_detailed_info_cubit.dart'; abstract class ServerDetailsState extends Equatable { @@ -16,12 +18,6 @@ class ServerDetailsNotReady extends ServerDetailsState {} class Loading extends ServerDetailsState {} class Loaded extends ServerDetailsState { - final HetznerServerInfo serverInfo; - - final TimeZoneSettings serverTimezone; - - final AutoUpgradeSettings autoUpgradeSettings; - final DateTime checkTime; const Loaded({ required this.serverInfo, @@ -29,6 +25,12 @@ class Loaded extends ServerDetailsState { required this.autoUpgradeSettings, required this.checkTime, }); + final HetznerServerInfo serverInfo; + + final TimeZoneSettings serverTimezone; + + final AutoUpgradeSettings autoUpgradeSettings; + final DateTime checkTime; @override List get props => [ diff --git a/lib/logic/cubit/server_installation/server_installation_cubit.dart b/lib/logic/cubit/server_installation/server_installation_cubit.dart index 18367eb0..3f156e4b 100644 --- a/lib/logic/cubit/server_installation/server_installation_cubit.dart +++ b/lib/logic/cubit/server_installation/server_installation_cubit.dart @@ -10,7 +10,7 @@ import 'package:selfprivacy/logic/models/hive/server_domain.dart'; import 'package:selfprivacy/logic/models/hive/user.dart'; import 'package:selfprivacy/logic/models/server_basic_info.dart'; -import '../server_installation/server_installation_repository.dart'; +import 'package:selfprivacy/logic/cubit/server_installation/server_installation_repository.dart'; export 'package:provider/provider.dart'; @@ -19,12 +19,13 @@ part '../server_installation/server_installation_state.dart'; class ServerInstallationCubit extends Cubit { ServerInstallationCubit() : super(const ServerInstallationEmpty()); - final repository = ServerInstallationRepository(); + final ServerInstallationRepository repository = + ServerInstallationRepository(); Timer? timer; Future load() async { - var state = await repository.load(); + final ServerInstallationState state = await repository.load(); if (state is ServerInstallationFinished) { emit(state); @@ -48,33 +49,38 @@ class ServerInstallationCubit extends Cubit { } } - void setHetznerKey(String hetznerKey) async { + void setHetznerKey(final String hetznerKey) async { await repository.saveHetznerKey(hetznerKey); if (state is ServerInstallationRecovery) { - emit((state as ServerInstallationRecovery).copyWith( - hetznerKey: hetznerKey, - currentStep: RecoveryStep.serverSelection, - )); + emit( + (state as ServerInstallationRecovery).copyWith( + hetznerKey: hetznerKey, + currentStep: RecoveryStep.serverSelection, + ), + ); return; } - emit((state as ServerInstallationNotFinished) - .copyWith(hetznerKey: hetznerKey)); + emit( + (state as ServerInstallationNotFinished).copyWith(hetznerKey: hetznerKey), + ); } - void setCloudflareKey(String cloudFlareKey) async { + void setCloudflareKey(final String cloudFlareKey) async { if (state is ServerInstallationRecovery) { setAndValidateCloudflareToken(cloudFlareKey); return; } await repository.saveCloudFlareKey(cloudFlareKey); - emit((state as ServerInstallationNotFinished) - .copyWith(cloudFlareKey: cloudFlareKey)); + emit( + (state as ServerInstallationNotFinished) + .copyWith(cloudFlareKey: cloudFlareKey), + ); } - void setBackblazeKey(String keyId, String applicationKey) async { - var backblazeCredential = BackblazeCredential( + void setBackblazeKey(final String keyId, final String applicationKey) async { + final BackblazeCredential backblazeCredential = BackblazeCredential( keyId: keyId, applicationKey: applicationKey, ); @@ -83,38 +89,45 @@ class ServerInstallationCubit extends Cubit { finishRecoveryProcess(backblazeCredential); return; } - emit((state as ServerInstallationNotFinished) - .copyWith(backblazeCredential: backblazeCredential)); + emit( + (state as ServerInstallationNotFinished) + .copyWith(backblazeCredential: backblazeCredential), + ); } - void setDomain(ServerDomain serverDomain) async { + void setDomain(final ServerDomain serverDomain) async { await repository.saveDomain(serverDomain); - emit((state as ServerInstallationNotFinished) - .copyWith(serverDomain: serverDomain)); + emit( + (state as ServerInstallationNotFinished) + .copyWith(serverDomain: serverDomain), + ); } - void setRootUser(User rootUser) async { + void setRootUser(final User rootUser) async { await repository.saveRootUser(rootUser); emit((state as ServerInstallationNotFinished).copyWith(rootUser: rootUser)); } void createServerAndSetDnsRecords() async { - ServerInstallationNotFinished stateCopy = + final ServerInstallationNotFinished stateCopy = state as ServerInstallationNotFinished; - onCancel() => emit( - (state as ServerInstallationNotFinished).copyWith(isLoading: false)); + void onCancel() => emit( + (state as ServerInstallationNotFinished).copyWith(isLoading: false), + ); - onSuccess(ServerHostingDetails serverDetails) async { + Future onSuccess(final ServerHostingDetails serverDetails) async { await repository.createDnsRecords( serverDetails.ip4, state.serverDomain!, onCancel: onCancel, ); - emit((state as ServerInstallationNotFinished).copyWith( - isLoading: false, - serverDetails: serverDetails, - )); + emit( + (state as ServerInstallationNotFinished).copyWith( + isLoading: false, + serverDetails: serverDetails, + ), + ); runDelayed(startServerIfDnsIsOkay, const Duration(seconds: 30), null); } @@ -133,125 +146,149 @@ class ServerInstallationCubit extends Cubit { } } - void startServerIfDnsIsOkay({ServerInstallationNotFinished? state}) async { - final dataState = state ?? this.state as ServerInstallationNotFinished; + void startServerIfDnsIsOkay( + {final ServerInstallationNotFinished? state,}) async { + final ServerInstallationNotFinished dataState = + state ?? this.state as ServerInstallationNotFinished; emit(TimerState(dataState: dataState, isLoading: true)); - var ip4 = dataState.serverDetails!.ip4; - var domainName = dataState.serverDomain!.domainName; + final String ip4 = dataState.serverDetails!.ip4; + final String domainName = dataState.serverDomain!.domainName; - var matches = await repository.isDnsAddressesMatch( - domainName, ip4, dataState.dnsMatches); + final Map matches = await repository.isDnsAddressesMatch( + domainName, + ip4, + dataState.dnsMatches, + ); - if (matches.values.every((value) => value)) { - var server = await repository.startServer( + if (matches.values.every((final bool value) => value)) { + final ServerHostingDetails server = await repository.startServer( dataState.serverDetails!, ); await repository.saveServerDetails(server); await repository.saveIsServerStarted(true); - emit( - dataState.copyWith( - isServerStarted: true, - isLoading: false, - serverDetails: server, - ), + final ServerInstallationNotFinished newState = dataState.copyWith( + isServerStarted: true, + isLoading: false, + serverDetails: server, ); + emit(newState); runDelayed( - resetServerIfServerIsOkay, const Duration(seconds: 60), dataState); + resetServerIfServerIsOkay, + const Duration(seconds: 60), + newState, + ); } else { - emit( - dataState.copyWith( - isLoading: false, - dnsMatches: matches, - ), + final ServerInstallationNotFinished newState = dataState.copyWith( + isLoading: false, + dnsMatches: matches, ); + emit(newState); runDelayed( - startServerIfDnsIsOkay, const Duration(seconds: 30), dataState); + startServerIfDnsIsOkay, + const Duration(seconds: 30), + newState, + ); } } - void oneMoreReset({ServerInstallationNotFinished? state}) async { - final dataState = state ?? this.state as ServerInstallationNotFinished; + void resetServerIfServerIsOkay({ + final ServerInstallationNotFinished? state, + }) async { + final ServerInstallationNotFinished dataState = + state ?? this.state as ServerInstallationNotFinished; emit(TimerState(dataState: dataState, isLoading: true)); - var isServerWorking = await repository.isHttpServerWorking(); + final bool isServerWorking = await repository.isHttpServerWorking(); if (isServerWorking) { - var pauseDuration = const Duration(seconds: 30); - emit(TimerState( - dataState: dataState, - timerStart: DateTime.now(), - isLoading: false, - duration: pauseDuration, - )); + const Duration pauseDuration = Duration(seconds: 30); + emit( + TimerState( + dataState: dataState, + timerStart: DateTime.now(), + isLoading: false, + duration: pauseDuration, + ), + ); timer = Timer(pauseDuration, () async { - var hetznerServerDetails = await repository.restart(); + final ServerHostingDetails hetznerServerDetails = + await repository.restart(); + await repository.saveIsServerResetedFirstTime(true); + await repository.saveServerDetails(hetznerServerDetails); + + final ServerInstallationNotFinished newState = dataState.copyWith( + isServerResetedFirstTime: true, + serverDetails: hetznerServerDetails, + isLoading: false, + ); + + emit(newState); + runDelayed(oneMoreReset, const Duration(seconds: 60), newState); + }); + } else { + runDelayed( + resetServerIfServerIsOkay, + const Duration(seconds: 60), + dataState, + ); + } + } + + void oneMoreReset({final ServerInstallationNotFinished? state}) async { + final ServerInstallationNotFinished dataState = + state ?? this.state as ServerInstallationNotFinished; + + emit(TimerState(dataState: dataState, isLoading: true)); + + final bool isServerWorking = await repository.isHttpServerWorking(); + + if (isServerWorking) { + const Duration pauseDuration = Duration(seconds: 30); + emit( + TimerState( + dataState: dataState, + timerStart: DateTime.now(), + isLoading: false, + duration: pauseDuration, + ), + ); + timer = Timer(pauseDuration, () async { + final ServerHostingDetails hetznerServerDetails = + await repository.restart(); await repository.saveIsServerResetedSecondTime(true); await repository.saveServerDetails(hetznerServerDetails); - emit( - dataState.copyWith( - isServerResetedSecondTime: true, - serverDetails: hetznerServerDetails, - isLoading: false, - ), + final ServerInstallationNotFinished newState = dataState.copyWith( + isServerResetedSecondTime: true, + serverDetails: hetznerServerDetails, + isLoading: false, ); + + emit(newState); runDelayed( - finishCheckIfServerIsOkay, const Duration(seconds: 60), dataState); + finishCheckIfServerIsOkay, + const Duration(seconds: 60), + newState, + ); }); } else { runDelayed(oneMoreReset, const Duration(seconds: 60), dataState); } } - void resetServerIfServerIsOkay({ - ServerInstallationNotFinished? state, - }) async { - final dataState = state ?? this.state as ServerInstallationNotFinished; - - emit(TimerState(dataState: dataState, isLoading: true)); - - var isServerWorking = await repository.isHttpServerWorking(); - - if (isServerWorking) { - var pauseDuration = const Duration(seconds: 30); - emit(TimerState( - dataState: dataState, - timerStart: DateTime.now(), - isLoading: false, - duration: pauseDuration, - )); - timer = Timer(pauseDuration, () async { - var hetznerServerDetails = await repository.restart(); - await repository.saveIsServerResetedFirstTime(true); - await repository.saveServerDetails(hetznerServerDetails); - - emit( - dataState.copyWith( - isServerResetedFirstTime: true, - serverDetails: hetznerServerDetails, - isLoading: false, - ), - ); - runDelayed(oneMoreReset, const Duration(seconds: 60), dataState); - }); - } else { - runDelayed( - resetServerIfServerIsOkay, const Duration(seconds: 60), dataState); - } - } - void finishCheckIfServerIsOkay({ - ServerInstallationNotFinished? state, + final ServerInstallationNotFinished? state, }) async { - final dataState = state ?? this.state as ServerInstallationNotFinished; + final ServerInstallationNotFinished dataState = + state ?? this.state as ServerInstallationNotFinished; emit(TimerState(dataState: dataState, isLoading: true)); - var isServerWorking = await repository.isHttpServerWorking(); + final bool isServerWorking = await repository.isHttpServerWorking(); if (isServerWorking) { await repository.createDkimRecord(dataState.serverDomain!); @@ -260,51 +297,67 @@ class ServerInstallationCubit extends Cubit { emit(dataState.finish()); } else { runDelayed( - finishCheckIfServerIsOkay, const Duration(seconds: 60), dataState); + finishCheckIfServerIsOkay, + const Duration(seconds: 60), + dataState, + ); } } - void runDelayed(void Function() work, Duration delay, - ServerInstallationNotFinished? state) async { - final dataState = state ?? this.state as ServerInstallationNotFinished; + void runDelayed( + final void Function() work, + final Duration delay, + final ServerInstallationNotFinished? state, + ) async { + final ServerInstallationNotFinished dataState = + state ?? this.state as ServerInstallationNotFinished; - emit(TimerState( - dataState: dataState, - timerStart: DateTime.now(), - duration: delay, - isLoading: false, - )); + emit( + TimerState( + dataState: dataState, + timerStart: DateTime.now(), + duration: delay, + isLoading: false, + ), + ); timer = Timer(delay, work); } - void submitDomainForAccessRecovery(String domain) async { - var serverDomain = ServerDomain( + void submitDomainForAccessRecovery(final String domain) async { + final ServerDomain serverDomain = ServerDomain( domainName: domain, provider: DnsProvider.unknown, zoneId: '', ); - final recoveryCapabilities = + final ServerRecoveryCapabilities recoveryCapabilities = await repository.getRecoveryCapabilities(serverDomain); await repository.saveDomain(serverDomain); await repository.saveIsRecoveringServer(true); - emit(ServerInstallationRecovery( - serverDomain: serverDomain, - recoveryCapabilities: recoveryCapabilities, - currentStep: RecoveryStep.selecting, - )); + emit( + ServerInstallationRecovery( + serverDomain: serverDomain, + recoveryCapabilities: recoveryCapabilities, + currentStep: RecoveryStep.selecting, + ), + ); } - void tryToRecover(String token, ServerRecoveryMethods method) async { - final dataState = state as ServerInstallationRecovery; - final serverDomain = dataState.serverDomain; + void tryToRecover( + final String token, final ServerRecoveryMethods method,) async { + final ServerInstallationRecovery dataState = + state as ServerInstallationRecovery; + final ServerDomain? serverDomain = dataState.serverDomain; if (serverDomain == null) { return; } try { Future Function( - ServerDomain, String, ServerRecoveryCapabilities) recoveryFunction; + ServerDomain, + String, + ServerRecoveryCapabilities, + ) recoveryFunction; switch (method) { case ServerRecoveryMethods.newDeviceKey: recoveryFunction = repository.authorizeByNewDeviceKey; @@ -318,16 +371,18 @@ class ServerInstallationCubit extends Cubit { default: throw Exception('Unknown recovery method'); } - final serverDetails = await recoveryFunction( + final ServerHostingDetails serverDetails = await recoveryFunction( serverDomain, token, dataState.recoveryCapabilities, ); await repository.saveServerDetails(serverDetails); - emit(dataState.copyWith( - serverDetails: serverDetails, - currentStep: RecoveryStep.hetznerToken, - )); + emit( + dataState.copyWith( + serverDetails: serverDetails, + currentStep: RecoveryStep.hetznerToken, + ), + ); } on ServerAuthorizationException { getIt() .showSnackBar('recovering.authorization_failed'.tr()); @@ -340,7 +395,8 @@ class ServerInstallationCubit extends Cubit { } void revertRecoveryStep() { - final dataState = state as ServerInstallationRecovery; + final ServerInstallationRecovery dataState = + state as ServerInstallationRecovery; switch (dataState.currentStep) { case RecoveryStep.selecting: repository.deleteDomain(); @@ -349,15 +405,19 @@ class ServerInstallationCubit extends Cubit { case RecoveryStep.recoveryKey: case RecoveryStep.newDeviceKey: case RecoveryStep.oldToken: - emit(dataState.copyWith( - currentStep: RecoveryStep.selecting, - )); + emit( + dataState.copyWith( + currentStep: RecoveryStep.selecting, + ), + ); break; case RecoveryStep.serverSelection: repository.deleteHetznerKey(); - emit(dataState.copyWith( - currentStep: RecoveryStep.hetznerToken, - )); + emit( + dataState.copyWith( + currentStep: RecoveryStep.hetznerToken, + ), + ); break; // We won't revert steps after client is authorized default: @@ -365,48 +425,60 @@ class ServerInstallationCubit extends Cubit { } } - void selectRecoveryMethod(ServerRecoveryMethods method) { - final dataState = state as ServerInstallationRecovery; + void selectRecoveryMethod(final ServerRecoveryMethods method) { + final ServerInstallationRecovery dataState = + state as ServerInstallationRecovery; switch (method) { case ServerRecoveryMethods.newDeviceKey: - emit(dataState.copyWith( - currentStep: RecoveryStep.newDeviceKey, - )); + emit( + dataState.copyWith( + currentStep: RecoveryStep.newDeviceKey, + ), + ); break; case ServerRecoveryMethods.recoveryKey: - emit(dataState.copyWith( - currentStep: RecoveryStep.recoveryKey, - )); + emit( + dataState.copyWith( + currentStep: RecoveryStep.recoveryKey, + ), + ); break; case ServerRecoveryMethods.oldToken: - emit(dataState.copyWith( - currentStep: RecoveryStep.oldToken, - )); + emit( + dataState.copyWith( + currentStep: RecoveryStep.oldToken, + ), + ); break; } } Future> getServersOnHetznerAccount() async { - final dataState = state as ServerInstallationRecovery; - final servers = await repository.getServersOnHetznerAccount(); - final validated = servers - .map((server) => ServerBasicInfoWithValidators.fromServerBasicInfo( - serverBasicInfo: server, - isIpValid: server.ip == dataState.serverDetails?.ip4, - isReverseDnsValid: - server.reverseDns == dataState.serverDomain?.domainName, - )); + final ServerInstallationRecovery dataState = + state as ServerInstallationRecovery; + final List servers = + await repository.getServersOnHetznerAccount(); + final Iterable validated = servers.map( + (final ServerBasicInfo server) => + ServerBasicInfoWithValidators.fromServerBasicInfo( + serverBasicInfo: server, + isIpValid: server.ip == dataState.serverDetails?.ip4, + isReverseDnsValid: + server.reverseDns == dataState.serverDomain?.domainName, + ), + ); return validated.toList(); } - Future setServerId(ServerBasicInfo server) async { - final dataState = state as ServerInstallationRecovery; - final serverDomain = dataState.serverDomain; + Future setServerId(final ServerBasicInfo server) async { + final ServerInstallationRecovery dataState = + state as ServerInstallationRecovery; + final ServerDomain? serverDomain = dataState.serverDomain; if (serverDomain == null) { return; } - final serverDetails = ServerHostingDetails( + final ServerHostingDetails serverDetails = ServerHostingDetails( ip4: server.ip, id: server.id, createTime: server.created, @@ -419,50 +491,60 @@ class ServerInstallationCubit extends Cubit { ); await repository.saveDomain(serverDomain); await repository.saveServerDetails(serverDetails); - emit(dataState.copyWith( - serverDetails: serverDetails, - currentStep: RecoveryStep.cloudflareToken, - )); + emit( + dataState.copyWith( + serverDetails: serverDetails, + currentStep: RecoveryStep.cloudflareToken, + ), + ); } - Future setAndValidateCloudflareToken(String token) async { - final dataState = state as ServerInstallationRecovery; - final serverDomain = dataState.serverDomain; + Future setAndValidateCloudflareToken(final String token) async { + final ServerInstallationRecovery dataState = + state as ServerInstallationRecovery; + final ServerDomain? serverDomain = dataState.serverDomain; if (serverDomain == null) { return; } - final zoneId = await repository.getDomainId(token, serverDomain.domainName); + final String? zoneId = + await repository.getDomainId(token, serverDomain.domainName); if (zoneId == null) { getIt() .showSnackBar('recovering.domain_not_available_on_token'.tr()); return; } - await repository.saveDomain(ServerDomain( - domainName: serverDomain.domainName, - zoneId: zoneId, - provider: DnsProvider.cloudflare, - )); - await repository.saveCloudFlareKey(token); - emit(dataState.copyWith( - serverDomain: ServerDomain( + await repository.saveDomain( + ServerDomain( domainName: serverDomain.domainName, zoneId: zoneId, provider: DnsProvider.cloudflare, ), - cloudFlareKey: token, - currentStep: RecoveryStep.backblazeToken, - )); + ); + await repository.saveCloudFlareKey(token); + emit( + dataState.copyWith( + serverDomain: ServerDomain( + domainName: serverDomain.domainName, + zoneId: zoneId, + provider: DnsProvider.cloudflare, + ), + cloudFlareKey: token, + currentStep: RecoveryStep.backblazeToken, + ), + ); } - void finishRecoveryProcess(BackblazeCredential backblazeCredential) async { + void finishRecoveryProcess( + final BackblazeCredential backblazeCredential,) async { await repository.saveIsServerStarted(true); await repository.saveIsServerResetedFirstTime(true); await repository.saveIsServerResetedSecondTime(true); await repository.saveHasFinalChecked(true); await repository.saveIsRecoveringServer(false); - final mainUser = await repository.getMainUser(); + final User mainUser = await repository.getMainUser(); await repository.saveRootUser(mainUser); - final updatedState = (state as ServerInstallationRecovery).copyWith( + final ServerInstallationRecovery updatedState = + (state as ServerInstallationRecovery).copyWith( backblazeCredential: backblazeCredential, rootUser: mainUser, ); @@ -470,7 +552,7 @@ class ServerInstallationCubit extends Cubit { } @override - void onChange(Change change) { + void onChange(final Change change) { super.onChange(change); print('================================'); print('ServerInstallationState changed!'); @@ -481,9 +563,11 @@ class ServerInstallationCubit extends Cubit { print('BackblazeCredential: ${change.nextState.backblazeCredential}'); if (change.nextState is ServerInstallationRecovery) { print( - 'Recovery Step: ${(change.nextState as ServerInstallationRecovery).currentStep}'); + 'Recovery Step: ${(change.nextState as ServerInstallationRecovery).currentStep}', + ); print( - 'Recovery Capabilities: ${(change.nextState as ServerInstallationRecovery).recoveryCapabilities}'); + 'Recovery Capabilities: ${(change.nextState as ServerInstallationRecovery).recoveryCapabilities}', + ); } if (change.nextState is TimerState) { print('Timer: ${(change.nextState as TimerState).duration}'); @@ -504,23 +588,25 @@ class ServerInstallationCubit extends Cubit { await repository.deleteServer(state.serverDomain!); } await repository.deleteServerRelatedRecords(); - emit(ServerInstallationNotFinished( - hetznerKey: state.hetznerKey, - serverDomain: state.serverDomain, - cloudFlareKey: state.cloudFlareKey, - backblazeCredential: state.backblazeCredential, - rootUser: state.rootUser, - serverDetails: null, - isServerStarted: false, - isServerResetedFirstTime: false, - isServerResetedSecondTime: false, - isLoading: false, - dnsMatches: null, - )); + emit( + ServerInstallationNotFinished( + hetznerKey: state.hetznerKey, + serverDomain: state.serverDomain, + cloudFlareKey: state.cloudFlareKey, + backblazeCredential: state.backblazeCredential, + rootUser: state.rootUser, + serverDetails: null, + isServerStarted: false, + isServerResetedFirstTime: false, + isServerResetedSecondTime: false, + isLoading: false, + dnsMatches: null, + ), + ); } @override - close() { + Future close() { closeTimer(); return super.close(); } diff --git a/lib/logic/cubit/server_installation/server_installation_repository.dart b/lib/logic/cubit/server_installation/server_installation_repository.dart index 3152c39a..075e357b 100644 --- a/lib/logic/cubit/server_installation/server_installation_repository.dart +++ b/lib/logic/cubit/server_installation/server_installation_repository.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:io'; import 'package:basic_utils/basic_utils.dart'; @@ -12,39 +14,41 @@ import 'package:selfprivacy/config/hive_config.dart'; import 'package:selfprivacy/logic/api_maps/cloudflare.dart'; import 'package:selfprivacy/logic/api_maps/hetzner.dart'; import 'package:selfprivacy/logic/api_maps/server.dart'; +import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/logic/models/hive/backblaze_credential.dart'; import 'package:selfprivacy/logic/models/hive/server_details.dart'; import 'package:selfprivacy/logic/models/hive/server_domain.dart'; import 'package:selfprivacy/logic/models/hive/user.dart'; import 'package:selfprivacy/logic/models/json/device_token.dart'; +import 'package:selfprivacy/logic/models/json/hetzner_server_info.dart'; import 'package:selfprivacy/logic/models/message.dart'; import 'package:selfprivacy/logic/models/server_basic_info.dart'; import 'package:selfprivacy/ui/components/action_button/action_button.dart'; import 'package:selfprivacy/ui/components/brand_alert/brand_alert.dart'; -import '../server_installation/server_installation_cubit.dart'; +import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart'; class IpNotFoundException implements Exception { - final String message; IpNotFoundException(this.message); + final String message; } class ServerAuthorizationException implements Exception { - final String message; ServerAuthorizationException(this.message); + final String message; } class ServerInstallationRepository { Box box = Hive.box(BNames.serverInstallationBox); Future load() async { - final hetznerToken = getIt().hetznerKey; - final cloudflareToken = getIt().cloudFlareKey; - final serverDomain = getIt().serverDomain; - final backblazeCredential = getIt().backblazeCredential; - final serverDetails = getIt().serverDetails; + final String? hetznerToken = getIt().hetznerKey; + final String? cloudflareToken = getIt().cloudFlareKey; + final ServerDomain? serverDomain = getIt().serverDomain; + final BackblazeCredential? backblazeCredential = getIt().backblazeCredential; + final ServerHostingDetails? serverDetails = getIt().serverDetails; if (box.get(BNames.hasFinalChecked, defaultValue: false)) { return ServerInstallationFinished( @@ -72,7 +76,7 @@ class ServerInstallationRepository { serverDetails: serverDetails, rootUser: box.get(BNames.rootUser), currentStep: _getCurrentRecoveryStep( - hetznerToken, cloudflareToken, serverDomain, serverDetails), + hetznerToken, cloudflareToken, serverDomain, serverDetails,), recoveryCapabilities: await getRecoveryCapabilities(serverDomain), ); } @@ -95,10 +99,10 @@ class ServerInstallationRepository { } RecoveryStep _getCurrentRecoveryStep( - String? hetznerToken, - String? cloudflareToken, - ServerDomain serverDomain, - ServerHostingDetails? serverDetails, + final String? hetznerToken, + final String? cloudflareToken, + final ServerDomain serverDomain, + final ServerHostingDetails? serverDetails, ) { if (serverDetails != null) { if (hetznerToken != null) { @@ -120,31 +124,31 @@ class ServerInstallationRepository { } Future startServer( - ServerHostingDetails hetznerServer, + final ServerHostingDetails hetznerServer, ) async { - var hetznerApi = HetznerApi(); - var serverDetails = await hetznerApi.powerOn(); + final HetznerApi hetznerApi = HetznerApi(); + final ServerHostingDetails serverDetails = await hetznerApi.powerOn(); return serverDetails; } - Future getDomainId(String token, String domain) async { - var cloudflareApi = CloudflareApi( + Future getDomainId(final String token, final String domain) async { + final CloudflareApi cloudflareApi = CloudflareApi( isWithToken: false, customToken: token, ); try { - final domainId = await cloudflareApi.getZoneId(domain); + final String domainId = await cloudflareApi.getZoneId(domain); return domainId; } on DomainNotFoundException { return null; } } - Future> isDnsAddressesMatch(String? domainName, String? ip4, - Map? skippedMatches) async { - var addresses = [ + Future> isDnsAddressesMatch(final String? domainName, final String? ip4, + final Map? skippedMatches,) async { + final List addresses = [ '$domainName', 'api.$domainName', 'cloud.$domainName', @@ -152,14 +156,14 @@ class ServerInstallationRepository { 'password.$domainName' ]; - var matches = {}; + final Map matches = {}; - for (var address in addresses) { - if (skippedMatches != null && skippedMatches[address] == true) { + for (final String address in addresses) { + if (skippedMatches![address] ?? false) { matches[address] = true; continue; } - var lookupRecordRes = await DnsUtils.lookupRecord( + final List? lookupRecordRes = await DnsUtils.lookupRecord( address, RRecordType.A, provider: DnsApiProvider.CLOUDFLARE, @@ -189,21 +193,21 @@ class ServerInstallationRepository { } Future createServer( - User rootUser, - String domainName, - String cloudFlareKey, - BackblazeCredential backblazeCredential, { - required void Function() onCancel, - required Future Function(ServerHostingDetails serverDetails) + final User rootUser, + final String domainName, + final String cloudFlareKey, + final BackblazeCredential backblazeCredential, { + required final void Function() onCancel, + required final Future Function(ServerHostingDetails serverDetails) onSuccess, }) async { - var hetznerApi = HetznerApi(); + final HetznerApi hetznerApi = HetznerApi(); late ServerVolume dataBase; try { dataBase = await hetznerApi.createVolume(); - var serverDetails = await hetznerApi.createServer( + final ServerHostingDetails serverDetails = await hetznerApi.createServer( cloudFlareKey: cloudFlareKey, rootUser: rootUser, domainName: domainName, @@ -213,7 +217,7 @@ class ServerInstallationRepository { onSuccess(serverDetails); } on DioError catch (e) { if (e.response!.data['error']['code'] == 'uniqueness_error') { - var nav = getIt.get(); + final NavigationService nav = getIt.get(); nav.showPopUpDialog( BrandAlert( title: 'modals.1'.tr(), @@ -224,9 +228,9 @@ class ServerInstallationRepository { isRed: true, onPressed: () async { await hetznerApi.deleteSelfprivacyServerAndAllVolumes( - domainName: domainName); + domainName: domainName,); - var serverDetails = await hetznerApi.createServer( + final ServerHostingDetails serverDetails = await hetznerApi.createServer( cloudFlareKey: cloudFlareKey, rootUser: rootUser, domainName: domainName, @@ -239,9 +243,7 @@ class ServerInstallationRepository { ), ActionButton( text: 'basis.cancel'.tr(), - onPressed: () { - onCancel(); - }, + onPressed: onCancel, ), ], ), @@ -251,11 +253,11 @@ class ServerInstallationRepository { } Future createDnsRecords( - String ip4, - ServerDomain cloudFlareDomain, { - required void Function() onCancel, + final String ip4, + final ServerDomain cloudFlareDomain, { + required final void Function() onCancel, }) async { - var cloudflareApi = CloudflareApi(); + final CloudflareApi cloudflareApi = CloudflareApi(); await cloudflareApi.removeSimilarRecords( ip4: ip4, @@ -268,8 +270,8 @@ class ServerInstallationRepository { cloudFlareDomain: cloudFlareDomain, ); } on DioError catch (e) { - var hetznerApi = HetznerApi(); - var nav = getIt.get(); + final HetznerApi hetznerApi = HetznerApi(); + final NavigationService nav = getIt.get(); nav.showPopUpDialog( BrandAlert( title: e.response!.data['errors'][0]['code'] == 1038 @@ -282,16 +284,14 @@ class ServerInstallationRepository { isRed: true, onPressed: () async { await hetznerApi.deleteSelfprivacyServerAndAllVolumes( - domainName: cloudFlareDomain.domainName); + domainName: cloudFlareDomain.domainName,); onCancel(); }, ), ActionButton( text: 'basis.cancel'.tr(), - onPressed: () { - onCancel(); - }, + onPressed: onCancel, ), ], ), @@ -304,18 +304,18 @@ class ServerInstallationRepository { ); } - Future createDkimRecord(ServerDomain cloudFlareDomain) async { - var cloudflareApi = CloudflareApi(); - var api = ServerApi(); + Future createDkimRecord(final ServerDomain cloudFlareDomain) async { + final CloudflareApi cloudflareApi = CloudflareApi(); + final ServerApi api = ServerApi(); - var dkimRecordString = await api.getDkim(); + final String? dkimRecordString = await api.getDkim(); await cloudflareApi.setDkim(dkimRecordString ?? '', cloudFlareDomain); } Future isHttpServerWorking() async { - var api = ServerApi(); - var isHttpServerWorking = await api.isHttpServerWorking(); + final ServerApi api = ServerApi(); + final bool isHttpServerWorking = await api.isHttpServerWorking(); try { await api.getDkim(); } catch (e) { @@ -325,28 +325,28 @@ class ServerInstallationRepository { } Future restart() async { - var hetznerApi = HetznerApi(); - return await hetznerApi.reset(); + final HetznerApi hetznerApi = HetznerApi(); + return hetznerApi.reset(); } Future powerOn() async { - var hetznerApi = HetznerApi(); - return await hetznerApi.powerOn(); + final HetznerApi hetznerApi = HetznerApi(); + return hetznerApi.powerOn(); } Future getRecoveryCapabilities( - ServerDomain serverDomain, + final ServerDomain serverDomain, ) async { - var serverApi = ServerApi( + final ServerApi serverApi = ServerApi( isWithToken: false, overrideDomain: serverDomain.domainName, ); - final serverApiVersion = await serverApi.getApiVersion(); + final String? serverApiVersion = await serverApi.getApiVersion(); if (serverApiVersion == null) { return ServerRecoveryCapabilities.none; } try { - final parsedVersion = Version.parse(serverApiVersion); + final Version parsedVersion = Version.parse(serverApiVersion); if (!VersionConstraint.parse('>=1.2.0').allows(parsedVersion)) { return ServerRecoveryCapabilities.legacy; } @@ -356,10 +356,10 @@ class ServerInstallationRepository { } } - Future getServerIpFromDomain(ServerDomain serverDomain) async { - final lookup = await DnsUtils.lookupRecord( + Future getServerIpFromDomain(final ServerDomain serverDomain) async { + final List? lookup = await DnsUtils.lookupRecord( serverDomain.domainName, RRecordType.A, - provider: DnsApiProvider.CLOUDFLARE); + provider: DnsApiProvider.CLOUDFLARE,); if (lookup == null || lookup.isEmpty) { throw IpNotFoundException('No IP found for domain $serverDomain'); } @@ -369,39 +369,39 @@ class ServerInstallationRepository { Future getDeviceName() async { final DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); if (kIsWeb) { - return await deviceInfo.webBrowserInfo - .then((value) => '${value.browserName} ${value.platform}'); + return deviceInfo.webBrowserInfo + .then((final WebBrowserInfo value) => '${value.browserName} ${value.platform}'); } else { if (Platform.isAndroid) { - return await deviceInfo.androidInfo - .then((value) => '${value.model} ${value.version.release}'); + return deviceInfo.androidInfo + .then((final AndroidDeviceInfo value) => '${value.model} ${value.version.release}'); } else if (Platform.isIOS) { - return await deviceInfo.iosInfo.then((value) => - '${value.utsname.machine} ${value.systemName} ${value.systemVersion}'); + return deviceInfo.iosInfo.then((final IosDeviceInfo value) => + '${value.utsname.machine} ${value.systemName} ${value.systemVersion}',); } else if (Platform.isLinux) { - return await deviceInfo.linuxInfo.then((value) => value.prettyName); + return deviceInfo.linuxInfo.then((final LinuxDeviceInfo value) => value.prettyName); } else if (Platform.isMacOS) { - return await deviceInfo.macOsInfo - .then((value) => '${value.hostName} ${value.computerName}'); + return deviceInfo.macOsInfo + .then((final MacOsDeviceInfo value) => '${value.hostName} ${value.computerName}'); } else if (Platform.isWindows) { - return await deviceInfo.windowsInfo.then((value) => value.computerName); + return deviceInfo.windowsInfo.then((final WindowsDeviceInfo value) => value.computerName); } } return 'Unidentified'; } Future authorizeByNewDeviceKey( - ServerDomain serverDomain, - String newDeviceKey, - ServerRecoveryCapabilities recoveryCapabilities, + final ServerDomain serverDomain, + final String newDeviceKey, + final ServerRecoveryCapabilities recoveryCapabilities, ) async { - var serverApi = ServerApi( + final ServerApi serverApi = ServerApi( isWithToken: false, overrideDomain: serverDomain.domainName, ); - final serverIp = await getServerIpFromDomain(serverDomain); - final apiResponse = await serverApi.authorizeDevice( - DeviceToken(device: await getDeviceName(), token: newDeviceKey)); + final String serverIp = await getServerIpFromDomain(serverDomain); + final ApiResponse apiResponse = await serverApi.authorizeDevice( + DeviceToken(device: await getDeviceName(), token: newDeviceKey),); if (apiResponse.isSuccess) { return ServerHostingDetails( @@ -424,17 +424,17 @@ class ServerInstallationRepository { } Future authorizeByRecoveryKey( - ServerDomain serverDomain, - String recoveryKey, - ServerRecoveryCapabilities recoveryCapabilities, + final ServerDomain serverDomain, + final String recoveryKey, + final ServerRecoveryCapabilities recoveryCapabilities, ) async { - var serverApi = ServerApi( + final ServerApi serverApi = ServerApi( isWithToken: false, overrideDomain: serverDomain.domainName, ); - final serverIp = await getServerIpFromDomain(serverDomain); - final apiResponse = await serverApi.useRecoveryToken( - DeviceToken(device: await getDeviceName(), token: recoveryKey)); + final String serverIp = await getServerIpFromDomain(serverDomain); + final ApiResponse apiResponse = await serverApi.useRecoveryToken( + DeviceToken(device: await getDeviceName(), token: recoveryKey),); if (apiResponse.isSuccess) { return ServerHostingDetails( @@ -457,18 +457,18 @@ class ServerInstallationRepository { } Future authorizeByApiToken( - ServerDomain serverDomain, - String apiToken, - ServerRecoveryCapabilities recoveryCapabilities, + final ServerDomain serverDomain, + final String apiToken, + final ServerRecoveryCapabilities recoveryCapabilities, ) async { - var serverApi = ServerApi( + final ServerApi serverApi = ServerApi( isWithToken: false, overrideDomain: serverDomain.domainName, customToken: apiToken, ); - final serverIp = await getServerIpFromDomain(serverDomain); + final String serverIp = await getServerIpFromDomain(serverDomain); if (recoveryCapabilities == ServerRecoveryCapabilities.legacy) { - final apiResponse = await serverApi.servicesPowerCheck(); + final Map apiResponse = await serverApi.servicesPowerCheck(); if (apiResponse.isNotEmpty) { return ServerHostingDetails( apiToken: apiToken, @@ -484,13 +484,13 @@ class ServerInstallationRepository { ); } else { throw ServerAuthorizationException( - 'Couldn\'t connect to server with this token', + "Couldn't connect to server with this token", ); } } - final deviceAuthKey = await serverApi.createDeviceToken(); - final apiResponse = await serverApi.authorizeDevice( - DeviceToken(device: await getDeviceName(), token: deviceAuthKey.data)); + final ApiResponse deviceAuthKey = await serverApi.createDeviceToken(); + final ApiResponse apiResponse = await serverApi.authorizeDevice( + DeviceToken(device: await getDeviceName(), token: deviceAuthKey.data),); if (apiResponse.isSuccess) { return ServerHostingDetails( @@ -513,21 +513,21 @@ class ServerInstallationRepository { } Future getMainUser() async { - var serverApi = ServerApi(); - const fallbackUser = User( + final ServerApi serverApi = ServerApi(); + const User fallbackUser = User( isFoundOnServer: false, - note: 'Couldn\'t find main user on server, API is outdated', + note: "Couldn't find main user on server, API is outdated", login: 'UNKNOWN', sshKeys: [], ); - final serverApiVersion = await serverApi.getApiVersion(); - final users = await serverApi.getUsersList(withMainUser: true); + final String? serverApiVersion = await serverApi.getApiVersion(); + final ApiResponse> users = await serverApi.getUsersList(withMainUser: true); if (serverApiVersion == null || !users.isSuccess) { return fallbackUser; } try { - final parsedVersion = Version.parse(serverApiVersion); + final Version parsedVersion = Version.parse(serverApiVersion); if (!VersionConstraint.parse('>=1.2.5').allows(parsedVersion)) { return fallbackUser; } @@ -541,25 +541,25 @@ class ServerInstallationRepository { } Future> getServersOnHetznerAccount() async { - var hetznerApi = HetznerApi(); - final servers = await hetznerApi.getServers(); + final HetznerApi hetznerApi = HetznerApi(); + final List servers = await hetznerApi.getServers(); return servers - .map((server) => ServerBasicInfo( + .map((final HetznerServerInfo server) => ServerBasicInfo( id: server.id, name: server.name, ip: server.publicNet.ipv4.ip, reverseDns: server.publicNet.ipv4.reverseDns, created: server.created, volumeId: server.volumes.isNotEmpty ? server.volumes[0] : 0, - )) + ),) .toList(); } - Future saveServerDetails(ServerHostingDetails serverDetails) async { + Future saveServerDetails(final ServerHostingDetails serverDetails) async { await getIt().storeServerDetails(serverDetails); } - Future saveHetznerKey(String key) async { + Future saveHetznerKey(final String key) async { print('saved'); await getIt().storeHetznerKey(key); } @@ -569,15 +569,15 @@ class ServerInstallationRepository { getIt().init(); } - Future saveBackblazeKey(BackblazeCredential backblazeCredential) async { + Future saveBackblazeKey(final BackblazeCredential backblazeCredential) async { await getIt().storeBackblazeCredential(backblazeCredential); } - Future saveCloudFlareKey(String key) async { + Future saveCloudFlareKey(final String key) async { await getIt().storeCloudFlareKey(key); } - Future saveDomain(ServerDomain serverDomain) async { + Future saveDomain(final ServerDomain serverDomain) async { await getIt().storeServerDomain(serverDomain); } @@ -586,33 +586,33 @@ class ServerInstallationRepository { getIt().init(); } - Future saveIsServerStarted(bool value) async { + Future saveIsServerStarted(final bool value) async { await box.put(BNames.isServerStarted, value); } - Future saveIsServerResetedFirstTime(bool value) async { + Future saveIsServerResetedFirstTime(final bool value) async { await box.put(BNames.isServerResetedFirstTime, value); } - Future saveIsServerResetedSecondTime(bool value) async { + Future saveIsServerResetedSecondTime(final bool value) async { await box.put(BNames.isServerResetedSecondTime, value); } - Future saveRootUser(User rootUser) async { + Future saveRootUser(final User rootUser) async { await box.put(BNames.rootUser, rootUser); } - Future saveIsRecoveringServer(bool value) async { + Future saveIsRecoveringServer(final bool value) async { await box.put(BNames.isRecoveringServer, value); } - Future saveHasFinalChecked(bool value) async { + Future saveHasFinalChecked(final bool value) async { await box.put(BNames.hasFinalChecked, value); } - Future deleteServer(ServerDomain serverDomain) async { - var hetznerApi = HetznerApi(); - var cloudFlare = CloudflareApi(); + Future deleteServer(final ServerDomain serverDomain) async { + final HetznerApi hetznerApi = HetznerApi(); + final CloudflareApi cloudFlare = CloudflareApi(); await hetznerApi.deleteSelfprivacyServerAndAllVolumes( domainName: serverDomain.domainName, diff --git a/lib/logic/cubit/server_installation/server_installation_state.dart b/lib/logic/cubit/server_installation/server_installation_state.dart index e6979ff4..8cd0c2e1 100644 --- a/lib/logic/cubit/server_installation/server_installation_state.dart +++ b/lib/logic/cubit/server_installation/server_installation_state.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + part of '../server_installation/server_installation_cubit.dart'; abstract class ServerInstallationState extends Equatable { @@ -42,9 +44,9 @@ abstract class ServerInstallationState extends Equatable { bool get isUserFilled => rootUser != null; bool get isServerCreated => serverDetails != null; - bool get isFullyInitilized => _fulfilementList.every((el) => el!); + bool get isFullyInitilized => _fulfilementList.every((final el) => el!); ServerSetupProgress get progress => - ServerSetupProgress.values[_fulfilementList.where((el) => el!).length]; + ServerSetupProgress.values[_fulfilementList.where((final el) => el!).length]; int get porgressBar { if (progress.index < 6) { @@ -57,7 +59,7 @@ abstract class ServerInstallationState extends Equatable { } List get _fulfilementList { - var res = [ + final List res = [ isHetznerFilled, isCloudFlareFilled, isBackblazeFilled, @@ -76,9 +78,9 @@ abstract class ServerInstallationState extends Equatable { class TimerState extends ServerInstallationNotFinished { TimerState({ required this.dataState, + required final super.isLoading, this.timerStart, this.duration, - required bool isLoading, }) : super( hetznerKey: dataState.hetznerKey, cloudFlareKey: dataState.cloudFlareKey, @@ -89,7 +91,6 @@ class TimerState extends ServerInstallationNotFinished { isServerStarted: dataState.isServerStarted, isServerResetedFirstTime: dataState.isServerResetedFirstTime, isServerResetedSecondTime: dataState.isServerResetedSecondTime, - isLoading: isLoading, dnsMatches: dataState.dnsMatches, ); @@ -119,32 +120,22 @@ enum ServerSetupProgress { } class ServerInstallationNotFinished extends ServerInstallationState { - final bool isLoading; - final Map? dnsMatches; const ServerInstallationNotFinished({ - String? hetznerKey, - String? cloudFlareKey, - BackblazeCredential? backblazeCredential, - ServerDomain? serverDomain, - User? rootUser, - ServerHostingDetails? serverDetails, - required bool isServerStarted, - required bool isServerResetedFirstTime, - required bool isServerResetedSecondTime, - required this.isLoading, + required final super.isServerStarted, + required final super.isServerResetedFirstTime, + required final super.isServerResetedSecondTime, + required final this.isLoading, required this.dnsMatches, - }) : super( - hetznerKey: hetznerKey, - cloudFlareKey: cloudFlareKey, - backblazeCredential: backblazeCredential, - serverDomain: serverDomain, - rootUser: rootUser, - serverDetails: serverDetails, - isServerStarted: isServerStarted, - isServerResetedFirstTime: isServerResetedFirstTime, - isServerResetedSecondTime: isServerResetedSecondTime, - ); + final super.hetznerKey, + final super.cloudFlareKey, + final super.backblazeCredential, + final super.serverDomain, + final super.rootUser, + final super.serverDetails, + }); + final bool isLoading; + final Map? dnsMatches; @override List get props => [ @@ -161,17 +152,17 @@ class ServerInstallationNotFinished extends ServerInstallationState { ]; ServerInstallationNotFinished copyWith({ - String? hetznerKey, - String? cloudFlareKey, - BackblazeCredential? backblazeCredential, - ServerDomain? serverDomain, - User? rootUser, - ServerHostingDetails? serverDetails, - bool? isServerStarted, - bool? isServerResetedFirstTime, - bool? isServerResetedSecondTime, - bool? isLoading, - Map? dnsMatches, + final String? hetznerKey, + final String? cloudFlareKey, + final BackblazeCredential? backblazeCredential, + final ServerDomain? serverDomain, + final User? rootUser, + final ServerHostingDetails? serverDetails, + final bool? isServerStarted, + final bool? isServerResetedFirstTime, + final bool? isServerResetedSecondTime, + final bool? isLoading, + final Map? dnsMatches, }) => ServerInstallationNotFinished( hetznerKey: hetznerKey ?? this.hetznerKey, @@ -221,26 +212,16 @@ class ServerInstallationEmpty extends ServerInstallationNotFinished { class ServerInstallationFinished extends ServerInstallationState { const ServerInstallationFinished({ - required String hetznerKey, - required String cloudFlareKey, - required BackblazeCredential backblazeCredential, - required ServerDomain serverDomain, - required User rootUser, - required ServerHostingDetails serverDetails, - required bool isServerStarted, - required bool isServerResetedFirstTime, - required bool isServerResetedSecondTime, - }) : super( - hetznerKey: hetznerKey, - cloudFlareKey: cloudFlareKey, - backblazeCredential: backblazeCredential, - serverDomain: serverDomain, - rootUser: rootUser, - serverDetails: serverDetails, - isServerStarted: isServerStarted, - isServerResetedFirstTime: isServerResetedFirstTime, - isServerResetedSecondTime: isServerResetedSecondTime, - ); + required final String super.hetznerKey, + required final String super.cloudFlareKey, + required final BackblazeCredential super.backblazeCredential, + required final ServerDomain super.serverDomain, + required final User super.rootUser, + required final ServerHostingDetails super.serverDetails, + required final super.isServerStarted, + required final super.isServerResetedFirstTime, + required final super.isServerResetedSecondTime, + }); @override List get props => [ @@ -279,29 +260,23 @@ enum ServerRecoveryMethods { } class ServerInstallationRecovery extends ServerInstallationState { - final RecoveryStep currentStep; - final ServerRecoveryCapabilities recoveryCapabilities; const ServerInstallationRecovery({ - String? hetznerKey, - String? cloudFlareKey, - BackblazeCredential? backblazeCredential, - ServerDomain? serverDomain, - User? rootUser, - ServerHostingDetails? serverDetails, required this.currentStep, required this.recoveryCapabilities, + final super.hetznerKey, + final super.cloudFlareKey, + final super.backblazeCredential, + final super.serverDomain, + final super.rootUser, + final super.serverDetails, }) : super( - hetznerKey: hetznerKey, - cloudFlareKey: cloudFlareKey, - backblazeCredential: backblazeCredential, - serverDomain: serverDomain, - rootUser: rootUser, - serverDetails: serverDetails, isServerStarted: true, isServerResetedFirstTime: true, isServerResetedSecondTime: true, ); + final RecoveryStep currentStep; + final ServerRecoveryCapabilities recoveryCapabilities; @override List get props => [ @@ -317,14 +292,14 @@ class ServerInstallationRecovery extends ServerInstallationState { ]; ServerInstallationRecovery copyWith({ - String? hetznerKey, - String? cloudFlareKey, - BackblazeCredential? backblazeCredential, - ServerDomain? serverDomain, - User? rootUser, - ServerHostingDetails? serverDetails, - RecoveryStep? currentStep, - ServerRecoveryCapabilities? recoveryCapabilities, + final String? hetznerKey, + final String? cloudFlareKey, + final BackblazeCredential? backblazeCredential, + final ServerDomain? serverDomain, + final User? rootUser, + final ServerHostingDetails? serverDetails, + final RecoveryStep? currentStep, + final ServerRecoveryCapabilities? recoveryCapabilities, }) => ServerInstallationRecovery( hetznerKey: hetznerKey ?? this.hetznerKey, @@ -337,8 +312,7 @@ class ServerInstallationRecovery extends ServerInstallationState { recoveryCapabilities: recoveryCapabilities ?? this.recoveryCapabilities, ); - ServerInstallationFinished finish() { - return ServerInstallationFinished( + ServerInstallationFinished finish() => ServerInstallationFinished( hetznerKey: hetznerKey!, cloudFlareKey: cloudFlareKey!, backblazeCredential: backblazeCredential!, @@ -349,5 +323,4 @@ class ServerInstallationRecovery extends ServerInstallationState { isServerResetedFirstTime: true, isServerResetedSecondTime: true, ); - } } diff --git a/lib/logic/cubit/services/services_cubit.dart b/lib/logic/cubit/services/services_cubit.dart index 83b22086..f83a2a9a 100644 --- a/lib/logic/cubit/services/services_cubit.dart +++ b/lib/logic/cubit/services/services_cubit.dart @@ -5,13 +5,13 @@ import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_depe part 'services_state.dart'; class ServicesCubit extends ServerInstallationDependendCubit { - ServicesCubit(ServerInstallationCubit serverInstallationCubit) + ServicesCubit(final ServerInstallationCubit serverInstallationCubit) : super(serverInstallationCubit, ServicesState.allOff()); - final api = ServerApi(); + final ServerApi api = ServerApi(); @override Future load() async { if (serverInstallationCubit.state is ServerInstallationFinished) { - var statuses = await api.servicesPowerCheck(); + final Map statuses = await api.servicesPowerCheck(); emit( ServicesState( isPasswordManagerEnable: statuses[ServiceTypes.passwordManager]!, diff --git a/lib/logic/cubit/services/services_state.dart b/lib/logic/cubit/services/services_state.dart index dba7accc..bec81fe1 100644 --- a/lib/logic/cubit/services/services_state.dart +++ b/lib/logic/cubit/services/services_state.dart @@ -1,6 +1,23 @@ +// ignore_for_file: always_specify_types + part of 'services_cubit.dart'; class ServicesState extends ServerInstallationDependendState { + factory ServicesState.allOn() => const ServicesState( + isPasswordManagerEnable: true, + isCloudEnable: true, + isGitEnable: true, + isSocialNetworkEnable: true, + isVpnEnable: true, + ); + + factory ServicesState.allOff() => const ServicesState( + isPasswordManagerEnable: false, + isCloudEnable: false, + isGitEnable: false, + isSocialNetworkEnable: false, + isVpnEnable: false, + ); const ServicesState({ required this.isPasswordManagerEnable, required this.isCloudEnable, @@ -15,23 +32,8 @@ class ServicesState extends ServerInstallationDependendState { final bool isSocialNetworkEnable; final bool isVpnEnable; - factory ServicesState.allOff() => const ServicesState( - isPasswordManagerEnable: false, - isCloudEnable: false, - isGitEnable: false, - isSocialNetworkEnable: false, - isVpnEnable: false, - ); - factory ServicesState.allOn() => const ServicesState( - isPasswordManagerEnable: true, - isCloudEnable: true, - isGitEnable: true, - isSocialNetworkEnable: true, - isVpnEnable: true, - ); - ServicesState enableList( - List list, + final List list, ) => ServicesState( isPasswordManagerEnable: list.contains(ServiceTypes.passwordManager) @@ -48,7 +50,7 @@ class ServicesState extends ServerInstallationDependendState { ); ServicesState disableList( - List list, + final List list, ) => ServicesState( isPasswordManagerEnable: list.contains(ServiceTypes.passwordManager) @@ -74,7 +76,7 @@ class ServicesState extends ServerInstallationDependendState { isVpnEnable ]; - bool isEnableByType(ServiceTypes type) { + bool isEnableByType(final ServiceTypes type) { switch (type) { case ServiceTypes.passwordManager: return isPasswordManagerEnable; diff --git a/lib/logic/cubit/users/users_cubit.dart b/lib/logic/cubit/users/users_cubit.dart index 61d0a789..b96c5683 100644 --- a/lib/logic/cubit/users/users_cubit.dart +++ b/lib/logic/cubit/users/users_cubit.dart @@ -1,78 +1,80 @@ +// ignore_for_file: always_specify_types + import 'package:hive/hive.dart'; import 'package:selfprivacy/config/hive_config.dart'; import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart'; import 'package:selfprivacy/logic/models/hive/user.dart'; -import '../../api_maps/server.dart'; +import 'package:selfprivacy/logic/api_maps/server.dart'; export 'package:provider/provider.dart'; part 'users_state.dart'; class UsersCubit extends ServerInstallationDependendCubit { - UsersCubit(ServerInstallationCubit serverInstallationCubit) + UsersCubit(final ServerInstallationCubit serverInstallationCubit) : super( serverInstallationCubit, const UsersState( - [], User(login: 'root'), User(login: 'loading...'))); + [], User(login: 'root'), User(login: 'loading...'),),); Box box = Hive.box(BNames.usersBox); Box serverInstallationBox = Hive.box(BNames.serverInstallationBox); - final api = ServerApi(); + final ServerApi api = ServerApi(); @override Future load() async { if (serverInstallationCubit.state is ServerInstallationFinished) { - var loadedUsers = box.values.toList(); + final List loadedUsers = box.values.toList(); final primaryUser = serverInstallationBox.get(BNames.rootUser, - defaultValue: const User(login: 'loading...')); - List rootKeys = [ + defaultValue: const User(login: 'loading...'),); + final List rootKeys = [ ...serverInstallationBox.get(BNames.rootKeys, defaultValue: []) ]; if (loadedUsers.isNotEmpty) { emit(UsersState( - loadedUsers, User(login: 'root', sshKeys: rootKeys), primaryUser)); + loadedUsers, User(login: 'root', sshKeys: rootKeys), primaryUser,),); } - final usersFromServer = await api.getUsersList(); + final ApiResponse> usersFromServer = await api.getUsersList(); if (usersFromServer.isSuccess) { - final updatedList = + final List updatedList = mergeLocalAndServerUsers(loadedUsers, usersFromServer.data); emit(UsersState( - updatedList, User(login: 'root', sshKeys: rootKeys), primaryUser)); + updatedList, User(login: 'root', sshKeys: rootKeys), primaryUser,),); } - final usersWithSshKeys = await loadSshKeys(state.users); + final List usersWithSshKeys = await loadSshKeys(state.users); // Update the users it the box box.clear(); box.addAll(usersWithSshKeys); - final rootUserWithSshKeys = (await loadSshKeys([state.rootUser])).first; + final User rootUserWithSshKeys = (await loadSshKeys([state.rootUser])).first; serverInstallationBox.put(BNames.rootKeys, rootUserWithSshKeys.sshKeys); - final primaryUserWithSshKeys = + final User primaryUserWithSshKeys = (await loadSshKeys([state.primaryUser])).first; serverInstallationBox.put(BNames.rootUser, primaryUserWithSshKeys); emit(UsersState( - usersWithSshKeys, rootUserWithSshKeys, primaryUserWithSshKeys)); + usersWithSshKeys, rootUserWithSshKeys, primaryUserWithSshKeys,),); } } List mergeLocalAndServerUsers( - List localUsers, List serverUsers) { + final List localUsers, final List serverUsers,) { // If local user not exists on server, add it with isFoundOnServer = false // If server user not exists on local, add it - List mergedUsers = []; - List serverUsersCopy = List.from(serverUsers); + final List mergedUsers = []; + final List serverUsersCopy = List.from(serverUsers); - for (var localUser in localUsers) { + for (final User localUser in localUsers) { if (serverUsersCopy.contains(localUser.login)) { mergedUsers.add(User( login: localUser.login, isFoundOnServer: true, password: localUser.password, sshKeys: localUser.sshKeys, - )); + ),); serverUsersCopy.remove(localUser.login); } else { mergedUsers.add(User( @@ -80,28 +82,28 @@ class UsersCubit extends ServerInstallationDependendCubit { isFoundOnServer: false, password: localUser.password, note: localUser.note, - )); + ),); } } - for (var serverUser in serverUsersCopy) { + for (final String serverUser in serverUsersCopy) { mergedUsers.add(User( login: serverUser, isFoundOnServer: true, - )); + ),); } return mergedUsers; } - Future> loadSshKeys(List users) async { - List updatedUsers = []; + Future> loadSshKeys(final List users) async { + final List updatedUsers = []; - for (var user in users) { + for (final User user in users) { if (user.isFoundOnServer || user.login == 'root' || user.login == state.primaryUser.login) { - final sshKeys = await api.getUserSshKeys(user); + final ApiResponse> sshKeys = await api.getUserSshKeys(user); print('sshKeys for $user: ${sshKeys.data}'); if (sshKeys.isSuccess) { updatedUsers.add(User( @@ -110,14 +112,14 @@ class UsersCubit extends ServerInstallationDependendCubit { password: user.password, sshKeys: sshKeys.data, note: user.note, - )); + ),); } else { updatedUsers.add(User( login: user.login, isFoundOnServer: true, password: user.password, note: user.note, - )); + ),); } } else { updatedUsers.add(User( @@ -125,7 +127,7 @@ class UsersCubit extends ServerInstallationDependendCubit { isFoundOnServer: false, password: user.password, note: user.note, - )); + ),); } } return updatedUsers; @@ -133,27 +135,27 @@ class UsersCubit extends ServerInstallationDependendCubit { Future refresh() async { List updatedUsers = List.from(state.users); - final usersFromServer = await api.getUsersList(); + final ApiResponse> usersFromServer = await api.getUsersList(); if (usersFromServer.isSuccess) { updatedUsers = mergeLocalAndServerUsers(updatedUsers, usersFromServer.data); } - final usersWithSshKeys = await loadSshKeys(updatedUsers); + final List usersWithSshKeys = await loadSshKeys(updatedUsers); box.clear(); box.addAll(usersWithSshKeys); - final rootUserWithSshKeys = (await loadSshKeys([state.rootUser])).first; + final User rootUserWithSshKeys = (await loadSshKeys([state.rootUser])).first; serverInstallationBox.put(BNames.rootKeys, rootUserWithSshKeys.sshKeys); - final primaryUserWithSshKeys = + final User primaryUserWithSshKeys = (await loadSshKeys([state.primaryUser])).first; serverInstallationBox.put(BNames.rootUser, primaryUserWithSshKeys); emit(UsersState( - usersWithSshKeys, rootUserWithSshKeys, primaryUserWithSshKeys)); + usersWithSshKeys, rootUserWithSshKeys, primaryUserWithSshKeys,),); return; } - Future createUser(User user) async { + Future createUser(final User user) async { // If user exists on server, do nothing - if (state.users.any((u) => u.login == user.login && u.isFoundOnServer)) { + if (state.users.any((final User u) => u.login == user.login && u.isFoundOnServer)) { return; } // If user is root or primary user, do nothing @@ -161,41 +163,41 @@ class UsersCubit extends ServerInstallationDependendCubit { return; } // If API returned error, do nothing - final result = await api.createUser(user); + final ApiResponse result = await api.createUser(user); if (!result.isSuccess) { return; } - var loadedUsers = List.from(state.users); + final List loadedUsers = List.from(state.users); loadedUsers.add(result.data); await box.clear(); await box.addAll(loadedUsers); emit(state.copyWith(users: loadedUsers)); } - Future deleteUser(User user) async { + Future deleteUser(final User user) async { // If user is primary or root, don't delete if (user.login == state.primaryUser.login || user.login == 'root') { return; } - var loadedUsers = List.from(state.users); - final result = await api.deleteUser(user); + final List loadedUsers = List.from(state.users); + final bool result = await api.deleteUser(user); if (result) { - loadedUsers.removeWhere((u) => u.login == user.login); + loadedUsers.removeWhere((final User u) => u.login == user.login); await box.clear(); await box.addAll(loadedUsers); emit(state.copyWith(users: loadedUsers)); } } - Future addSshKey(User user, String publicKey) async { + Future addSshKey(final User user, final String publicKey) async { // If adding root key, use api.addRootSshKey // Otherwise, use api.addUserSshKey if (user.login == 'root') { - final result = await api.addRootSshKey(publicKey); + final ApiResponse result = await api.addRootSshKey(publicKey); if (result.isSuccess) { // Add ssh key to the array of root keys - final rootKeys = serverInstallationBox + final List rootKeys = serverInstallationBox .get(BNames.rootKeys, defaultValue: []) as List; rootKeys.add(publicKey); serverInstallationBox.put(BNames.rootKeys, rootKeys); @@ -207,17 +209,17 @@ class UsersCubit extends ServerInstallationDependendCubit { sshKeys: rootKeys, note: state.rootUser.note, ), - )); + ),); } } else { - final result = await api.addUserSshKey(user, publicKey); + final ApiResponse result = await api.addUserSshKey(user, publicKey); if (result.isSuccess) { // If it is primary user, update primary user if (user.login == state.primaryUser.login) { - List primaryUserKeys = + final List primaryUserKeys = List.from(state.primaryUser.sshKeys); primaryUserKeys.add(publicKey); - final updatedUser = User( + final User updatedUser = User( login: state.primaryUser.login, isFoundOnServer: true, password: state.primaryUser.password, @@ -227,12 +229,12 @@ class UsersCubit extends ServerInstallationDependendCubit { serverInstallationBox.put(BNames.rootUser, updatedUser); emit(state.copyWith( primaryUser: updatedUser, - )); + ),); } else { // If it is not primary user, update user - List userKeys = List.from(user.sshKeys); + final List userKeys = List.from(user.sshKeys); userKeys.add(publicKey); - final updatedUser = User( + final User updatedUser = User( login: user.login, isFoundOnServer: true, password: user.password, @@ -242,23 +244,23 @@ class UsersCubit extends ServerInstallationDependendCubit { await box.putAt(box.values.toList().indexOf(user), updatedUser); emit(state.copyWith( users: box.values.toList(), - )); + ),); } } } } - Future deleteSshKey(User user, String publicKey) async { + Future deleteSshKey(final User user, final String publicKey) async { // All keys are deleted via api.deleteUserSshKey - final result = await api.deleteUserSshKey(user, publicKey); + final ApiResponse result = await api.deleteUserSshKey(user, publicKey); if (result.isSuccess) { // If it is root user, delete key from root keys // If it is primary user, update primary user // If it is not primary user, update user if (user.login == 'root') { - final rootKeys = serverInstallationBox + final List rootKeys = serverInstallationBox .get(BNames.rootKeys, defaultValue: []) as List; rootKeys.remove(publicKey); serverInstallationBox.put(BNames.rootKeys, rootKeys); @@ -270,14 +272,14 @@ class UsersCubit extends ServerInstallationDependendCubit { sshKeys: rootKeys, note: state.rootUser.note, ), - )); + ),); return; } if (user.login == state.primaryUser.login) { - List primaryUserKeys = + final List primaryUserKeys = List.from(state.primaryUser.sshKeys); primaryUserKeys.remove(publicKey); - final updatedUser = User( + final User updatedUser = User( login: state.primaryUser.login, isFoundOnServer: true, password: state.primaryUser.password, @@ -287,12 +289,12 @@ class UsersCubit extends ServerInstallationDependendCubit { serverInstallationBox.put(BNames.rootUser, updatedUser); emit(state.copyWith( primaryUser: updatedUser, - )); + ),); return; } - List userKeys = List.from(user.sshKeys); + final List userKeys = List.from(user.sshKeys); userKeys.remove(publicKey); - final updatedUser = User( + final User updatedUser = User( login: user.login, isFoundOnServer: true, password: user.password, @@ -302,13 +304,13 @@ class UsersCubit extends ServerInstallationDependendCubit { await box.putAt(box.values.toList().indexOf(user), updatedUser); emit(state.copyWith( users: box.values.toList(), - )); + ),); } } @override void clear() async { emit(const UsersState( - [], User(login: 'root'), User(login: 'loading...'))); + [], User(login: 'root'), User(login: 'loading...'),),); } } diff --git a/lib/logic/cubit/users/users_state.dart b/lib/logic/cubit/users/users_state.dart index 4262f26a..a02eb2c1 100644 --- a/lib/logic/cubit/users/users_state.dart +++ b/lib/logic/cubit/users/users_state.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + part of 'users_cubit.dart'; class UsersState extends ServerInstallationDependendState { @@ -11,22 +13,18 @@ class UsersState extends ServerInstallationDependendState { List get props => [users, rootUser, primaryUser]; UsersState copyWith({ - List? users, - User? rootUser, - User? primaryUser, - }) { - return UsersState( + final List? users, + final User? rootUser, + final User? primaryUser, + }) => UsersState( users ?? this.users, rootUser ?? this.rootUser, primaryUser ?? this.primaryUser, ); - } - bool isLoginRegistered(String login) { - return users.any((user) => user.login == login) || + bool isLoginRegistered(final String login) => users.any((final User user) => user.login == login) || login == rootUser.login || login == primaryUser.login; - } bool get isEmpty => users.isEmpty; } diff --git a/lib/logic/get_it/api_config.dart b/lib/logic/get_it/api_config.dart index 3e7ea4b3..6a03e2ef 100644 --- a/lib/logic/get_it/api_config.dart +++ b/lib/logic/get_it/api_config.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:hive/hive.dart'; import 'package:selfprivacy/config/hive_config.dart'; import 'package:selfprivacy/logic/models/hive/backblaze_bucket.dart'; @@ -22,38 +24,38 @@ class ApiConfigModel { ServerDomain? _serverDomain; BackblazeBucket? _backblazeBucket; - Future storeHetznerKey(String value) async { + Future storeHetznerKey(final String value) async { await _box.put(BNames.hetznerKey, value); _hetznerKey = value; } - Future storeCloudFlareKey(String value) async { + Future storeCloudFlareKey(final String value) async { await _box.put(BNames.cloudFlareKey, value); _cloudFlareKey = value; } - Future storeBackblazeCredential(BackblazeCredential value) async { + Future storeBackblazeCredential(final BackblazeCredential value) async { await _box.put(BNames.backblazeCredential, value); _backblazeCredential = value; } - Future storeServerDomain(ServerDomain value) async { + Future storeServerDomain(final ServerDomain value) async { await _box.put(BNames.serverDomain, value); _serverDomain = value; } - Future storeServerDetails(ServerHostingDetails value) async { + Future storeServerDetails(final ServerHostingDetails value) async { await _box.put(BNames.serverDetails, value); _serverDetails = value; } - Future storeBackblazeBucket(BackblazeBucket value) async { + Future storeBackblazeBucket(final BackblazeBucket value) async { await _box.put(BNames.backblazeBucket, value); _backblazeBucket = value; } - clear() { + void clear() { _hetznerKey = null; _cloudFlareKey = null; _backblazeCredential = null; diff --git a/lib/logic/get_it/console.dart b/lib/logic/get_it/console.dart index 979895a1..2fc67b7d 100644 --- a/lib/logic/get_it/console.dart +++ b/lib/logic/get_it/console.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:flutter/material.dart'; import 'package:selfprivacy/logic/models/message.dart'; @@ -6,7 +8,7 @@ class ConsoleModel extends ChangeNotifier { List get messages => _messages; - void addMessage(Message message) { + void addMessage(final Message message) { messages.add(message); notifyListeners(); } diff --git a/lib/logic/get_it/navigation.dart b/lib/logic/get_it/navigation.dart index 0a235434..15adc982 100644 --- a/lib/logic/get_it/navigation.dart +++ b/lib/logic/get_it/navigation.dart @@ -9,18 +9,18 @@ class NavigationService { NavigatorState? get navigator => navigatorKey.currentState; - void showPopUpDialog(AlertDialog dialog) { - final context = navigatorKey.currentState!.overlay!.context; + void showPopUpDialog(final AlertDialog dialog) { + final BuildContext context = navigatorKey.currentState!.overlay!.context; showDialog( context: context, - builder: (_) => dialog, + builder: (final _) => dialog, ); } - void showSnackBar(String text) { - final state = scaffoldMessengerKey.currentState!; - final snack = SnackBar( + void showSnackBar(final String text) { + final ScaffoldMessengerState state = scaffoldMessengerKey.currentState!; + final SnackBar snack = SnackBar( backgroundColor: BrandColors.black.withOpacity(0.8), content: Text(text, style: buttonTitleText), duration: const Duration(seconds: 2), diff --git a/lib/logic/models/hive/backblaze_bucket.dart b/lib/logic/models/hive/backblaze_bucket.dart index 140f2122..ded04b65 100644 --- a/lib/logic/models/hive/backblaze_bucket.dart +++ b/lib/logic/models/hive/backblaze_bucket.dart @@ -8,7 +8,7 @@ class BackblazeBucket { {required this.bucketId, required this.bucketName, required this.applicationKeyId, - required this.applicationKey}); + required this.applicationKey,}); @HiveField(0) final String bucketId; @@ -23,7 +23,5 @@ class BackblazeBucket { final String bucketName; @override - String toString() { - return bucketName; - } + String toString() => bucketName; } diff --git a/lib/logic/models/hive/backblaze_credential.dart b/lib/logic/models/hive/backblaze_credential.dart index 3f0f3ea6..d7bf2d06 100644 --- a/lib/logic/models/hive/backblaze_credential.dart +++ b/lib/logic/models/hive/backblaze_credential.dart @@ -14,16 +14,14 @@ class BackblazeCredential { @HiveField(1) final String applicationKey; - get encodedApiKey => encodedBackblazeKey(keyId, applicationKey); + String get encodedApiKey => encodedBackblazeKey(keyId, applicationKey); @override - String toString() { - return '$keyId: $encodedApiKey'; - } + String toString() => '$keyId: $encodedApiKey'; } -String encodedBackblazeKey(String? keyId, String? applicationKey) { - String apiKey = '$keyId:$applicationKey'; - String encodedApiKey = base64.encode(utf8.encode(apiKey)); +String encodedBackblazeKey(final String? keyId, final String? applicationKey) { + final String apiKey = '$keyId:$applicationKey'; + final String encodedApiKey = base64.encode(utf8.encode(apiKey)); return encodedApiKey; } diff --git a/lib/logic/models/hive/server_details.dart b/lib/logic/models/hive/server_details.dart index a5e5a575..1924aab7 100644 --- a/lib/logic/models/hive/server_details.dart +++ b/lib/logic/models/hive/server_details.dart @@ -35,8 +35,7 @@ class ServerHostingDetails { @HiveField(6, defaultValue: ServerProvider.hetzner) final ServerProvider provider; - ServerHostingDetails copyWith({DateTime? startTime}) { - return ServerHostingDetails( + ServerHostingDetails copyWith({final DateTime? startTime}) => ServerHostingDetails( startTime: startTime ?? this.startTime, createTime: createTime, id: id, @@ -45,7 +44,6 @@ class ServerHostingDetails { apiToken: apiToken, provider: provider, ); - } @override String toString() => id.toString(); diff --git a/lib/logic/models/hive/server_domain.dart b/lib/logic/models/hive/server_domain.dart index 4fdd52c3..9b5d32c1 100644 --- a/lib/logic/models/hive/server_domain.dart +++ b/lib/logic/models/hive/server_domain.dart @@ -20,9 +20,7 @@ class ServerDomain { final DnsProvider provider; @override - String toString() { - return '$domainName: $zoneId'; - } + String toString() => '$domainName: $zoneId'; } @HiveType(typeId: 100) diff --git a/lib/logic/models/hive/user.dart b/lib/logic/models/hive/user.dart index 94ea993f..74809f7e 100644 --- a/lib/logic/models/hive/user.dart +++ b/lib/logic/models/hive/user.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:ui'; import 'package:equatable/equatable.dart'; @@ -37,7 +39,5 @@ class User extends Equatable { Color get color => stringToColor(login); @override - String toString() { - return '$login, ${isFoundOnServer ? 'found' : 'not found'}, ${sshKeys.length} ssh keys, note: $note'; - } + String toString() => '$login, ${isFoundOnServer ? 'found' : 'not found'}, ${sshKeys.length} ssh keys, note: $note'; } diff --git a/lib/logic/models/hive/user.g.dart b/lib/logic/models/hive/user.g.dart index a1889dc1..57c08555 100644 --- a/lib/logic/models/hive/user.g.dart +++ b/lib/logic/models/hive/user.g.dart @@ -1,5 +1,7 @@ // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: always_specify_types + part of 'user.dart'; // ************************************************************************** @@ -11,9 +13,9 @@ class UserAdapter extends TypeAdapter { final int typeId = 1; @override - User read(BinaryReader reader) { - final numOfFields = reader.readByte(); - final fields = { + User read(final BinaryReader reader) { + final int numOfFields = reader.readByte(); + final Map fields = { for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), }; return User( @@ -26,7 +28,7 @@ class UserAdapter extends TypeAdapter { } @override - void write(BinaryWriter writer, User obj) { + void write(final BinaryWriter writer, final User obj) { writer ..writeByte(5) ..writeByte(0) @@ -45,7 +47,7 @@ class UserAdapter extends TypeAdapter { int get hashCode => typeId.hashCode; @override - bool operator ==(Object other) => + bool operator ==(final Object other) => identical(this, other) || other is UserAdapter && runtimeType == other.runtimeType && diff --git a/lib/logic/models/job.dart b/lib/logic/models/job.dart index 7ee8e418..d64b79e2 100644 --- a/lib/logic/models/job.dart +++ b/lib/logic/models/job.dart @@ -1,16 +1,18 @@ +// ignore_for_file: always_specify_types + import 'package:easy_localization/easy_localization.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/utils/password_generator.dart'; -import 'hive/user.dart'; +import 'package:selfprivacy/logic/models/hive/user.dart'; @immutable class Job extends Equatable { Job({ - String? id, required this.title, + final String? id, }) : id = id ?? StringGenerators.simpleId(); final String title; @@ -45,8 +47,8 @@ class DeleteUserJob extends Job { class ToggleJob extends Job { ToggleJob({ required this.type, - required String title, - }) : super(title: title); + required final super.title, + }); final dynamic type; @@ -56,12 +58,11 @@ class ToggleJob extends Job { class ServiceToggleJob extends ToggleJob { ServiceToggleJob({ - required ServiceTypes type, + required final ServiceTypes super.type, required this.needToTurnOn, }) : super( title: '${needToTurnOn ? "jobs.serviceTurnOn".tr() : "jobs.serviceTurnOff".tr()} ${type.title}', - type: type, ); final bool needToTurnOn; diff --git a/lib/logic/models/json/api_token.dart b/lib/logic/models/json/api_token.dart index 867e11d5..5e33fd4f 100644 --- a/lib/logic/models/json/api_token.dart +++ b/lib/logic/models/json/api_token.dart @@ -4,6 +4,9 @@ part 'api_token.g.dart'; @JsonSerializable() class ApiToken { + + factory ApiToken.fromJson(final Map json) => + _$ApiTokenFromJson(json); ApiToken({ required this.name, required this.date, @@ -14,7 +17,4 @@ class ApiToken { final DateTime date; @JsonKey(name: 'is_caller') final bool isCaller; - - factory ApiToken.fromJson(Map json) => - _$ApiTokenFromJson(json); } diff --git a/lib/logic/models/json/auto_upgrade_settings.dart b/lib/logic/models/json/auto_upgrade_settings.dart index 77c8905d..848c6437 100644 --- a/lib/logic/models/json/auto_upgrade_settings.dart +++ b/lib/logic/models/json/auto_upgrade_settings.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:equatable/equatable.dart'; import 'package:json_annotation/json_annotation.dart'; @@ -5,18 +7,18 @@ part 'auto_upgrade_settings.g.dart'; @JsonSerializable(createToJson: true) class AutoUpgradeSettings extends Equatable { - final bool enable; - final bool allowReboot; + factory AutoUpgradeSettings.fromJson(final Map json) => + _$AutoUpgradeSettingsFromJson(json); const AutoUpgradeSettings({ required this.enable, required this.allowReboot, }); + final bool enable; + final bool allowReboot; @override List get props => [enable, allowReboot]; - factory AutoUpgradeSettings.fromJson(Map json) => - _$AutoUpgradeSettingsFromJson(json); Map toJson() => _$AutoUpgradeSettingsToJson(this); } diff --git a/lib/logic/models/json/backup.dart b/lib/logic/models/json/backup.dart index 95737897..7a5ad963 100644 --- a/lib/logic/models/json/backup.dart +++ b/lib/logic/models/json/backup.dart @@ -4,14 +4,14 @@ part 'backup.g.dart'; @JsonSerializable() class Backup { + + factory Backup.fromJson(final Map json) => _$BackupFromJson(json); Backup({required this.time, required this.id}); // Time of the backup final DateTime time; @JsonKey(name: 'short_id') final String id; - - factory Backup.fromJson(Map json) => _$BackupFromJson(json); } enum BackupStatusEnum { @@ -33,16 +33,16 @@ enum BackupStatusEnum { @JsonSerializable() class BackupStatus { + + factory BackupStatus.fromJson(final Map json) => + _$BackupStatusFromJson(json); BackupStatus( {required this.status, required this.progress, - required this.errorMessage}); + required this.errorMessage,}); final BackupStatusEnum status; final double progress; @JsonKey(name: 'error_message') final String? errorMessage; - - factory BackupStatus.fromJson(Map json) => - _$BackupStatusFromJson(json); } diff --git a/lib/logic/models/json/device_token.dart b/lib/logic/models/json/device_token.dart index d53299c5..53eac22f 100644 --- a/lib/logic/models/json/device_token.dart +++ b/lib/logic/models/json/device_token.dart @@ -4,6 +4,9 @@ part 'device_token.g.dart'; @JsonSerializable() class DeviceToken { + + factory DeviceToken.fromJson(final Map json) => + _$DeviceTokenFromJson(json); DeviceToken({ required this.device, required this.token, @@ -11,7 +14,4 @@ class DeviceToken { final String device; final String token; - - factory DeviceToken.fromJson(Map json) => - _$DeviceTokenFromJson(json); } diff --git a/lib/logic/models/json/dns_records.dart b/lib/logic/models/json/dns_records.dart index 25aad046..cd4867c3 100644 --- a/lib/logic/models/json/dns_records.dart +++ b/lib/logic/models/json/dns_records.dart @@ -20,5 +20,5 @@ class DnsRecord { final int priority; final bool proxied; - toJson() => _$DnsRecordToJson(this); + Map toJson() => _$DnsRecordToJson(this); } diff --git a/lib/logic/models/json/hetzner_server_info.dart b/lib/logic/models/json/hetzner_server_info.dart index 6e173181..b7e19346 100644 --- a/lib/logic/models/json/hetzner_server_info.dart +++ b/lib/logic/models/json/hetzner_server_info.dart @@ -1,9 +1,22 @@ +// ignore_for_file: always_specify_types + import 'package:json_annotation/json_annotation.dart'; part 'hetzner_server_info.g.dart'; @JsonSerializable() class HetznerServerInfo { + + HetznerServerInfo( + this.id, + this.name, + this.status, + this.created, + this.serverType, + this.location, + this.publicNet, + this.volumes, + ); final int id; final String name; final ServerStatus status; @@ -19,46 +32,35 @@ class HetznerServerInfo { @JsonKey(name: 'public_net') final HetznerPublicNetInfo publicNet; - static HetznerLocation locationFromJson(Map json) => + static HetznerLocation locationFromJson(final Map json) => HetznerLocation.fromJson(json['location']); - static HetznerServerInfo fromJson(Map json) => + static HetznerServerInfo fromJson(final Map json) => _$HetznerServerInfoFromJson(json); - - HetznerServerInfo( - this.id, - this.name, - this.status, - this.created, - this.serverType, - this.location, - this.publicNet, - this.volumes, - ); } @JsonSerializable() class HetznerPublicNetInfo { - final HetznerIp4 ipv4; - - static HetznerPublicNetInfo fromJson(Map json) => - _$HetznerPublicNetInfoFromJson(json); HetznerPublicNetInfo(this.ipv4); + final HetznerIp4 ipv4; + + static HetznerPublicNetInfo fromJson(final Map json) => + _$HetznerPublicNetInfoFromJson(json); } @JsonSerializable() class HetznerIp4 { + + HetznerIp4(this.id, this.ip, this.blocked, this.reverseDns); final bool blocked; @JsonKey(name: 'dns_ptr') final String reverseDns; final int id; final String ip; - static HetznerIp4 fromJson(Map json) => + static HetznerIp4 fromJson(final Map json) => _$HetznerIp4FromJson(json); - - HetznerIp4(this.id, this.ip, this.blocked, this.reverseDns); } enum ServerStatus { @@ -75,15 +77,15 @@ enum ServerStatus { @JsonSerializable() class HetznerServerTypeInfo { + + HetznerServerTypeInfo(this.cores, this.memory, this.disk, this.prices); final int cores; final num memory; final int disk; final List prices; - HetznerServerTypeInfo(this.cores, this.memory, this.disk, this.prices); - - static HetznerServerTypeInfo fromJson(Map json) => + static HetznerServerTypeInfo fromJson(final Map json) => _$HetznerServerTypeInfoFromJson(json); } @@ -97,14 +99,16 @@ class HetznerPriceInfo { @JsonKey(name: 'price_monthly', fromJson: HetznerPriceInfo.getPrice) final double monthly; - static HetznerPriceInfo fromJson(Map json) => + static HetznerPriceInfo fromJson(final Map json) => _$HetznerPriceInfoFromJson(json); - static double getPrice(Map json) => double.parse(json['gross'] as String); + static double getPrice(final Map json) => double.parse(json['gross'] as String); } @JsonSerializable() class HetznerLocation { + + HetznerLocation(this.country, this.city, this.description, this.zone); final String country; final String city; final String description; @@ -112,8 +116,6 @@ class HetznerLocation { @JsonKey(name: 'network_zone') final String zone; - HetznerLocation(this.country, this.city, this.description, this.zone); - - static HetznerLocation fromJson(Map json) => + static HetznerLocation fromJson(final Map json) => _$HetznerLocationFromJson(json); } diff --git a/lib/logic/models/json/recovery_token_status.dart b/lib/logic/models/json/recovery_token_status.dart index 6b27b028..2c455480 100644 --- a/lib/logic/models/json/recovery_token_status.dart +++ b/lib/logic/models/json/recovery_token_status.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:equatable/equatable.dart'; import 'package:json_annotation/json_annotation.dart'; @@ -5,6 +7,9 @@ part 'recovery_token_status.g.dart'; @JsonSerializable() class RecoveryKeyStatus extends Equatable { + + factory RecoveryKeyStatus.fromJson(final Map json) => + _$RecoveryKeyStatusFromJson(json); const RecoveryKeyStatus({ required this.exists, required this.valid, @@ -20,9 +25,6 @@ class RecoveryKeyStatus extends Equatable { final int? usesLeft; final bool valid; - factory RecoveryKeyStatus.fromJson(Map json) => - _$RecoveryKeyStatusFromJson(json); - @override List get props => [ exists, diff --git a/lib/logic/models/json/server_configurations.dart b/lib/logic/models/json/server_configurations.dart index 73915566..91f5f65d 100644 --- a/lib/logic/models/json/server_configurations.dart +++ b/lib/logic/models/json/server_configurations.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:equatable/equatable.dart'; import 'package:json_annotation/json_annotation.dart'; @@ -5,6 +7,9 @@ part 'server_configurations.g.dart'; @JsonSerializable(createToJson: true) class AutoUpgradeConfigurations extends Equatable { + + factory AutoUpgradeConfigurations.fromJson(final Map json) => + _$AutoUpgradeConfigurationsFromJson(json); const AutoUpgradeConfigurations({ required this.enable, required this.allowReboot, @@ -12,9 +17,6 @@ class AutoUpgradeConfigurations extends Equatable { final bool enable; final bool allowReboot; - - factory AutoUpgradeConfigurations.fromJson(Map json) => - _$AutoUpgradeConfigurationsFromJson(json); Map toJson() => _$AutoUpgradeConfigurationsToJson(this); @override diff --git a/lib/logic/models/message.dart b/lib/logic/models/message.dart index 176f2846..44f30b4d 100644 --- a/lib/logic/models/message.dart +++ b/lib/logic/models/message.dart @@ -1,6 +1,6 @@ import 'package:intl/intl.dart'; -final formatter = DateFormat('hh:mm'); +final DateFormat formatter = DateFormat('hh:mm'); class Message { Message({this.text, this.type = MessageType.normal}) : time = DateTime.now(); @@ -10,7 +10,7 @@ class Message { final MessageType type; String get timeString => formatter.format(time); - static Message warn({String? text}) => Message( + static Message warn({final String? text}) => Message( text: text, type: MessageType.warning, ); diff --git a/lib/logic/models/provider.dart b/lib/logic/models/provider.dart index 82af8656..4e3191eb 100644 --- a/lib/logic/models/provider.dart +++ b/lib/logic/models/provider.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:equatable/equatable.dart'; import 'package:flutter/widgets.dart'; import 'package:selfprivacy/logic/models/state_types.dart'; @@ -15,7 +17,7 @@ class ProviderModel extends Equatable { final StateType state; final ProviderType type; - ProviderModel updateState(StateType newState) => ProviderModel( + ProviderModel updateState(final StateType newState) => ProviderModel( state: newState, type: type, ); diff --git a/lib/logic/models/server_basic_info.dart b/lib/logic/models/server_basic_info.dart index fcd37ed4..7f0f2e1b 100644 --- a/lib/logic/models/server_basic_info.dart +++ b/lib/logic/models/server_basic_info.dart @@ -1,10 +1,6 @@ +// ignore_for_file: always_specify_types + class ServerBasicInfo { - final int id; - final String name; - final String reverseDns; - final String ip; - final DateTime created; - final int volumeId; ServerBasicInfo({ required this.id, @@ -14,34 +10,20 @@ class ServerBasicInfo { required this.created, required this.volumeId, }); + final int id; + final String name; + final String reverseDns; + final String ip; + final DateTime created; + final int volumeId; } class ServerBasicInfoWithValidators extends ServerBasicInfo { - final bool isIpValid; - final bool isReverseDnsValid; - - ServerBasicInfoWithValidators({ - required int id, - required String name, - required String reverseDns, - required String ip, - required DateTime created, - required int volumeId, - required this.isIpValid, - required this.isReverseDnsValid, - }) : super( - id: id, - name: name, - reverseDns: reverseDns, - ip: ip, - created: created, - volumeId: volumeId, - ); ServerBasicInfoWithValidators.fromServerBasicInfo({ - required ServerBasicInfo serverBasicInfo, - required isIpValid, - required isReverseDnsValid, + required final ServerBasicInfo serverBasicInfo, + required final isIpValid, + required final isReverseDnsValid, }) : this( id: serverBasicInfo.id, name: serverBasicInfo.name, @@ -52,4 +34,17 @@ class ServerBasicInfoWithValidators extends ServerBasicInfo { isIpValid: isIpValid, isReverseDnsValid: isReverseDnsValid, ); + + ServerBasicInfoWithValidators({ + required final super.id, + required final super.name, + required final super.reverseDns, + required final super.ip, + required final super.created, + required final super.volumeId, + required this.isIpValid, + required this.isReverseDnsValid, + }); + final bool isIpValid; + final bool isReverseDnsValid; } diff --git a/lib/logic/models/server_status.dart b/lib/logic/models/server_status.dart index 1405bde3..b191ee16 100644 --- a/lib/logic/models/server_status.dart +++ b/lib/logic/models/server_status.dart @@ -1,24 +1,22 @@ class ServerStatus { - final StatusTypes http; - final StatusTypes imap; - final StatusTypes smtp; ServerStatus({ required this.http, this.imap = StatusTypes.nodata, this.smtp = StatusTypes.nodata, }); + final StatusTypes http; + final StatusTypes imap; + final StatusTypes smtp; - ServerStatus fromJson(Map json) { - return ServerStatus( + ServerStatus fromJson(final Map json) => ServerStatus( http: statusTypeFromNumber(json['http']), imap: statusTypeFromNumber(json['imap']), smtp: statusTypeFromNumber(json['smtp']), ); - } } -StatusTypes statusTypeFromNumber(int? number) { +StatusTypes statusTypeFromNumber(final int? number) { if (number == 0) { return StatusTypes.ok; } else if (number == 1) { diff --git a/lib/logic/models/timezone_settings.dart b/lib/logic/models/timezone_settings.dart index 76d28aff..45348b64 100644 --- a/lib/logic/models/timezone_settings.dart +++ b/lib/logic/models/timezone_settings.dart @@ -1,18 +1,18 @@ +// ignore_for_file: always_specify_types + import 'package:timezone/timezone.dart'; class TimeZoneSettings { - final Location timezone; - TimeZoneSettings(this.timezone); - - Map toJson() { - return { - 'timezone': timezone.name, - }; - } - - factory TimeZoneSettings.fromString(String string) { - var location = timeZoneDatabase.locations[string]!; + factory TimeZoneSettings.fromString(final String string) { + final Location location = timeZoneDatabase.locations[string]!; return TimeZoneSettings(location); } + + TimeZoneSettings(this.timezone); + final Location timezone; + + Map toJson() => { + 'timezone': timezone.name, + }; } diff --git a/lib/main.dart b/lib/main.dart index 9593ee31..f7234d26 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -11,11 +13,11 @@ import 'package:selfprivacy/ui/pages/root_route.dart'; import 'package:wakelock/wakelock.dart'; import 'package:timezone/data/latest.dart' as tz; -import 'config/bloc_config.dart'; -import 'config/bloc_observer.dart'; -import 'config/get_it_config.dart'; -import 'config/localization.dart'; -import 'logic/cubit/app_settings/app_settings_cubit.dart'; +import 'package:selfprivacy/config/bloc_config.dart'; +import 'package:selfprivacy/config/bloc_observer.dart'; +import 'package:selfprivacy/config/get_it_config.dart'; +import 'package:selfprivacy/config/localization.dart'; +import 'package:selfprivacy/logic/cubit/app_settings/app_settings_cubit.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -34,11 +36,11 @@ void main() async { await EasyLocalization.ensureInitialized(); tz.initializeTimeZones(); - final lightThemeData = await AppThemeFactory.create( + final ThemeData lightThemeData = await AppThemeFactory.create( isDark: false, fallbackColor: BrandColors.primary, ); - final darkThemeData = await AppThemeFactory.create( + final ThemeData darkThemeData = await AppThemeFactory.create( isDark: true, fallbackColor: BrandColors.primary, ); @@ -48,30 +50,28 @@ void main() async { child: MyApp( lightThemeData: lightThemeData, darkThemeData: darkThemeData, - ))), + ),),), blocObserver: SimpleBlocObserver(), ); } class MyApp extends StatelessWidget { const MyApp({ - Key? key, required this.lightThemeData, required this.darkThemeData, - }) : super(key: key); + final super.key, + }); final ThemeData lightThemeData; final ThemeData darkThemeData; @override - Widget build(BuildContext context) { - return Localization( + Widget build(final BuildContext context) => Localization( child: AnnotatedRegion( value: SystemUiOverlayStyle.light, // Manually changing appbar color child: BlocAndProviderConfig( child: BlocBuilder( - builder: (context, appSettings) { - return MaterialApp( + builder: (final BuildContext context, final AppSettingsState appSettings) => MaterialApp( scaffoldMessengerKey: getIt.get().scaffoldMessengerKey, navigatorKey: getIt.get().navigatorKey, @@ -87,20 +87,18 @@ class MyApp extends StatelessWidget { home: appSettings.isOnboardingShowing ? const OnboardingPage(nextPage: InitializingPage()) : const RootPage(), - builder: (BuildContext context, Widget? widget) { + builder: (final BuildContext context, final Widget? widget) { Widget error = const Text('...rendering error...'); if (widget is Scaffold || widget is Navigator) { error = Scaffold(body: Center(child: error)); } ErrorWidget.builder = - (FlutterErrorDetails errorDetails) => error; + (final FlutterErrorDetails errorDetails) => error; return widget!; }, - ); - }, + ), ), ), ), ); - } } diff --git a/lib/theming/factory/app_theme_factory.dart b/lib/theming/factory/app_theme_factory.dart index 1d99c480..92979267 100644 --- a/lib/theming/factory/app_theme_factory.dart +++ b/lib/theming/factory/app_theme_factory.dart @@ -1,8 +1,11 @@ +// ignore_for_file: always_specify_types + import 'dart:io'; import 'package:dynamic_color/dynamic_color.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:material_color_utilities/palettes/core_palette.dart'; import 'package:system_theme/system_theme.dart'; import 'package:gtk_theme_fl/gtk_theme_fl.dart'; @@ -10,27 +13,25 @@ abstract class AppThemeFactory { AppThemeFactory._(); static Future create( - {required bool isDark, required Color fallbackColor}) { - return _createAppTheme( + {required final bool isDark, required final Color fallbackColor,}) => _createAppTheme( isDark: isDark, fallbackColor: fallbackColor, ); - } static Future _createAppTheme({ - bool isDark = false, - required Color fallbackColor, + required final Color fallbackColor, + final bool isDark = false, }) async { ColorScheme? gtkColorsScheme; - var brightness = isDark ? Brightness.dark : Brightness.light; + final Brightness brightness = isDark ? Brightness.dark : Brightness.light; - final dynamicColorsScheme = await _getDynamicColors(brightness); + final ColorScheme? dynamicColorsScheme = await _getDynamicColors(brightness); if (Platform.isLinux) { - GtkThemeData themeData = await GtkThemeData.initialize(); - final isGtkDark = + final GtkThemeData themeData = await GtkThemeData.initialize(); + final bool isGtkDark = Color(themeData.theme_bg_color).computeLuminance() < 0.5; - final isInverseNeeded = isGtkDark != isDark; + final bool isInverseNeeded = isGtkDark != isDark; gtkColorsScheme = ColorScheme.fromSeed( seedColor: Color(themeData.theme_selected_bg_color), brightness: brightness, @@ -39,7 +40,7 @@ abstract class AppThemeFactory { ); } - final accentColor = SystemAccentColor(fallbackColor); + final SystemAccentColor accentColor = SystemAccentColor(fallbackColor); try { await accentColor.load(); @@ -47,17 +48,17 @@ abstract class AppThemeFactory { print('_createAppTheme: ${e.message}'); } - final fallbackColorScheme = ColorScheme.fromSeed( + final ColorScheme fallbackColorScheme = ColorScheme.fromSeed( seedColor: accentColor.accent, brightness: brightness, ); - final colorScheme = + final ColorScheme colorScheme = dynamicColorsScheme ?? gtkColorsScheme ?? fallbackColorScheme; - final appTypography = Typography.material2021(); + final Typography appTypography = Typography.material2021(); - final materialThemeData = ThemeData( + final ThemeData materialThemeData = ThemeData( colorScheme: colorScheme, brightness: colorScheme.brightness, typography: appTypography, @@ -73,10 +74,10 @@ abstract class AppThemeFactory { return materialThemeData; } - static Future _getDynamicColors(Brightness brightness) { + static Future _getDynamicColors(final Brightness brightness) { try { return DynamicColorPlugin.getCorePalette().then( - (corePallet) => corePallet?.toColorScheme(brightness: brightness)); + (final CorePalette? corePallet) => corePallet?.toColorScheme(brightness: brightness),); } on PlatformException { return Future.value(null); } diff --git a/lib/ui/components/action_button/action_button.dart b/lib/ui/components/action_button/action_button.dart index e507fa0c..580a69fb 100644 --- a/lib/ui/components/action_button/action_button.dart +++ b/lib/ui/components/action_button/action_button.dart @@ -3,19 +3,19 @@ import 'package:selfprivacy/config/brand_colors.dart'; class ActionButton extends StatelessWidget { const ActionButton({ - Key? key, + final super.key, this.text, this.onPressed, this.isRed = false, - }) : super(key: key); + }); final VoidCallback? onPressed; final String? text; final bool isRed; @override - Widget build(BuildContext context) { - var navigator = Navigator.of(context); + Widget build(final BuildContext context) { + final NavigatorState navigator = Navigator.of(context); return TextButton( child: Text( diff --git a/lib/ui/components/brand_alert/brand_alert.dart b/lib/ui/components/brand_alert/brand_alert.dart index e4a8f04c..0d673ded 100644 --- a/lib/ui/components/brand_alert/brand_alert.dart +++ b/lib/ui/components/brand_alert/brand_alert.dart @@ -2,14 +2,12 @@ import 'package:flutter/material.dart'; class BrandAlert extends AlertDialog { BrandAlert({ - Key? key, - String? title, - String? contentText, - List? actions, + final super.key, + final String? title, + final String? contentText, + final super.actions, }) : super( - key: key, title: title != null ? Text(title) : null, content: title != null ? Text(contentText!) : null, - actions: actions, ); } diff --git a/lib/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart b/lib/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart index 22430d06..d5c6afbe 100644 --- a/lib/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart +++ b/lib/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart @@ -1,19 +1,21 @@ +// ignore_for_file: always_specify_types + import 'package:flutter/material.dart'; import 'package:selfprivacy/config/brand_colors.dart'; class BrandBottomSheet extends StatelessWidget { const BrandBottomSheet({ - Key? key, required this.child, + final super.key, this.isExpended = false, - }) : super(key: key); + }); final Widget child; final bool isExpended; @override - Widget build(BuildContext context) { - var mainHeight = MediaQuery.of(context).size.height - + Widget build(final BuildContext context) { + final double mainHeight = MediaQuery.of(context).size.height - MediaQuery.of(context).padding.top - 100; late Widget innerWidget; diff --git a/lib/ui/components/brand_button/brand_button.dart b/lib/ui/components/brand_button/brand_button.dart index 0b5b9c49..55d7fddc 100644 --- a/lib/ui/components/brand_button/brand_button.dart +++ b/lib/ui/components/brand_button/brand_button.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:flutter/material.dart'; import 'package:selfprivacy/ui/components/brand_button/filled_button.dart'; import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; @@ -5,11 +7,11 @@ import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; enum BrandButtonTypes { rised, text, iconText } class BrandButton { - static rised({ - Key? key, - required VoidCallback? onPressed, - String? text, - Widget? child, + static ConstrainedBox rised({ + required final VoidCallback? onPressed, + final Key? key, + final String? text, + final Widget? child, }) { assert(text == null || child == null, 'required title or child'); assert(text != null || child != null, 'required title or child'); @@ -27,10 +29,10 @@ class BrandButton { ); } - static text({ - Key? key, - required VoidCallback onPressed, - required String title, + static ConstrainedBox text({ + required final VoidCallback onPressed, + required final String title, + final Key? key, }) => ConstrainedBox( constraints: const BoxConstraints( @@ -40,11 +42,11 @@ class BrandButton { child: TextButton(onPressed: onPressed, child: Text(title)), ); - static emptyWithIconText({ - Key? key, - required VoidCallback onPressed, - required String title, - required Icon icon, + static _IconTextButton emptyWithIconText({ + required final VoidCallback onPressed, + required final String title, + required final Icon icon, + final Key? key, }) => _IconTextButton( key: key, @@ -55,16 +57,14 @@ class BrandButton { } class _IconTextButton extends StatelessWidget { - const _IconTextButton({Key? key, this.onPressed, this.title, this.icon}) - : super(key: key); + const _IconTextButton({final super.key, this.onPressed, this.title, this.icon}); final VoidCallback? onPressed; final String? title; final Icon? icon; @override - Widget build(BuildContext context) { - return Material( + Widget build(final BuildContext context) => Material( color: Colors.transparent, child: InkWell( onTap: onPressed, @@ -85,5 +85,4 @@ class _IconTextButton extends StatelessWidget { ), ), ); - } } diff --git a/lib/ui/components/brand_button/filled_button.dart b/lib/ui/components/brand_button/filled_button.dart index cc6aeb26..b3888f3c 100644 --- a/lib/ui/components/brand_button/filled_button.dart +++ b/lib/ui/components/brand_button/filled_button.dart @@ -2,12 +2,12 @@ import 'package:flutter/material.dart'; class FilledButton extends StatelessWidget { const FilledButton({ - Key? key, + final super.key, this.onPressed, this.title, this.child, this.disabled = false, - }) : super(key: key); + }); final VoidCallback? onPressed; final String? title; @@ -15,7 +15,7 @@ class FilledButton extends StatelessWidget { final bool disabled; @override - Widget build(BuildContext context) { + Widget build(final BuildContext context) { final ButtonStyle enabledStyle = ElevatedButton.styleFrom( onPrimary: Theme.of(context).colorScheme.onPrimary, primary: Theme.of(context).colorScheme.primary, diff --git a/lib/ui/components/brand_cards/brand_cards.dart b/lib/ui/components/brand_cards/brand_cards.dart index 7f19e47d..138a674a 100644 --- a/lib/ui/components/brand_cards/brand_cards.dart +++ b/lib/ui/components/brand_cards/brand_cards.dart @@ -1,7 +1,9 @@ +// ignore_for_file: always_specify_types + import 'package:flutter/material.dart'; class BrandCards { - static Widget big({required Widget child}) => _BrandCard( + static Widget big({required final Widget child}) => _BrandCard( padding: const EdgeInsets.symmetric( horizontal: 20, vertical: 15, @@ -10,7 +12,7 @@ class BrandCards { borderRadius: BorderRadius.circular(20), child: child, ); - static Widget small({required Widget child}) => _BrandCard( + static Widget small({required final Widget child}) => _BrandCard( padding: const EdgeInsets.symmetric( horizontal: 15, vertical: 10, @@ -19,10 +21,11 @@ class BrandCards { borderRadius: BorderRadius.circular(10), child: child, ); - static Widget outlined({required Widget child}) => _OutlinedCard( + static Widget outlined({required final Widget child}) => _OutlinedCard( child: child, ); - static Widget filled({required Widget child, bool tertiary = false}) => + static Widget filled( + {required final Widget child, final bool tertiary = false,}) => _FilledCard( tertiary: tertiary, child: child, @@ -31,12 +34,12 @@ class BrandCards { class _BrandCard extends StatelessWidget { const _BrandCard({ - Key? key, required this.child, required this.padding, required this.shadow, required this.borderRadius, - }) : super(key: key); + final super.key, + }); final Widget child; final EdgeInsets padding; @@ -44,65 +47,62 @@ class _BrandCard extends StatelessWidget { final BorderRadius borderRadius; @override - Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.surface, - borderRadius: borderRadius, - boxShadow: shadow, - ), - padding: padding, - child: child, - ); - } + Widget build(final BuildContext context) => Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surface, + borderRadius: borderRadius, + boxShadow: shadow, + ), + padding: padding, + child: child, + ); } class _OutlinedCard extends StatelessWidget { const _OutlinedCard({ - Key? key, + final super.key, required this.child, - }) : super(key: key); + }); final Widget child; @override - Widget build(BuildContext context) { - return Card( - elevation: 0.0, - shape: RoundedRectangleBorder( - borderRadius: const BorderRadius.all(Radius.circular(12)), - side: BorderSide( - color: Theme.of(context).colorScheme.outline, + Widget build(final BuildContext context) => Card( + elevation: 0.0, + shape: RoundedRectangleBorder( + borderRadius: const BorderRadius.all(Radius.circular(12)), + side: BorderSide( + color: Theme.of(context).colorScheme.outline, + ), ), - ), - clipBehavior: Clip.antiAlias, - child: child, - ); - } + clipBehavior: Clip.antiAlias, + child: child, + ); } class _FilledCard extends StatelessWidget { - const _FilledCard({Key? key, required this.child, required this.tertiary}) - : super(key: key); + const _FilledCard({ + required this.child, + required this.tertiary, + final super.key, + }); final Widget child; final bool tertiary; @override - Widget build(BuildContext context) { - return Card( - elevation: 0.0, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(12)), - ), - clipBehavior: Clip.antiAlias, - color: tertiary - ? Theme.of(context).colorScheme.tertiaryContainer - : Theme.of(context).colorScheme.surfaceVariant, - child: child, - ); - } + Widget build(final BuildContext context) => Card( + elevation: 0.0, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(12)), + ), + clipBehavior: Clip.antiAlias, + color: tertiary + ? Theme.of(context).colorScheme.tertiaryContainer + : Theme.of(context).colorScheme.surfaceVariant, + child: child, + ); } -final bigShadow = [ +final List bigShadow = [ BoxShadow( offset: const Offset(0, 4), blurRadius: 8, diff --git a/lib/ui/components/brand_divider/brand_divider.dart b/lib/ui/components/brand_divider/brand_divider.dart index bd3d9c92..c3a3b5a3 100644 --- a/lib/ui/components/brand_divider/brand_divider.dart +++ b/lib/ui/components/brand_divider/brand_divider.dart @@ -2,14 +2,12 @@ import 'package:flutter/material.dart'; import 'package:selfprivacy/config/brand_colors.dart'; class BrandDivider extends StatelessWidget { - const BrandDivider({Key? key}) : super(key: key); + const BrandDivider({super.key}); @override - Widget build(BuildContext context) { - return Container( + Widget build(final BuildContext context) => Container( width: double.infinity, height: 1, color: BrandColors.dividerColor, ); - } } diff --git a/lib/ui/components/brand_header/brand_header.dart b/lib/ui/components/brand_header/brand_header.dart index 82e73e47..7e0bd3e8 100644 --- a/lib/ui/components/brand_header/brand_header.dart +++ b/lib/ui/components/brand_header/brand_header.dart @@ -1,22 +1,23 @@ +// ignore_for_file: always_specify_types + import 'package:flutter/material.dart'; import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart'; import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; class BrandHeader extends StatelessWidget { const BrandHeader({ - Key? key, + final super.key, this.title = '', this.hasBackButton = false, this.onBackButtonPressed, - }) : super(key: key); + }); final String title; final bool hasBackButton; final VoidCallback? onBackButtonPressed; @override - Widget build(BuildContext context) { - return Container( + Widget build(final BuildContext context) => Container( height: 52, alignment: Alignment.centerLeft, padding: EdgeInsets.only( @@ -37,5 +38,4 @@ class BrandHeader extends StatelessWidget { ], ), ); - } } diff --git a/lib/ui/components/brand_hero_screen/brand_hero_screen.dart b/lib/ui/components/brand_hero_screen/brand_hero_screen.dart index 6d00963c..5061ec63 100644 --- a/lib/ui/components/brand_hero_screen/brand_hero_screen.dart +++ b/lib/ui/components/brand_hero_screen/brand_hero_screen.dart @@ -4,16 +4,16 @@ import 'package:selfprivacy/ui/components/pre_styled_buttons/flash_fab.dart'; class BrandHeroScreen extends StatelessWidget { const BrandHeroScreen({ - Key? key, + required this.children, + final super.key, this.headerTitle = '', this.hasBackButton = true, this.hasFlashButton = true, - required this.children, this.heroIcon, this.heroTitle, this.heroSubtitle, this.onBackButtonPressed, - }) : super(key: key); + }); final List children; final String headerTitle; @@ -25,8 +25,7 @@ class BrandHeroScreen extends StatelessWidget { final VoidCallback? onBackButtonPressed; @override - Widget build(BuildContext context) { - return SafeArea( + Widget build(BuildContext context) => SafeArea( child: Scaffold( appBar: PreferredSize( preferredSize: const Size.fromHeight(52.0), @@ -63,12 +62,11 @@ class BrandHeroScreen extends StatelessWidget { style: Theme.of(context).textTheme.bodyMedium!.copyWith( color: Theme.of(context).colorScheme.onBackground, ), - textAlign: TextAlign.start), + textAlign: TextAlign.start,), const SizedBox(height: 16.0), ...children, ], ), ), ); - } } diff --git a/lib/ui/components/brand_icons/brand_icons.dart b/lib/ui/components/brand_icons/brand_icons.dart index ea8e51a0..f66ed8ec 100644 --- a/lib/ui/components/brand_icons/brand_icons.dart +++ b/lib/ui/components/brand_icons/brand_icons.dart @@ -18,7 +18,7 @@ import 'package:flutter/widgets.dart'; class BrandIcons { BrandIcons._(); - static const _kFontFam = 'BrandIcons'; + static const String _kFontFam = 'BrandIcons'; static const String? _kFontPkg = null; static const IconData connection = diff --git a/lib/ui/components/brand_loader/brand_loader.dart b/lib/ui/components/brand_loader/brand_loader.dart index ea9f754b..5dc6a6ea 100644 --- a/lib/ui/components/brand_loader/brand_loader.dart +++ b/lib/ui/components/brand_loader/brand_loader.dart @@ -2,13 +2,12 @@ import 'package:flutter/material.dart'; import 'package:easy_localization/easy_localization.dart'; class BrandLoader { - static horizontal() => _HorizontalLoader(); + static _HorizontalLoader horizontal() => _HorizontalLoader(); } class _HorizontalLoader extends StatelessWidget { @override - Widget build(BuildContext context) { - return Column( + Widget build(final BuildContext context) => Column( mainAxisSize: MainAxisSize.min, children: [ Text('basis.wait'.tr()), @@ -16,5 +15,4 @@ class _HorizontalLoader extends StatelessWidget { const LinearProgressIndicator(minHeight: 3), ], ); - } } diff --git a/lib/ui/components/brand_md/brand_md.dart b/lib/ui/components/brand_md/brand_md.dart index 24c7c860..3de9f86a 100644 --- a/lib/ui/components/brand_md/brand_md.dart +++ b/lib/ui/components/brand_md/brand_md.dart @@ -8,9 +8,9 @@ import 'package:url_launcher/url_launcher_string.dart'; class BrandMarkdown extends StatefulWidget { const BrandMarkdown({ - Key? key, required this.fileName, - }) : super(key: key); + final super.key, + }); final String fileName; @@ -28,7 +28,7 @@ class _BrandMarkdownState extends State { } void _loadMdFile() async { - String mdFromFile = await rootBundle + final String mdFromFile = await rootBundle .loadString('assets/markdown/${widget.fileName}-${'locale'.tr()}.md'); setState(() { _mdContent = mdFromFile; @@ -36,9 +36,9 @@ class _BrandMarkdownState extends State { } @override - Widget build(BuildContext context) { - var isDark = Theme.of(context).brightness == Brightness.dark; - var markdown = MarkdownStyleSheet( + Widget build(final BuildContext context) { + final bool isDark = Theme.of(context).brightness == Brightness.dark; + final MarkdownStyleSheet markdown = MarkdownStyleSheet( p: defaultTextStyle.copyWith( color: isDark ? BrandColors.white : null, ), @@ -58,9 +58,9 @@ class _BrandMarkdownState extends State { return Markdown( shrinkWrap: true, styleSheet: markdown, - onTapLink: (String text, String? href, String title) { + onTapLink: (final String text, final String? href, final String title) { if (href != null) { - canLaunchUrlString(href).then((canLaunchURL) { + canLaunchUrlString(href).then((final bool canLaunchURL) { if (canLaunchURL) { launchUrlString(href); } diff --git a/lib/ui/components/brand_radio/brand_radio.dart b/lib/ui/components/brand_radio/brand_radio.dart index 21cc2779..aca55505 100644 --- a/lib/ui/components/brand_radio/brand_radio.dart +++ b/lib/ui/components/brand_radio/brand_radio.dart @@ -3,15 +3,14 @@ import 'package:selfprivacy/config/brand_colors.dart'; class BrandRadio extends StatelessWidget { const BrandRadio({ - Key? key, + super.key, required this.isChecked, - }) : super(key: key); + }); final bool isChecked; @override - Widget build(BuildContext context) { - return Container( + Widget build(final BuildContext context) => Container( height: 20, width: 20, alignment: Alignment.center, @@ -31,12 +30,9 @@ class BrandRadio extends StatelessWidget { ) : null, ); - } - BoxBorder? _getBorder() { - return Border.all( + BoxBorder? _getBorder() => Border.all( color: isChecked ? BrandColors.primary : BrandColors.gray1, width: 2, ); - } } diff --git a/lib/ui/components/brand_radio_tile/brand_radio_tile.dart b/lib/ui/components/brand_radio_tile/brand_radio_tile.dart index b2784799..17b3ccff 100644 --- a/lib/ui/components/brand_radio_tile/brand_radio_tile.dart +++ b/lib/ui/components/brand_radio_tile/brand_radio_tile.dart @@ -4,11 +4,11 @@ import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; class BrandRadioTile extends StatelessWidget { const BrandRadioTile({ - Key? key, + super.key, required this.isChecked, required this.text, required this.onPress, - }) : super(key: key); + }); final bool isChecked; @@ -16,8 +16,7 @@ class BrandRadioTile extends StatelessWidget { final VoidCallback onPress; @override - Widget build(BuildContext context) { - return GestureDetector( + Widget build(BuildContext context) => GestureDetector( onTap: onPress, behavior: HitTestBehavior.translucent, child: Padding( @@ -33,5 +32,4 @@ class BrandRadioTile extends StatelessWidget { ), ), ); - } } diff --git a/lib/ui/components/brand_span_button/brand_span_button.dart b/lib/ui/components/brand_span_button/brand_span_button.dart index 6fdef622..da36ee02 100644 --- a/lib/ui/components/brand_span_button/brand_span_button.dart +++ b/lib/ui/components/brand_span_button/brand_span_button.dart @@ -5,19 +5,19 @@ import 'package:url_launcher/url_launcher.dart'; class BrandSpanButton extends TextSpan { BrandSpanButton({ - required String text, - required VoidCallback onTap, - TextStyle? style, + required final String text, + required final VoidCallback onTap, + final TextStyle? style, }) : super( recognizer: TapGestureRecognizer()..onTap = onTap, text: text, style: (style ?? const TextStyle()).copyWith(color: BrandColors.blue), ); - static link({ - required String text, - String? urlString, - TextStyle? style, + static BrandSpanButton link({ + required final String text, + final String? urlString, + final TextStyle? style, }) => BrandSpanButton( text: text, @@ -25,7 +25,7 @@ class BrandSpanButton extends TextSpan { onTap: () => _launchURL(urlString ?? text), ); - static _launchURL(String link) async { + static _launchURL(final String link) async { if (await canLaunchUrl(Uri.parse(link))) { await launchUrl(Uri.parse(link)); } else { diff --git a/lib/ui/components/brand_switch/brand_switch.dart b/lib/ui/components/brand_switch/brand_switch.dart index adf7e4e5..deb595a4 100644 --- a/lib/ui/components/brand_switch/brand_switch.dart +++ b/lib/ui/components/brand_switch/brand_switch.dart @@ -2,20 +2,18 @@ import 'package:flutter/material.dart'; class BrandSwitch extends StatelessWidget { const BrandSwitch({ - Key? key, required this.onChanged, required this.value, - }) : super(key: key); + final super.key, + }); final ValueChanged onChanged; final bool value; @override - Widget build(BuildContext context) { - return Switch( + Widget build(BuildContext context) => Switch( activeColor: Theme.of(context).colorScheme.primary, value: value, onChanged: onChanged, ); - } } diff --git a/lib/ui/components/brand_tab_bar/brand_tab_bar.dart b/lib/ui/components/brand_tab_bar/brand_tab_bar.dart index 0c32fd5f..e1a03062 100644 --- a/lib/ui/components/brand_tab_bar/brand_tab_bar.dart +++ b/lib/ui/components/brand_tab_bar/brand_tab_bar.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart'; class BrandTabBar extends StatefulWidget { - const BrandTabBar({Key? key, this.controller}) : super(key: key); + const BrandTabBar({final super.key, this.controller}); final TabController? controller; @override @@ -34,26 +34,22 @@ class _BrandTabBarState extends State { } @override - Widget build(BuildContext context) { - return NavigationBar( + Widget build(final BuildContext context) => NavigationBar( destinations: [ _getIconButton('basis.providers'.tr(), BrandIcons.server, 0), _getIconButton('basis.services'.tr(), BrandIcons.box, 1), _getIconButton('basis.users'.tr(), BrandIcons.users, 2), _getIconButton('basis.more'.tr(), Icons.menu_rounded, 3), ], - onDestinationSelected: (index) { + onDestinationSelected: (final index) { widget.controller!.animateTo(index); }, selectedIndex: currentIndex ?? 0, labelBehavior: NavigationDestinationLabelBehavior.onlyShowSelected, ); - } - _getIconButton(String label, IconData iconData, int index) { - return NavigationDestination( + NavigationDestination _getIconButton(final String label, final IconData iconData, final int index) => NavigationDestination( icon: Icon(iconData), label: label, ); - } } diff --git a/lib/ui/components/brand_text/brand_text.dart b/lib/ui/components/brand_text/brand_text.dart index 41436cc1..b64ed1c4 100644 --- a/lib/ui/components/brand_text/brand_text.dart +++ b/lib/ui/components/brand_text/brand_text.dart @@ -18,66 +18,10 @@ enum TextType { } class BrandText extends StatelessWidget { - const BrandText( - this.text, { - Key? key, - this.style, - required this.type, - this.overflow, - this.softWrap, - this.textAlign, - this.maxLines, - }) : super(key: key); - - final String? text; - final TextStyle? style; - final TextType type; - final TextOverflow? overflow; - final bool? softWrap; - final TextAlign? textAlign; - final int? maxLines; - - factory BrandText.h1( - String? text, { - TextStyle? style, - TextOverflow? overflow, - bool? softWrap, - }) => - BrandText( - text, - type: TextType.h1, - style: style, - ); - - factory BrandText.onboardingTitle(String text, {TextStyle? style}) => - BrandText( - text, - type: TextType.onboardingTitle, - style: style, - ); - factory BrandText.h2( - String? text, { - TextStyle? style, - TextAlign? textAlign, - }) => - BrandText( - text, - type: TextType.h2, - style: style, - textAlign: textAlign, - ); - factory BrandText.h3(String text, {TextStyle? style, TextAlign? textAlign}) => - BrandText( - text, - type: TextType.h3, - style: style, - textAlign: textAlign, - overflow: TextOverflow.ellipsis, - ); factory BrandText.h4( - String? text, { - TextStyle? style, - TextAlign? textAlign, + final String? text, { + final TextStyle? style, + final TextAlign? textAlign, }) => BrandText( text, @@ -89,10 +33,25 @@ class BrandText extends StatelessWidget { textAlign: textAlign, ); + factory BrandText.onboardingTitle(final String text, {final TextStyle? style}) => + BrandText( + text, + type: TextType.onboardingTitle, + style: style, + ); + factory BrandText.h3(final String text, {final TextStyle? style, final TextAlign? textAlign}) => + BrandText( + text, + type: TextType.h3, + style: style, + textAlign: textAlign, + overflow: TextOverflow.ellipsis, + ); + factory BrandText.h4Underlined( - String? text, { - TextStyle? style, - TextAlign? textAlign, + final String? text, { + final TextStyle? style, + final TextAlign? textAlign, }) => BrandText( text, @@ -104,10 +63,54 @@ class BrandText extends StatelessWidget { textAlign: textAlign, ); + factory BrandText.h1( + final String? text, { + final TextStyle? style, + final TextOverflow? overflow, + final bool? softWrap, + }) => + BrandText( + text, + type: TextType.h1, + style: style, + ); + factory BrandText.h2( + final String? text, { + final TextStyle? style, + final TextAlign? textAlign, + }) => + BrandText( + text, + type: TextType.h2, + style: style, + textAlign: textAlign, + ); + factory BrandText.body1(final String? text, {final TextStyle? style}) => BrandText( + text, + type: TextType.body1, + style: style, + ); + factory BrandText.small(final String text, {final TextStyle? style}) => BrandText( + text, + type: TextType.small, + style: style, + ); + factory BrandText.body2(final String? text, {final TextStyle? style}) => BrandText( + text, + type: TextType.body2, + style: style, + ); + factory BrandText.buttonTitleText(final String? text, {final TextStyle? style}) => + BrandText( + text, + type: TextType.buttonTitleText, + style: style, + ); + factory BrandText.h5( - String? text, { - TextStyle? style, - TextAlign? textAlign, + final String? text, { + final TextStyle? style, + final TextAlign? textAlign, }) => BrandText( text, @@ -115,39 +118,36 @@ class BrandText extends StatelessWidget { style: style, textAlign: textAlign, ); - factory BrandText.body1(String? text, {TextStyle? style}) => BrandText( - text, - type: TextType.body1, - style: style, - ); - factory BrandText.body2(String? text, {TextStyle? style}) => BrandText( - text, - type: TextType.body2, - style: style, - ); - factory BrandText.medium(String? text, - {TextStyle? style, TextAlign? textAlign}) => + factory BrandText.medium(final String? text, + {final TextStyle? style, final TextAlign? textAlign}) => BrandText( text, type: TextType.medium, style: style, textAlign: textAlign, ); - factory BrandText.small(String text, {TextStyle? style}) => BrandText( - text, - type: TextType.small, - style: style, - ); - factory BrandText.buttonTitleText(String? text, {TextStyle? style}) => - BrandText( - text, - type: TextType.buttonTitleText, - style: style, - ); + const BrandText( + this.text, { + super.key, + this.style, + required this.type, + this.overflow, + this.softWrap, + this.textAlign, + this.maxLines, + }); + + final String? text; + final TextStyle? style; + final TextType type; + final TextOverflow? overflow; + final bool? softWrap; + final TextAlign? textAlign; + final int? maxLines; @override - Text build(BuildContext context) { + Text build(final BuildContext context) { TextStyle style; - var isDark = Theme.of(context).brightness == Brightness.dark; + final bool isDark = Theme.of(context).brightness == Brightness.dark; switch (type) { case TextType.h1: style = isDark diff --git a/lib/ui/components/brand_timer/brand_timer.dart b/lib/ui/components/brand_timer/brand_timer.dart index 2aa75bce..b2ed1406 100644 --- a/lib/ui/components/brand_timer/brand_timer.dart +++ b/lib/ui/components/brand_timer/brand_timer.dart @@ -7,10 +7,10 @@ import 'package:selfprivacy/utils/named_font_weight.dart'; class BrandTimer extends StatefulWidget { const BrandTimer({ - Key? key, + super.key, required this.startDateTime, required this.duration, - }) : super(key: key); + }); final DateTime startDateTime; final Duration duration; @@ -31,8 +31,8 @@ class _BrandTimerState extends State { _timerStart() { _timeString = differenceFromStart; - timer = Timer.periodic(const Duration(seconds: 1), (Timer t) { - var timePassed = DateTime.now().difference(widget.startDateTime); + timer = Timer.periodic(const Duration(seconds: 1), (final Timer t) { + final Duration timePassed = DateTime.now().difference(widget.startDateTime); if (timePassed > widget.duration) { t.cancel(); } else { @@ -42,7 +42,7 @@ class _BrandTimerState extends State { } @override - void didUpdateWidget(BrandTimer oldWidget) { + void didUpdateWidget(final BrandTimer oldWidget) { if (timer.isActive) { timer.cancel(); } @@ -51,14 +51,12 @@ class _BrandTimerState extends State { } @override - Widget build(BuildContext context) { - return BrandText.medium( + Widget build(final BuildContext context) => BrandText.medium( _timeString, style: const TextStyle( fontWeight: NamedFontWeight.demiBold, ), ); - } void _getTime() { setState(() { @@ -69,10 +67,10 @@ class _BrandTimerState extends State { String get differenceFromStart => _durationToString(DateTime.now().difference(widget.startDateTime)); - String _durationToString(Duration duration) { - var timeLeft = widget.duration - duration; - String twoDigits(int n) => n.toString().padLeft(2, '0'); - String twoDigitSeconds = twoDigits(timeLeft.inSeconds); + String _durationToString(final Duration duration) { + final Duration timeLeft = widget.duration - duration; + String twoDigits(final int n) => n.toString().padLeft(2, '0'); + final String twoDigitSeconds = twoDigits(timeLeft.inSeconds); return 'timer.sec'.tr(args: [twoDigitSeconds]); } diff --git a/lib/ui/components/dots_indicator/dots_indicator.dart b/lib/ui/components/dots_indicator/dots_indicator.dart index e5c48bb4..fff647b7 100644 --- a/lib/ui/components/dots_indicator/dots_indicator.dart +++ b/lib/ui/components/dots_indicator/dots_indicator.dart @@ -3,19 +3,19 @@ import 'package:selfprivacy/config/brand_colors.dart'; class DotsIndicator extends StatelessWidget { const DotsIndicator({ - Key? key, required this.activeIndex, required this.count, - }) : super(key: key); + final super.key, + }); final int activeIndex; final int count; @override - Widget build(BuildContext context) { - var dots = List.generate( + Widget build(final BuildContext context) { + final List dots = List.generate( count, - (index) => Container( + (final index) => Container( margin: const EdgeInsets.symmetric(horizontal: 5, vertical: 10), height: 10, width: 10, diff --git a/lib/ui/components/error/error.dart b/lib/ui/components/error/error.dart index 64479cf7..9fe651cc 100644 --- a/lib/ui/components/error/error.dart +++ b/lib/ui/components/error/error.dart @@ -1,14 +1,13 @@ import 'package:flutter/material.dart'; class BrandError extends StatelessWidget { - const BrandError({Key? key, this.error, this.stackTrace}) : super(key: key); + const BrandError({final super.key, this.error, this.stackTrace}); final Object? error; final StackTrace? stackTrace; @override - Widget build(BuildContext context) { - return SafeArea( + Widget build(final BuildContext context) => SafeArea( child: Scaffold( body: Center( child: SingleChildScrollView( @@ -24,5 +23,4 @@ class BrandError extends StatelessWidget { ), ), ); - } } diff --git a/lib/ui/components/icon_status_mask/icon_status_mask.dart b/lib/ui/components/icon_status_mask/icon_status_mask.dart index 64f50668..b781c3d1 100644 --- a/lib/ui/components/icon_status_mask/icon_status_mask.dart +++ b/lib/ui/components/icon_status_mask/icon_status_mask.dart @@ -4,16 +4,16 @@ import 'package:selfprivacy/logic/models/state_types.dart'; class IconStatusMask extends StatelessWidget { const IconStatusMask({ - Key? key, + super.key, required this.child, required this.status, - }) : super(key: key); + }); final Icon child; final StateType status; @override - Widget build(BuildContext context) { + Widget build(final BuildContext context) { late List colors; switch (status) { case StateType.uninitialized: @@ -30,7 +30,7 @@ class IconStatusMask extends StatelessWidget { break; } return ShaderMask( - shaderCallback: (bounds) => LinearGradient( + shaderCallback: (final bounds) => LinearGradient( begin: const Alignment(-1, -0.8), end: const Alignment(0.9, 0.9), colors: colors, diff --git a/lib/ui/components/jobs_content/jobs_content.dart b/lib/ui/components/jobs_content/jobs_content.dart index cad2d7c4..e15fad3a 100644 --- a/lib/ui/components/jobs_content/jobs_content.dart +++ b/lib/ui/components/jobs_content/jobs_content.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:selfprivacy/config/brand_colors.dart'; import 'package:selfprivacy/config/brand_theme.dart'; import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart'; @@ -14,14 +13,13 @@ import 'package:selfprivacy/ui/components/brand_loader/brand_loader.dart'; import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; class JobsContent extends StatelessWidget { - const JobsContent({Key? key}) : super(key: key); + const JobsContent({super.key}); @override - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { + Widget build(final BuildContext context) => BlocBuilder( + builder: (final context, final state) { late List widgets; - var installationState = context.read().state; + final ServerInstallationState installationState = context.read().state; if (state is JobsStateEmpty) { widgets = [ const SizedBox(height: 80), @@ -39,7 +37,7 @@ class JobsContent extends StatelessWidget { const SizedBox(height: 10), BrandButton.text( onPressed: () { - var nav = getIt(); + final NavigationService nav = getIt(); nav.showPopUpDialog(BrandAlert( title: 'jobs.rebootServer'.tr(), contentText: 'modals.3'.tr(), @@ -53,7 +51,7 @@ class JobsContent extends StatelessWidget { text: 'modals.9'.tr(), ) ], - )); + ),); }, title: 'jobs.rebootServer'.tr(), ), @@ -68,7 +66,7 @@ class JobsContent extends StatelessWidget { widgets = [ ...state.jobList .map( - (j) => Row( + (final j) => Row( children: [ Expanded( child: BrandCards.small( @@ -78,14 +76,18 @@ class JobsContent extends StatelessWidget { const SizedBox(width: 10), ElevatedButton( style: ElevatedButton.styleFrom( - primary: BrandColors.red1, + primary: Theme.of(context).colorScheme.errorContainer, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), onPressed: () => context.read().removeJob(j.id), - child: Text('basis.remove'.tr()), + child: Text('basis.remove'.tr(), + style: TextStyle( + color: Theme.of(context) + .colorScheme + .onErrorContainer,),), ), ], ), @@ -113,5 +115,4 @@ class JobsContent extends StatelessWidget { ); }, ); - } } diff --git a/lib/ui/components/not_ready_card/not_ready_card.dart b/lib/ui/components/not_ready_card/not_ready_card.dart index 8fad8dd6..dd91f4ab 100644 --- a/lib/ui/components/not_ready_card/not_ready_card.dart +++ b/lib/ui/components/not_ready_card/not_ready_card.dart @@ -6,14 +6,13 @@ import 'package:selfprivacy/utils/route_transitions/basic.dart'; import 'package:easy_localization/easy_localization.dart'; class NotReadyCard extends StatelessWidget { - const NotReadyCard({Key? key}) : super(key: key); + const NotReadyCard({super.key}); @override - Widget build(BuildContext context) { - return Container( + Widget build(final BuildContext context) => Container( padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 10), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15), color: BrandColors.gray6), + borderRadius: BorderRadius.circular(15), color: BrandColors.gray6,), child: RichText( text: TextSpan( children: [ @@ -50,5 +49,4 @@ class NotReadyCard extends StatelessWidget { ), ), ); - } } diff --git a/lib/ui/components/one_page/one_page.dart b/lib/ui/components/one_page/one_page.dart index 30707766..66792716 100644 --- a/lib/ui/components/one_page/one_page.dart +++ b/lib/ui/components/one_page/one_page.dart @@ -6,17 +6,16 @@ import 'package:selfprivacy/ui/components/pre_styled_buttons/pre_styled_buttons. class OnePage extends StatelessWidget { const OnePage({ - Key? key, + super.key, required this.title, required this.child, - }) : super(key: key); + }); final String title; final Widget child; @override - Widget build(BuildContext context) { - return Scaffold( + Widget build(final BuildContext context) => Scaffold( appBar: PreferredSize( preferredSize: const Size.fromHeight(52), child: Column( @@ -40,10 +39,9 @@ class OnePage extends StatelessWidget { color: Theme.of(context).scaffoldBackgroundColor, alignment: Alignment.center, child: PreStyledButtons.close( - onPress: () => Navigator.of(context).pop()), + onPress: () => Navigator.of(context).pop(),), ), ), ), ); - } } diff --git a/lib/ui/components/pre_styled_buttons/close.dart b/lib/ui/components/pre_styled_buttons/close.dart index 5a9e6241..3beb2eb4 100644 --- a/lib/ui/components/pre_styled_buttons/close.dart +++ b/lib/ui/components/pre_styled_buttons/close.dart @@ -1,13 +1,12 @@ part of 'pre_styled_buttons.dart'; class _CloseButton extends StatelessWidget { - const _CloseButton({Key? key, required this.onPress}) : super(key: key); + const _CloseButton({super.key, required this.onPress}); final VoidCallback onPress; @override - Widget build(BuildContext context) { - return OutlinedButton( + Widget build(final BuildContext context) => OutlinedButton( onPressed: () => Navigator.of(context).pop(), child: Row( mainAxisSize: MainAxisSize.min, @@ -17,5 +16,4 @@ class _CloseButton extends StatelessWidget { ], ), ); - } } diff --git a/lib/ui/components/pre_styled_buttons/flash.dart b/lib/ui/components/pre_styled_buttons/flash.dart index 8a0f4b98..5d70013d 100644 --- a/lib/ui/components/pre_styled_buttons/flash.dart +++ b/lib/ui/components/pre_styled_buttons/flash.dart @@ -1,7 +1,7 @@ part of 'pre_styled_buttons.dart'; class _BrandFlashButton extends StatefulWidget { - const _BrandFlashButton({Key? key}) : super(key: key); + const _BrandFlashButton({super.key}); @override _BrandFlashButtonState createState() => _BrandFlashButtonState(); @@ -15,7 +15,7 @@ class _BrandFlashButtonState extends State<_BrandFlashButton> @override void initState() { _animationController = AnimationController( - vsync: this, duration: const Duration(milliseconds: 800)); + vsync: this, duration: const Duration(milliseconds: 800),); _colorTween = ColorTween( begin: BrandColors.black, end: BrandColors.primary, @@ -25,7 +25,7 @@ class _BrandFlashButtonState extends State<_BrandFlashButton> WidgetsBinding.instance.addPostFrameCallback(_afterLayout); } - void _afterLayout(_) { + void _afterLayout(final _) { if (Theme.of(context).brightness == Brightness.dark) { setState(() { _colorTween = ColorTween( @@ -45,9 +45,8 @@ class _BrandFlashButtonState extends State<_BrandFlashButton> bool wasPrevStateIsEmpty = true; @override - Widget build(BuildContext context) { - return BlocListener( - listener: (context, state) { + Widget build(final BuildContext context) => BlocListener( + listener: (final context, final state) { if (wasPrevStateIsEmpty && state is! JobsStateEmpty) { wasPrevStateIsEmpty = false; _animationController.forward(); @@ -61,7 +60,7 @@ class _BrandFlashButtonState extends State<_BrandFlashButton> onPressed: () { showBrandBottomSheet( context: context, - builder: (context) => const BrandBottomSheet( + builder: (final context) => const BrandBottomSheet( isExpended: true, child: JobsContent(), ), @@ -69,9 +68,9 @@ class _BrandFlashButtonState extends State<_BrandFlashButton> }, icon: AnimatedBuilder( animation: _colorTween, - builder: (context, child) { - var v = _animationController.value; - var icon = v > 0.5 ? Ionicons.flash : Ionicons.flash_outline; + builder: (final context, final child) { + final double v = _animationController.value; + final IconData icon = v > 0.5 ? Ionicons.flash : Ionicons.flash_outline; return Transform.scale( scale: 1 + (v < 0.5 ? v : 1 - v) * 2, child: Icon( @@ -79,8 +78,7 @@ class _BrandFlashButtonState extends State<_BrandFlashButton> color: _colorTween.value, ), ); - }), + },), ), ); - } } diff --git a/lib/ui/components/pre_styled_buttons/flash_fab.dart b/lib/ui/components/pre_styled_buttons/flash_fab.dart index 733541c0..89f42e19 100644 --- a/lib/ui/components/pre_styled_buttons/flash_fab.dart +++ b/lib/ui/components/pre_styled_buttons/flash_fab.dart @@ -1,14 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:ionicons/ionicons.dart'; -import 'package:selfprivacy/config/brand_colors.dart'; import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart'; import 'package:selfprivacy/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart'; import 'package:selfprivacy/ui/components/jobs_content/jobs_content.dart'; import 'package:selfprivacy/ui/helpers/modals.dart'; class BrandFab extends StatefulWidget { - const BrandFab({Key? key}) : super(key: key); + const BrandFab({super.key}); @override State createState() => _BrandFabState(); @@ -22,25 +21,8 @@ class _BrandFabState extends State @override void initState() { _animationController = AnimationController( - vsync: this, duration: const Duration(milliseconds: 800)); - _colorTween = ColorTween( - begin: BrandColors.black, - end: BrandColors.primary, - ).animate(_animationController); - + vsync: this, duration: const Duration(milliseconds: 800),); super.initState(); - WidgetsBinding.instance.addPostFrameCallback(_afterLayout); - } - - void _afterLayout(_) { - if (Theme.of(context).brightness == Brightness.dark) { - setState(() { - _colorTween = ColorTween( - begin: BrandColors.white, - end: BrandColors.primary, - ).animate(_animationController); - }); - } } @override @@ -52,9 +34,14 @@ class _BrandFabState extends State bool wasPrevStateIsEmpty = true; @override - Widget build(BuildContext context) { + Widget build(final BuildContext context) { + _colorTween = ColorTween( + begin: Theme.of(context).colorScheme.onPrimaryContainer, + end: Theme.of(context).colorScheme.primary, + ).animate(_animationController); + return BlocListener( - listener: (context, state) { + listener: (final BuildContext context, final JobsState state) { if (wasPrevStateIsEmpty && state is! JobsStateEmpty) { wasPrevStateIsEmpty = false; _animationController.forward(); @@ -68,7 +55,7 @@ class _BrandFabState extends State onPressed: () { showBrandBottomSheet( context: context, - builder: (context) => const BrandBottomSheet( + builder: (final BuildContext context) => const BrandBottomSheet( isExpended: true, child: JobsContent(), ), @@ -76,9 +63,9 @@ class _BrandFabState extends State }, child: AnimatedBuilder( animation: _colorTween, - builder: (context, child) { - var v = _animationController.value; - var icon = v > 0.5 ? Ionicons.flash : Ionicons.flash_outline; + builder: (final BuildContext context, final Widget? child) { + final double v = _animationController.value; + final IconData icon = v > 0.5 ? Ionicons.flash : Ionicons.flash_outline; return Transform.scale( scale: 1 + (v < 0.5 ? v : 1 - v) * 2, child: Icon( @@ -86,7 +73,7 @@ class _BrandFabState extends State color: _colorTween.value, ), ); - }), + },), ), ); } diff --git a/lib/ui/components/pre_styled_buttons/pre_styled_buttons.dart b/lib/ui/components/pre_styled_buttons/pre_styled_buttons.dart index 860a83a3..cb50e2f9 100644 --- a/lib/ui/components/pre_styled_buttons/pre_styled_buttons.dart +++ b/lib/ui/components/pre_styled_buttons/pre_styled_buttons.dart @@ -14,7 +14,7 @@ part 'flash.dart'; class PreStyledButtons { static Widget close({ - required VoidCallback onPress, + required final VoidCallback onPress, }) => _CloseButton(onPress: onPress); diff --git a/lib/ui/components/progress_bar/progress_bar.dart b/lib/ui/components/progress_bar/progress_bar.dart index 4dfc10af..6e8d80c3 100644 --- a/lib/ui/components/progress_bar/progress_bar.dart +++ b/lib/ui/components/progress_bar/progress_bar.dart @@ -7,10 +7,10 @@ import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; class ProgressBar extends StatefulWidget { const ProgressBar({ - Key? key, + super.key, required this.steps, required this.activeIndex, - }) : super(key: key); + }); final int activeIndex; @@ -22,23 +22,23 @@ class ProgressBar extends StatefulWidget { class _ProgressBarState extends State { @override - Widget build(BuildContext context) { - double progress = 1 / widget.steps.length * (widget.activeIndex + 0.3); - var isDark = context.watch().state.isDarkModeOn; - var style = isDark ? progressTextStyleDark : progressTextStyleLight; + Widget build(final BuildContext context) { + final double progress = 1 / widget.steps.length * (widget.activeIndex + 0.3); + final bool isDark = context.watch().state.isDarkModeOn; + final TextStyle style = isDark ? progressTextStyleDark : progressTextStyleLight; - var allSteps = widget.steps.asMap().map( - (i, step) { - var value = _stepTitle(index: i, style: style, step: step); + final Iterable allSteps = widget.steps.asMap().map( + (final i, final step) { + final Container value = _stepTitle(index: i, style: style, step: step); return MapEntry(i, value); }, ).values; - List odd = []; - List even = []; + final List odd = []; + final List even = []; - var i = 0; - for (var step in allSteps) { + int i = 0; + for (final Container step in allSteps) { if (i.isEven) { even.add(step); } else { @@ -76,8 +76,7 @@ class _ProgressBarState extends State { borderRadius: BorderRadius.circular(5), ), child: LayoutBuilder( - builder: (_, constraints) { - return AnimatedContainer( + builder: (final _, final constraints) => AnimatedContainer( width: constraints.maxWidth * progress, height: 5, decoration: BoxDecoration( @@ -91,8 +90,7 @@ class _ProgressBarState extends State { duration: const Duration( milliseconds: 300, ), - ); - }, + ), ), ), const SizedBox(height: 5), @@ -105,12 +103,12 @@ class _ProgressBarState extends State { } Container _stepTitle({ - required int index, + required final int index, TextStyle? style, - String? step, + final String? step, }) { - var isActive = index == widget.activeIndex; - var checked = index < widget.activeIndex; + final bool isActive = index == widget.activeIndex; + final bool checked = index < widget.activeIndex; style = isActive ? style!.copyWith(fontWeight: FontWeight.w700) : style; return Container( @@ -122,13 +120,11 @@ class _ProgressBarState extends State { text: TextSpan( style: progressTextStyleLight, children: [ - checked - ? const WidgetSpan( + if (checked) const WidgetSpan( child: Padding( padding: EdgeInsets.only(bottom: 2, right: 2), child: Icon(BrandIcons.check, size: 11), - )) - : TextSpan(text: '${index + 1}.', style: style), + ),) else TextSpan(text: '${index + 1}.', style: style), TextSpan(text: step, style: style) ], ), diff --git a/lib/ui/components/switch_block/switch_bloc.dart b/lib/ui/components/switch_block/switch_bloc.dart index 3b5531cd..3aa89a33 100644 --- a/lib/ui/components/switch_block/switch_bloc.dart +++ b/lib/ui/components/switch_block/switch_bloc.dart @@ -3,24 +3,23 @@ import 'package:selfprivacy/config/brand_colors.dart'; class SwitcherBlock extends StatelessWidget { const SwitcherBlock({ - Key? key, + super.key, required this.child, required this.isActive, required this.onChange, - }) : super(key: key); + }); final Widget child; final bool isActive; final ValueChanged onChange; @override - Widget build(BuildContext context) { - return Container( + Widget build(final BuildContext context) => Container( padding: const EdgeInsets.only(top: 20, bottom: 5), decoration: const BoxDecoration( border: Border( bottom: BorderSide(width: 1, color: BrandColors.dividerColor), - )), + ),), child: Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -36,5 +35,4 @@ class SwitcherBlock extends StatelessWidget { ], ), ); - } } diff --git a/lib/ui/helpers/modals.dart b/lib/ui/helpers/modals.dart index 540b11ec..8867885f 100644 --- a/lib/ui/helpers/modals.dart +++ b/lib/ui/helpers/modals.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; Future showBrandBottomSheet({ - required BuildContext context, - required WidgetBuilder builder, + required final BuildContext context, + required final WidgetBuilder builder, }) => showCupertinoModalBottomSheet( builder: builder, diff --git a/lib/ui/pages/backup_details/backup_details.dart b/lib/ui/pages/backup_details/backup_details.dart index d36238da..f7784a18 100644 --- a/lib/ui/pages/backup_details/backup_details.dart +++ b/lib/ui/pages/backup_details/backup_details.dart @@ -13,12 +13,12 @@ import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.da import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart'; import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; -import '../../components/brand_cards/brand_cards.dart'; +import 'package:selfprivacy/ui/components/brand_cards/brand_cards.dart'; -var navigatorKey = GlobalKey(); +GlobalKey navigatorKey = GlobalKey(); class BackupDetails extends StatefulWidget { - const BackupDetails({Key? key}) : super(key: key); + const BackupDetails({super.key}); @override State createState() => _BackupDetailsState(); @@ -27,21 +27,21 @@ class BackupDetails extends StatefulWidget { class _BackupDetailsState extends State with SingleTickerProviderStateMixin { @override - Widget build(BuildContext context) { - var isReady = context.watch().state + Widget build(final BuildContext context) { + final bool isReady = context.watch().state is ServerInstallationFinished; - var isBackupInitialized = context.watch().state.isInitialized; - var backupStatus = context.watch().state.status; - var providerState = isReady && isBackupInitialized + final bool isBackupInitialized = context.watch().state.isInitialized; + final BackupStatusEnum backupStatus = context.watch().state.status; + final StateType providerState = isReady && isBackupInitialized ? (backupStatus == BackupStatusEnum.error ? StateType.warning : StateType.stable) : StateType.uninitialized; - var preventActions = context.watch().state.preventActions; - var backupProgress = context.watch().state.progress; - var backupError = context.watch().state.error; - var backups = context.watch().state.backups; - var refreshing = context.watch().state.refreshing; + final bool preventActions = context.watch().state.preventActions; + final double backupProgress = context.watch().state.progress; + final String backupError = context.watch().state.error; + final List backups = context.watch().state.backups; + final bool refreshing = context.watch().state.refreshing; return BrandHeroScreen( heroIcon: BrandIcons.save, @@ -84,7 +84,7 @@ class _BackupDetailsState extends State ListTile( title: Text( 'providers.backup.creating'.tr( - args: [(backupProgress * 100).round().toString()]), + args: [(backupProgress * 100).round().toString()],), style: Theme.of(context).textTheme.headline6, ), subtitle: LinearProgressIndicator( @@ -96,7 +96,7 @@ class _BackupDetailsState extends State ListTile( title: Text( 'providers.backup.restoring'.tr( - args: [(backupProgress * 100).round().toString()]), + args: [(backupProgress * 100).round().toString()],), style: Theme.of(context).textTheme.headline6, ), subtitle: LinearProgressIndicator( @@ -148,12 +148,11 @@ class _BackupDetailsState extends State ), if (backups.isNotEmpty) Column( - children: backups.map((backup) { - return ListTile( + children: backups.map((final Backup backup) => ListTile( onTap: preventActions ? null : () { - var nav = getIt(); + final NavigationService nav = getIt(); nav.showPopUpDialog(BrandAlert( title: 'providers.backup.restoring'.tr(), contentText: 'providers.backup.restore_alert' @@ -171,13 +170,12 @@ class _BackupDetailsState extends State text: 'modals.yes'.tr(), ) ], - )); + ),); }, title: Text( '${MaterialLocalizations.of(context).formatShortDate(backup.time)} ${TimeOfDay.fromDateTime(backup.time).format(context)}', ), - ); - }).toList(), + ),).toList(), ), ], ), diff --git a/lib/ui/pages/devices/devices.dart b/lib/ui/pages/devices/devices.dart index eb5b0531..e14f5263 100644 --- a/lib/ui/pages/devices/devices.dart +++ b/lib/ui/pages/devices/devices.dart @@ -9,7 +9,7 @@ import 'package:selfprivacy/ui/pages/devices/new_device.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart'; class DevicesScreen extends StatefulWidget { - const DevicesScreen({Key? key}) : super(key: key); + const DevicesScreen({super.key}); @override State createState() => _DevicesScreenState(); @@ -17,8 +17,8 @@ class DevicesScreen extends StatefulWidget { class _DevicesScreenState extends State { @override - Widget build(BuildContext context) { - final devicesStatus = context.watch().state; + Widget build(final BuildContext context) { + final ApiDevicesState devicesStatus = context.watch().state; return RefreshIndicator( onRefresh: () async { @@ -46,7 +46,7 @@ class _DevicesScreenState extends State { ), ), ...devicesStatus.otherDevices - .map((device) => _DeviceTile(device: device)) + .map((final device) => _DeviceTile(device: device)) .toList(), const SizedBox(height: 16), OutlinedButton( @@ -79,27 +79,24 @@ class _DevicesScreenState extends State { } class _DeviceTile extends StatelessWidget { - const _DeviceTile({Key? key, required this.device}) : super(key: key); + const _DeviceTile({super.key, required this.device}); final ApiToken device; @override - Widget build(BuildContext context) { - return ListTile( + Widget build(final BuildContext context) => ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), title: Text(device.name), subtitle: Text('devices.main_screen.access_granted_on' - .tr(args: [DateFormat.yMMMMd().format(device.date)])), + .tr(args: [DateFormat.yMMMMd().format(device.date)]),), onTap: device.isCaller ? null : () => _showConfirmationDialog(context, device), ); - } - _showConfirmationDialog(BuildContext context, ApiToken device) => showDialog( + Future _showConfirmationDialog(final BuildContext context, final ApiToken device) => showDialog( context: context, - builder: (context) { - return AlertDialog( + builder: (final context) => AlertDialog( title: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -119,7 +116,7 @@ class _DeviceTile extends StatelessWidget { Text( 'devices.revoke_device_alert.description' .tr(args: [device.name]), - style: Theme.of(context).textTheme.bodyMedium), + style: Theme.of(context).textTheme.bodyMedium,), ], ), actions: [ @@ -137,7 +134,6 @@ class _DeviceTile extends StatelessWidget { }, ), ], - ); - }, + ), ); } diff --git a/lib/ui/pages/devices/new_device.dart b/lib/ui/pages/devices/new_device.dart index 7929b73e..4a152380 100644 --- a/lib/ui/pages/devices/new_device.dart +++ b/lib/ui/pages/devices/new_device.dart @@ -7,11 +7,10 @@ import 'package:selfprivacy/ui/components/brand_button/filled_button.dart'; import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart'; class NewDeviceScreen extends StatelessWidget { - const NewDeviceScreen({Key? key}) : super(key: key); + const NewDeviceScreen({super.key}); @override - Widget build(BuildContext context) { - return BrandHeroScreen( + Widget build(final BuildContext context) => BrandHeroScreen( heroTitle: 'devices.add_new_device_screen.header'.tr(), heroSubtitle: 'devices.add_new_device_screen.description'.tr(), hasBackButton: true, @@ -19,7 +18,7 @@ class NewDeviceScreen extends StatelessWidget { children: [ FutureBuilder( future: context.read().getNewDeviceKey(), - builder: (context, snapshot) { + builder: (final BuildContext context, final AsyncSnapshot snapshot) { if (snapshot.hasData) { return _KeyDisplay( newDeviceKey: snapshot.data.toString(), @@ -31,16 +30,14 @@ class NewDeviceScreen extends StatelessWidget { ), ], ); - } } class _KeyDisplay extends StatelessWidget { - const _KeyDisplay({Key? key, required this.newDeviceKey}) : super(key: key); + const _KeyDisplay({super.key, required this.newDeviceKey}); final String newDeviceKey; @override - Widget build(BuildContext context) { - return Column( + Widget build(final BuildContext context) => Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Divider(), @@ -80,5 +77,4 @@ class _KeyDisplay extends StatelessWidget { const SizedBox(height: 24), ], ); - } } diff --git a/lib/ui/pages/dns_details/dns_details.dart b/lib/ui/pages/dns_details/dns_details.dart index b891c4d1..3e3cc67a 100644 --- a/lib/ui/pages/dns_details/dns_details.dart +++ b/lib/ui/pages/dns_details/dns_details.dart @@ -8,17 +8,17 @@ import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.da import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart'; class DnsDetailsPage extends StatefulWidget { - const DnsDetailsPage({Key? key}) : super(key: key); + const DnsDetailsPage({super.key}); @override State createState() => _DnsDetailsPageState(); } class _DnsDetailsPageState extends State { - Widget _getStateCard(DnsRecordsStatus dnsState, Function fixCallback) { - var description = ''; - var subtitle = ''; - var icon = const Icon( + Widget _getStateCard(final DnsRecordsStatus dnsState, final Function fixCallback) { + String description = ''; + String subtitle = ''; + Icon icon = const Icon( Icons.check, color: Colors.green, ); @@ -63,11 +63,11 @@ class _DnsDetailsPageState extends State { } @override - Widget build(BuildContext context) { - var isReady = context.watch().state + Widget build(final BuildContext context) { + final bool isReady = context.watch().state is ServerInstallationFinished; - final domain = getIt().serverDomain?.domainName ?? ''; - var dnsCubit = context.watch().state; + final String domain = getIt().serverDomain?.domainName ?? ''; + final DnsRecordsState dnsCubit = context.watch().state; print(dnsCubit.dnsState); @@ -124,11 +124,11 @@ class _DnsDetailsPageState extends State { ), ...dnsCubit.dnsRecords .where( - (dnsRecord) => + (final dnsRecord) => dnsRecord.category == DnsRecordsCategory.services, ) .map( - (dnsRecord) => Column( + (final dnsRecord) => Column( children: [ const Divider( height: 1.0, @@ -180,11 +180,11 @@ class _DnsDetailsPageState extends State { ), ...dnsCubit.dnsRecords .where( - (dnsRecord) => + (final dnsRecord) => dnsRecord.category == DnsRecordsCategory.email, ) .map( - (dnsRecord) => Column( + (final dnsRecord) => Column( children: [ const Divider( height: 1.0, diff --git a/lib/ui/pages/more/about/about.dart b/lib/ui/pages/more/about/about.dart index 53faa191..bc1a3819 100644 --- a/lib/ui/pages/more/about/about.dart +++ b/lib/ui/pages/more/about/about.dart @@ -4,21 +4,19 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:selfprivacy/ui/components/brand_md/brand_md.dart'; class AboutPage extends StatelessWidget { - const AboutPage({Key? key}) : super(key: key); + const AboutPage({super.key}); @override - Widget build(BuildContext context) { - return SafeArea( + Widget build(final BuildContext context) => SafeArea( child: Scaffold( appBar: PreferredSize( preferredSize: const Size.fromHeight(52), child: BrandHeader( - title: 'more.about_project'.tr(), hasBackButton: true), + title: 'more.about_project'.tr(), hasBackButton: true,), ), body: const BrandMarkdown( fileName: 'about', ), ), ); - } } diff --git a/lib/ui/pages/more/app_settings/app_setting.dart b/lib/ui/pages/more/app_settings/app_setting.dart index ac4cbc49..1dc50416 100644 --- a/lib/ui/pages/more/app_settings/app_setting.dart +++ b/lib/ui/pages/more/app_settings/app_setting.dart @@ -13,7 +13,7 @@ import 'package:selfprivacy/utils/named_font_weight.dart'; import 'package:easy_localization/easy_localization.dart'; class AppSettingsPage extends StatefulWidget { - const AppSettingsPage({Key? key}) : super(key: key); + const AppSettingsPage({super.key}); @override State createState() => _AppSettingsPageState(); @@ -21,16 +21,15 @@ class AppSettingsPage extends StatefulWidget { class _AppSettingsPageState extends State { @override - Widget build(BuildContext context) { - var isDarkModeOn = context.watch().state.isDarkModeOn; + Widget build(final BuildContext context) { + final bool isDarkModeOn = context.watch().state.isDarkModeOn; return SafeArea( - child: Builder(builder: (context) { - return Scaffold( + child: Builder(builder: (final context) => Scaffold( appBar: PreferredSize( preferredSize: const Size.fromHeight(52), child: BrandHeader( - title: 'more.settings.title'.tr(), hasBackButton: true), + title: 'more.settings.title'.tr(), hasBackButton: true,), ), body: ListView( padding: paddingH15V0, @@ -41,7 +40,7 @@ class _AppSettingsPageState extends State { decoration: const BoxDecoration( border: Border( bottom: BorderSide(width: 1, color: BrandColors.dividerColor), - )), + ),), child: Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -56,7 +55,7 @@ class _AppSettingsPageState extends State { const SizedBox(width: 5), BrandSwitch( value: Theme.of(context).brightness == Brightness.dark, - onChanged: (value) => context + onChanged: (final value) => context .read() .updateDarkMode(isDarkModeOn: !isDarkModeOn), ), @@ -68,7 +67,7 @@ class _AppSettingsPageState extends State { decoration: const BoxDecoration( border: Border( bottom: BorderSide(width: 1, color: BrandColors.dividerColor), - )), + ),), child: Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -95,8 +94,7 @@ class _AppSettingsPageState extends State { onPressed: () { showDialog( context: context, - builder: (_) { - return BrandAlert( + builder: (final _) => BrandAlert( title: 'modals.3'.tr(), contentText: 'modals.4'.tr(), actions: [ @@ -108,13 +106,12 @@ class _AppSettingsPageState extends State { .read() .clearAppConfig(); Navigator.of(context).pop(); - }), + },), ActionButton( text: 'basis.cancel'.tr(), ), ], - ); - }, + ), ); }, ), @@ -124,20 +121,19 @@ class _AppSettingsPageState extends State { deleteServer(context) ], ), - ); - }), + ),), ); } - Widget deleteServer(BuildContext context) { - var isDisabled = + Widget deleteServer(final BuildContext context) { + final bool isDisabled = context.watch().state.serverDetails == null; return Container( padding: const EdgeInsets.only(top: 20, bottom: 5), decoration: const BoxDecoration( border: Border( bottom: BorderSide(width: 1, color: BrandColors.dividerColor), - )), + ),), child: Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -159,8 +155,7 @@ class _AppSettingsPageState extends State { : () { showDialog( context: context, - builder: (_) { - return BrandAlert( + builder: (final _) => BrandAlert( title: 'modals.3'.tr(), contentText: 'modals.6'.tr(), actions: [ @@ -170,25 +165,22 @@ class _AppSettingsPageState extends State { onPressed: () async { showDialog( context: context, - builder: (context) { - return Container( + builder: (final context) => Container( alignment: Alignment.center, child: const CircularProgressIndicator(), - ); - }); + ),); await context .read() .serverDelete(); if (!mounted) return; Navigator.of(context).pop(); - }), + },), ActionButton( text: 'basis.cancel'.tr(), ), ], - ); - }, + ), ); }, child: Text( @@ -207,18 +199,17 @@ class _AppSettingsPageState extends State { class _TextColumn extends StatelessWidget { const _TextColumn({ - Key? key, + super.key, required this.title, required this.value, this.hasWarning = false, - }) : super(key: key); + }); final String title; final String value; final bool hasWarning; @override - Widget build(BuildContext context) { - return Column( + Widget build(final BuildContext context) => Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ BrandText.body1( @@ -231,8 +222,7 @@ class _TextColumn extends StatelessWidget { fontSize: 13, height: 1.53, color: BrandColors.gray1, - ).merge(TextStyle(color: hasWarning ? BrandColors.warning : null))), + ).merge(TextStyle(color: hasWarning ? BrandColors.warning : null)),), ], ); - } } diff --git a/lib/ui/pages/more/console/console.dart b/lib/ui/pages/more/console/console.dart index 1c77e6bf..a3d046b6 100644 --- a/lib/ui/pages/more/console/console.dart +++ b/lib/ui/pages/more/console/console.dart @@ -8,7 +8,7 @@ import 'package:selfprivacy/ui/components/brand_divider/brand_divider.dart'; import 'package:selfprivacy/ui/components/brand_header/brand_header.dart'; class Console extends StatefulWidget { - const Console({Key? key}) : super(key: key); + const Console({super.key}); @override State createState() => _ConsoleState(); @@ -31,8 +31,7 @@ class _ConsoleState extends State { void update() => setState(() => {}); @override - Widget build(BuildContext context) { - return SafeArea( + Widget build(final BuildContext context) => SafeArea( child: Scaffold( appBar: PreferredSize( preferredSize: const Size.fromHeight(53), @@ -45,9 +44,9 @@ class _ConsoleState extends State { ), body: FutureBuilder( future: getIt.allReady(), - builder: (BuildContext context, AsyncSnapshot snapshot) { + builder: (final BuildContext context, final AsyncSnapshot snapshot) { if (snapshot.hasData) { - var messages = getIt.get().messages; + final List messages = getIt.get().messages; return ListView( reverse: true, @@ -55,8 +54,8 @@ class _ConsoleState extends State { children: [ const SizedBox(height: 20), ...UnmodifiableListView(messages - .map((message) { - var isError = message.type == MessageType.warning; + .map((final message) { + final bool isError = message.type == MessageType.warning; return Padding( padding: const EdgeInsets.symmetric(vertical: 4), child: RichText( @@ -69,7 +68,7 @@ class _ConsoleState extends State { style: TextStyle( fontWeight: FontWeight.bold, color: - isError ? BrandColors.red1 : null)), + isError ? BrandColors.red1 : null,),), TextSpan(text: message.text), ], ), @@ -77,7 +76,7 @@ class _ConsoleState extends State { ); }) .toList() - .reversed), + .reversed,), ], ); } else { @@ -97,5 +96,4 @@ class _ConsoleState extends State { ), ), ); - } } diff --git a/lib/ui/pages/more/info/info.dart b/lib/ui/pages/more/info/info.dart index 639fab4e..baa82021 100644 --- a/lib/ui/pages/more/info/info.dart +++ b/lib/ui/pages/more/info/info.dart @@ -7,11 +7,10 @@ import 'package:package_info/package_info.dart'; import 'package:easy_localization/easy_localization.dart'; class InfoPage extends StatelessWidget { - const InfoPage({Key? key}) : super(key: key); + const InfoPage({super.key}); @override - Widget build(BuildContext context) { - return SafeArea( + Widget build(final BuildContext context) => SafeArea( child: Scaffold( appBar: PreferredSize( preferredSize: const Size.fromHeight(52), @@ -24,18 +23,15 @@ class InfoPage extends StatelessWidget { const SizedBox(height: 10), FutureBuilder( future: _version(), - builder: (context, snapshot) { - return BrandText.body1('more.about_app_page.text' - .tr(args: [snapshot.data.toString()])); - }), + builder: (final context, final snapshot) => BrandText.body1('more.about_app_page.text' + .tr(args: [snapshot.data.toString()]),),), ], ), ), ); - } Future _version() async { - var packageInfo = await PackageInfo.fromPlatform(); + final PackageInfo packageInfo = await PackageInfo.fromPlatform(); return packageInfo.version; } } diff --git a/lib/ui/pages/more/more.dart b/lib/ui/pages/more/more.dart index 334d0707..eee3398e 100644 --- a/lib/ui/pages/more/more.dart +++ b/lib/ui/pages/more/more.dart @@ -14,18 +14,18 @@ import 'package:selfprivacy/ui/pages/root_route.dart'; import 'package:selfprivacy/ui/pages/ssh_keys/ssh_keys.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart'; -import '../../../logic/cubit/users/users_cubit.dart'; -import 'about/about.dart'; -import 'app_settings/app_setting.dart'; -import 'console/console.dart'; -import 'info/info.dart'; +import 'package:selfprivacy/logic/cubit/users/users_cubit.dart'; +import 'package:selfprivacy/ui/pages/more/about/about.dart'; +import 'package:selfprivacy/ui/pages/more/app_settings/app_setting.dart'; +import 'package:selfprivacy/ui/pages/more/console/console.dart'; +import 'package:selfprivacy/ui/pages/more/info/info.dart'; class MorePage extends StatelessWidget { - const MorePage({Key? key}) : super(key: key); + const MorePage({super.key}); @override - Widget build(BuildContext context) { - var isReady = context.watch().state + Widget build(final BuildContext context) { + final bool isReady = context.watch().state is ServerInstallationFinished; return Scaffold( @@ -55,7 +55,7 @@ class MorePage extends StatelessWidget { iconData: Ionicons.key_outline, goTo: SshKeysPage( user: context.read().state.rootUser, - )), + ),), if (isReady) _MoreMenuItem( iconData: Icons.password_outlined, @@ -105,13 +105,13 @@ class MorePage extends StatelessWidget { class _MoreMenuItem extends StatelessWidget { const _MoreMenuItem({ - Key? key, + super.key, required this.iconData, required this.title, this.subtitle, this.goTo, this.accent = false, - }) : super(key: key); + }); final IconData iconData; final String title; @@ -120,8 +120,8 @@ class _MoreMenuItem extends StatelessWidget { final bool accent; @override - Widget build(BuildContext context) { - final color = accent + Widget build(final BuildContext context) { + final Color color = accent ? Theme.of(context).colorScheme.onTertiaryContainer : Theme.of(context).colorScheme.onSurface; return BrandCards.filled( diff --git a/lib/ui/pages/onboarding/onboarding.dart b/lib/ui/pages/onboarding/onboarding.dart index 4530c746..364f5380 100644 --- a/lib/ui/pages/onboarding/onboarding.dart +++ b/lib/ui/pages/onboarding/onboarding.dart @@ -6,7 +6,7 @@ import 'package:selfprivacy/utils/route_transitions/basic.dart'; import 'package:easy_localization/easy_localization.dart'; class OnboardingPage extends StatefulWidget { - const OnboardingPage({Key? key, required this.nextPage}) : super(key: key); + const OnboardingPage({super.key, required this.nextPage}); final Widget nextPage; @override @@ -22,8 +22,7 @@ class _OnboardingPageState extends State { } @override - Widget build(BuildContext context) { - return SafeArea( + Widget build(final BuildContext context) => SafeArea( child: Scaffold( body: PageView( controller: pageController, @@ -34,19 +33,15 @@ class _OnboardingPageState extends State { ), ), ); - } - Widget _withPadding(Widget child) { - return Padding( + Widget _withPadding(final Widget child) => Padding( padding: const EdgeInsets.symmetric( horizontal: 15, ), child: child, ); - } - Widget firstPage() { - return ConstrainedBox( + Widget firstPage() => ConstrainedBox( constraints: BoxConstraints( maxHeight: MediaQuery.of(context).size.height, ), @@ -85,10 +80,8 @@ class _OnboardingPageState extends State { ], ), ); - } - Widget secondPage() { - return ConstrainedBox( + Widget secondPage() => ConstrainedBox( constraints: BoxConstraints( maxHeight: MediaQuery.of(context).size.height, ), @@ -126,7 +119,7 @@ class _OnboardingPageState extends State { context.read().turnOffOnboarding(); Navigator.of(context).pushAndRemoveUntil( materialRoute(widget.nextPage), - (route) => false, + (final route) => false, ); }, text: 'basis.got_it'.tr(), @@ -135,16 +128,15 @@ class _OnboardingPageState extends State { ], ), ); - } } String _fileName({ - required BuildContext context, - required String path, - required String fileName, - required String fileExtention, + required final BuildContext context, + required final String path, + required final String fileName, + required final String fileExtention, }) { - var theme = Theme.of(context); - var isDark = theme.brightness == Brightness.dark; + final ThemeData theme = Theme.of(context); + final bool isDark = theme.brightness == Brightness.dark; return '$path/$fileName${isDark ? '-dark' : '-light'}.$fileExtention'; } diff --git a/lib/ui/pages/providers/providers.dart b/lib/ui/pages/providers/providers.dart index 2abed128..7168689a 100644 --- a/lib/ui/pages/providers/providers.dart +++ b/lib/ui/pages/providers/providers.dart @@ -18,10 +18,10 @@ import 'package:selfprivacy/ui/pages/dns_details/dns_details.dart'; import 'package:selfprivacy/ui/pages/server_details/server_details_screen.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart'; -var navigatorKey = GlobalKey(); +GlobalKey navigatorKey = GlobalKey(); class ProvidersPage extends StatefulWidget { - const ProvidersPage({Key? key}) : super(key: key); + const ProvidersPage({super.key}); @override State createState() => _ProvidersPageState(); @@ -29,11 +29,11 @@ class ProvidersPage extends StatefulWidget { class _ProvidersPageState extends State { @override - Widget build(BuildContext context) { - var isReady = context.watch().state + Widget build(final BuildContext context) { + final bool isReady = context.watch().state is ServerInstallationFinished; - var isBackupInitialized = context.watch().state.isInitialized; - var dnsStatus = context.watch().state.dnsState; + final bool isBackupInitialized = context.watch().state.isInitialized; + final DnsRecordsStatus dnsStatus = context.watch().state.dnsState; StateType getDnsStatus() { if (dnsStatus == DnsRecordsStatus.uninitialized || @@ -46,9 +46,9 @@ class _ProvidersPageState extends State { return StateType.stable; } - final cards = ProviderType.values + final List cards = ProviderType.values .map( - (type) => Padding( + (final ProviderType type) => Padding( padding: const EdgeInsets.only(bottom: 30), child: _Card( provider: ProviderModel( @@ -87,21 +87,21 @@ class _ProvidersPageState extends State { } class _Card extends StatelessWidget { - const _Card({Key? key, required this.provider}) : super(key: key); + const _Card({super.key, required this.provider}); final ProviderModel provider; @override - Widget build(BuildContext context) { + Widget build(final BuildContext context) { late String title; String? message; late String stableText; late VoidCallback onTap; - var isReady = context.watch().state + final bool isReady = context.watch().state is ServerInstallationFinished; - ServerInstallationState appConfig = + final ServerInstallationState appConfig = context.watch().state; - var domainName = + final String domainName = appConfig.isDomainFilled ? appConfig.serverDomain!.domainName : ''; switch (provider.type) { @@ -110,7 +110,7 @@ class _Card extends StatelessWidget { stableText = 'providers.server.status'.tr(); onTap = () => showBrandBottomSheet( context: context, - builder: (context) => const BrandBottomSheet( + builder: (final BuildContext context) => const BrandBottomSheet( isExpended: true, child: ServerDetailsScreen(), ), @@ -124,7 +124,7 @@ class _Card extends StatelessWidget { onTap = () => Navigator.of(context).push(materialRoute( const DnsDetailsPage(), - )); + ),); break; case ProviderType.backup: title = 'providers.backup.card_title'.tr(); @@ -132,7 +132,7 @@ class _Card extends StatelessWidget { onTap = () => Navigator.of(context).push(materialRoute( const BackupDetails(), - )); + ),); break; } return GestureDetector( diff --git a/lib/ui/pages/recovery_key/recovery_key.dart b/lib/ui/pages/recovery_key/recovery_key.dart index 810f3080..9d329a20 100644 --- a/lib/ui/pages/recovery_key/recovery_key.dart +++ b/lib/ui/pages/recovery_key/recovery_key.dart @@ -10,12 +10,11 @@ import 'package:selfprivacy/ui/components/brand_button/brand_button.dart'; import 'package:selfprivacy/ui/components/brand_button/filled_button.dart'; import 'package:selfprivacy/ui/components/brand_cards/brand_cards.dart'; import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart'; -import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; import 'package:selfprivacy/ui/pages/recovery_key/recovery_key_receiving.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart'; class RecoveryKey extends StatefulWidget { - const RecoveryKey({Key? key}) : super(key: key); + const RecoveryKey({super.key}); @override State createState() => _RecoveryKeyState(); @@ -23,8 +22,8 @@ class RecoveryKey extends StatefulWidget { class _RecoveryKeyState extends State { @override - Widget build(BuildContext context) { - final keyStatus = context.watch().state; + Widget build(final BuildContext context) { + final RecoveryKeyState keyStatus = context.watch().state; final List widgets; String? subtitle = @@ -62,7 +61,7 @@ class _RecoveryKeyState extends State { } class RecoveryKeyContent extends StatefulWidget { - const RecoveryKeyContent({Key? key}) : super(key: key); + const RecoveryKeyContent({super.key}); @override State createState() => _RecoveryKeyContentState(); @@ -72,8 +71,8 @@ class _RecoveryKeyContentState extends State { bool _isConfigurationVisible = false; @override - Widget build(BuildContext context) { - final keyStatus = context.watch().state; + Widget build(final BuildContext context) { + final RecoveryKeyState keyStatus = context.watch().state; return Column( children: [ @@ -108,14 +107,12 @@ class _RecoveryKeyContentState extends State { } class RecoveryKeyStatusCard extends StatelessWidget { - const RecoveryKeyStatusCard({required this.isValid, Key? key}) - : super(key: key); + const RecoveryKeyStatusCard({required this.isValid, super.key}); final bool isValid; @override - Widget build(BuildContext context) { - return BrandCards.filled( + Widget build(final BuildContext context) => BrandCards.filled( child: ListTile( title: isValid ? Text( @@ -144,18 +141,16 @@ class RecoveryKeyStatusCard extends StatelessWidget { : Theme.of(context).colorScheme.errorContainer, ), ); - } } class RecoveryKeyInformation extends StatelessWidget { - const RecoveryKeyInformation({required this.state, Key? key}) - : super(key: key); + const RecoveryKeyInformation({required this.state, super.key}); final RecoveryKeyState state; @override - Widget build(BuildContext context) { - const padding = EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0); + Widget build(final BuildContext context) { + const EdgeInsets padding = EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0); return SizedBox( width: double.infinity, child: Column( @@ -196,7 +191,7 @@ class RecoveryKeyInformation extends StatelessWidget { } class RecoveryKeyConfiguration extends StatefulWidget { - const RecoveryKeyConfiguration({Key? key}) : super(key: key); + const RecoveryKeyConfiguration({super.key}); @override State createState() => _RecoveryKeyConfigurationState(); @@ -222,7 +217,7 @@ class _RecoveryKeyConfigurationState extends State { _isLoading = true; }); try { - final token = await context.read().generateRecoveryKey( + final String token = await context.read().generateRecoveryKey( numberOfUses: _isAmountToggled ? int.tryParse(_amountController.text) : null, expirationDate: _isExpirationToggled ? _selectedDate : null, @@ -248,8 +243,8 @@ class _RecoveryKeyConfigurationState extends State { } void _updateErrorStatuses() { - final amount = _amountController.text; - final expiration = _expirationController.text; + final String amount = _amountController.text; + final String expiration = _expirationController.text; print('amount: $amount'); print('_isAmountToggled: $_isAmountToggled'); @@ -261,7 +256,7 @@ class _RecoveryKeyConfigurationState extends State { } else if (amount.isEmpty) { _isAmountError = true; } else { - final amountInt = int.tryParse(amount); + final int? amountInt = int.tryParse(amount); _isAmountError = amountInt == null || amountInt <= 0; } @@ -279,7 +274,7 @@ class _RecoveryKeyConfigurationState extends State { } @override - Widget build(BuildContext context) { + Widget build(final BuildContext context) { if (_isDateSelected) { _expirationController.text = DateFormat.yMMMMd().format(_selectedDate); } @@ -294,7 +289,7 @@ class _RecoveryKeyConfigurationState extends State { value: _isAmountToggled, title: Text('recovery_key.key_amount_toggle'.tr()), activeColor: Theme.of(context).colorScheme.primary, - onChanged: (bool toggled) { + onChanged: (final bool toggled) { setState( () { _isAmountToggled = toggled; @@ -317,7 +312,7 @@ class _RecoveryKeyConfigurationState extends State { decoration: InputDecoration( border: const OutlineInputBorder(), errorText: _isAmountError ? ' ' : null, - labelText: 'recovery_key.key_amount_field_title'.tr()), + labelText: 'recovery_key.key_amount_field_title'.tr(),), keyboardType: TextInputType.number, inputFormatters: [ FilteringTextInputFormatter.digitsOnly, @@ -332,7 +327,7 @@ class _RecoveryKeyConfigurationState extends State { value: _isExpirationToggled, title: Text('recovery_key.key_duedate_toggle'.tr()), activeColor: Theme.of(context).colorScheme.primary, - onChanged: (bool toggled) { + onChanged: (final bool toggled) { setState( () { _isExpirationToggled = toggled; @@ -359,7 +354,7 @@ class _RecoveryKeyConfigurationState extends State { decoration: InputDecoration( border: const OutlineInputBorder(), errorText: _isExpirationError ? ' ' : null, - labelText: 'recovery_key.key_duedate_field_title'.tr()), + labelText: 'recovery_key.key_duedate_field_title'.tr(),), keyboardType: TextInputType.number, inputFormatters: [ FilteringTextInputFormatter.digitsOnly, @@ -381,12 +376,12 @@ class _RecoveryKeyConfigurationState extends State { ); } - Future _selectDate(BuildContext context) async { - final selected = await showDatePicker( + Future _selectDate(final BuildContext context) async { + final DateTime? selected = await showDatePicker( context: context, initialDate: _selectedDate, firstDate: DateTime.now(), - lastDate: DateTime(DateTime.now().year + 50)); + lastDate: DateTime(DateTime.now().year + 50),); if (selected != null && selected != _selectedDate) { setState( diff --git a/lib/ui/pages/recovery_key/recovery_key_receiving.dart b/lib/ui/pages/recovery_key/recovery_key_receiving.dart index 7356864d..f695dd47 100644 --- a/lib/ui/pages/recovery_key/recovery_key_receiving.dart +++ b/lib/ui/pages/recovery_key/recovery_key_receiving.dart @@ -4,14 +4,12 @@ import 'package:selfprivacy/ui/components/brand_button/filled_button.dart'; import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart'; class RecoveryKeyReceiving extends StatelessWidget { - const RecoveryKeyReceiving({required this.recoveryKey, Key? key}) - : super(key: key); + const RecoveryKeyReceiving({required this.recoveryKey, super.key}); final String recoveryKey; @override - Widget build(BuildContext context) { - return BrandHeroScreen( + Widget build(final BuildContext context) => BrandHeroScreen( heroTitle: 'recovery_key.key_main_header'.tr(), heroSubtitle: 'recovery_key.key_receiving_description'.tr(), hasBackButton: true, @@ -42,10 +40,9 @@ class RecoveryKeyReceiving extends StatelessWidget { FilledButton( title: 'recovery_key.key_receiving_done'.tr(), onPressed: () { - Navigator.of(context).popUntil((route) => route.isFirst); + Navigator.of(context).popUntil((final route) => route.isFirst); }, ), ], ); - } } diff --git a/lib/ui/pages/root_route.dart b/lib/ui/pages/root_route.dart index 9e0fcf67..fb4efeed 100644 --- a/lib/ui/pages/root_route.dart +++ b/lib/ui/pages/root_route.dart @@ -6,10 +6,10 @@ import 'package:selfprivacy/ui/pages/providers/providers.dart'; import 'package:selfprivacy/ui/pages/services/services.dart'; import 'package:selfprivacy/ui/pages/users/users.dart'; -import '../components/pre_styled_buttons/flash_fab.dart'; +import 'package:selfprivacy/ui/components/pre_styled_buttons/flash_fab.dart'; class RootPage extends StatefulWidget { - const RootPage({Key? key}) : super(key: key); + const RootPage({super.key}); @override State createState() => _RootPageState(); @@ -48,13 +48,13 @@ class _RootPageState extends State with TickerProviderStateMixin { } @override - Widget build(BuildContext context) { - var isReady = context.watch().state + Widget build(final BuildContext context) { + final bool isReady = context.watch().state is ServerInstallationFinished; return SafeArea( child: Provider( - create: (_) => ChangeTab(tabController.animateTo), + create: (final _) => ChangeTab(tabController.animateTo), child: Scaffold( body: TabBarView( controller: tabController, @@ -92,7 +92,7 @@ class _RootPageState extends State with TickerProviderStateMixin { } class ChangeTab { - final ValueChanged onPress; ChangeTab(this.onPress); + final ValueChanged onPress; } diff --git a/lib/ui/pages/server_details/chart.dart b/lib/ui/pages/server_details/chart.dart index bc94bac4..0091b6b1 100644 --- a/lib/ui/pages/server_details/chart.dart +++ b/lib/ui/pages/server_details/chart.dart @@ -1,13 +1,13 @@ part of 'server_details_screen.dart'; class _Chart extends StatelessWidget { - const _Chart({Key? key}) : super(key: key); + const _Chart({final super.key}); @override - Widget build(BuildContext context) { - var cubit = context.watch(); - var period = cubit.state.period; - var state = cubit.state; + Widget build(final BuildContext context) { + final HetznerMetricsCubit cubit = context.watch(); + final Period period = cubit.state.period; + final HetznerMetricsState state = cubit.state; List charts; if (state is HetznerMetricsLoading) { charts = [ @@ -85,8 +85,8 @@ class _Chart extends StatelessWidget { ); } - Widget getCpuChart(HetznerMetricsLoaded state) { - var data = state.cpu; + Widget getCpuChart(final HetznerMetricsLoaded state) { + final data = state.cpu; return SizedBox( height: 200, @@ -98,9 +98,9 @@ class _Chart extends StatelessWidget { ); } - Widget getPpsChart(HetznerMetricsLoaded state) { - var ppsIn = state.ppsIn; - var ppsOut = state.ppsOut; + Widget getPpsChart(final HetznerMetricsLoaded state) { + final ppsIn = state.ppsIn; + final ppsOut = state.ppsOut; return SizedBox( height: 200, @@ -112,9 +112,9 @@ class _Chart extends StatelessWidget { ); } - Widget getBandwidthChart(HetznerMetricsLoaded state) { - var ppsIn = state.bandwidthIn; - var ppsOut = state.bandwidthOut; + Widget getBandwidthChart(final HetznerMetricsLoaded state) { + final ppsIn = state.bandwidthIn; + final ppsOut = state.bandwidthOut; return SizedBox( height: 200, @@ -129,7 +129,7 @@ class _Chart extends StatelessWidget { class Legend extends StatelessWidget { const Legend({ - Key? key, + final Key? key, required this.color, required this.text, }) : super(key: key); @@ -137,7 +137,7 @@ class Legend extends StatelessWidget { final String text; final Color color; @override - Widget build(BuildContext context) { + Widget build(final BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.end, children: [ @@ -151,14 +151,14 @@ class Legend extends StatelessWidget { class _ColoredBox extends StatelessWidget { const _ColoredBox({ - Key? key, + final Key? key, required this.color, }) : super(key: key); final Color color; @override - Widget build(BuildContext context) { + Widget build(final BuildContext context) { return Container( width: 10, height: 10, diff --git a/lib/ui/pages/setup/initializing.dart b/lib/ui/pages/setup/initializing.dart index 98853c8f..e3fd0e77 100644 --- a/lib/ui/pages/setup/initializing.dart +++ b/lib/ui/pages/setup/initializing.dart @@ -326,7 +326,7 @@ class InitializingPage extends StatelessWidget { ), ), SizedBox( - width: 50, + width: 56, child: BrandButton.rised( onPressed: () => context.read().load(), child: Row( @@ -422,7 +422,7 @@ class InitializingPage extends StatelessWidget { .setValue(!isVisible), ), suffixIconConstraints: const BoxConstraints(minWidth: 60), - prefixIconConstraints: const BoxConstraints(maxWidth: 85), + prefixIconConstraints: const BoxConstraints(maxWidth: 60), prefixIcon: Container(), ), ); diff --git a/lib/ui/pages/setup/recovering/recover_by_new_device_key.dart b/lib/ui/pages/setup/recovering/recover_by_new_device_key.dart index 7496ef37..1c02f34d 100644 --- a/lib/ui/pages/setup/recovering/recover_by_new_device_key.dart +++ b/lib/ui/pages/setup/recovering/recover_by_new_device_key.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:selfprivacy/logic/cubit/forms/setup/recovering/recovery_device_form_cubit.dart'; @@ -36,24 +38,24 @@ class RecoverByNewDeviceKeyInput extends StatelessWidget { @override Widget build(BuildContext context) { - var appConfig = context.watch(); + ServerInstallationCubit appConfig = context.watch(); return BlocProvider( - create: (context) => RecoveryDeviceFormCubit( + create: (BuildContext context) => RecoveryDeviceFormCubit( appConfig, FieldCubitFactory(context), ServerRecoveryMethods.newDeviceKey, ), child: BlocListener( - listener: (context, state) { + listener: (BuildContext context, ServerInstallationState state) { if (state is ServerInstallationRecovery && state.currentStep != RecoveryStep.newDeviceKey) { Navigator.of(context).pop(); } }, child: Builder( - builder: (context) { - var formCubitState = context.watch().state; + builder: (BuildContext context) { + FormCubitState formCubitState = context.watch().state; return BrandHeroScreen( heroTitle: 'recovering.recovery_main_header'.tr(), diff --git a/lib/ui/pages/setup/recovering/recover_by_old_token.dart b/lib/ui/pages/setup/recovering/recover_by_old_token.dart index 46c1b3b4..fa96c04e 100644 --- a/lib/ui/pages/setup/recovering/recover_by_old_token.dart +++ b/lib/ui/pages/setup/recovering/recover_by_old_token.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:selfprivacy/logic/cubit/forms/setup/recovering/recovery_device_form_cubit.dart'; @@ -11,13 +13,11 @@ import 'package:selfprivacy/logic/cubit/forms/factories/field_cubit_factory.dart class RecoverByOldTokenInstruction extends StatelessWidget { @override const RecoverByOldTokenInstruction( - {Key? key, required this.instructionFilename}) - : super(key: key); + {super.key, required this.instructionFilename,}); @override - Widget build(BuildContext context) { - return BlocListener( - listener: (context, state) { + Widget build(final BuildContext context) => BlocListener( + listener: (final context, final state) { if (state is ServerInstallationRecovery && state.currentStep != RecoveryStep.selecting) { Navigator.of(context).pop(); @@ -43,27 +43,26 @@ class RecoverByOldTokenInstruction extends StatelessWidget { ], ), ); - } final String instructionFilename; } class RecoverByOldToken extends StatelessWidget { - const RecoverByOldToken({Key? key}) : super(key: key); + const RecoverByOldToken({super.key}); @override - Widget build(BuildContext context) { - var appConfig = context.watch(); + Widget build(final BuildContext context) { + final ServerInstallationCubit appConfig = context.watch(); return BlocProvider( - create: (context) => RecoveryDeviceFormCubit( + create: (final context) => RecoveryDeviceFormCubit( appConfig, FieldCubitFactory(context), ServerRecoveryMethods.oldToken, ), child: Builder( - builder: (context) { - var formCubitState = context.watch().state; + builder: (final context) { + final FormCubitState formCubitState = context.watch().state; return BrandHeroScreen( heroTitle: 'recovering.recovery_main_header'.tr(), diff --git a/lib/ui/pages/setup/recovering/recover_by_recovery_key.dart b/lib/ui/pages/setup/recovering/recover_by_recovery_key.dart index c9bd2439..51a930a8 100644 --- a/lib/ui/pages/setup/recovering/recover_by_recovery_key.dart +++ b/lib/ui/pages/setup/recovering/recover_by_recovery_key.dart @@ -8,21 +8,21 @@ import 'package:selfprivacy/ui/components/brand_button/filled_button.dart'; import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart'; class RecoverByRecoveryKey extends StatelessWidget { - const RecoverByRecoveryKey({Key? key}) : super(key: key); + const RecoverByRecoveryKey({final Key? key}) : super(key: key); @override - Widget build(BuildContext context) { - var appConfig = context.watch(); + Widget build(final BuildContext context) { + ServerInstallationCubit appConfig = context.watch(); return BlocProvider( - create: (context) => RecoveryDeviceFormCubit( + create: (final context) => RecoveryDeviceFormCubit( appConfig, FieldCubitFactory(context), ServerRecoveryMethods.recoveryKey, ), child: Builder( - builder: (context) { - var formCubitState = context.watch().state; + builder: (final context) { + FormCubitState formCubitState = context.watch().state; return BrandHeroScreen( heroTitle: 'recovering.recovery_main_header'.tr(), diff --git a/lib/ui/pages/setup/recovering/recovery_confirm_backblaze.dart b/lib/ui/pages/setup/recovering/recovery_confirm_backblaze.dart index 2a9fd8a9..d14955d7 100644 --- a/lib/ui/pages/setup/recovering/recovery_confirm_backblaze.dart +++ b/lib/ui/pages/setup/recovering/recovery_confirm_backblaze.dart @@ -10,16 +10,16 @@ import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.da import 'package:selfprivacy/ui/components/brand_md/brand_md.dart'; class RecoveryConfirmBackblaze extends StatelessWidget { - const RecoveryConfirmBackblaze({Key? key}) : super(key: key); + const RecoveryConfirmBackblaze({final Key? key}) : super(key: key); @override - Widget build(BuildContext context) { - var appConfig = context.watch(); + Widget build(final BuildContext context) { + ServerInstallationCubit appConfig = context.watch(); return BlocProvider( - create: (context) => BackblazeFormCubit(appConfig), - child: Builder(builder: (context) { - var formCubitState = context.watch().state; + create: (final BuildContext context) => BackblazeFormCubit(appConfig), + child: Builder(builder: (final BuildContext context) { + FormCubitState formCubitState = context.watch().state; return BrandHeroScreen( heroTitle: 'recovering.confirm_backblaze'.tr(), @@ -55,8 +55,7 @@ class RecoveryConfirmBackblaze extends StatelessWidget { context: context, isScrollControlled: true, backgroundColor: Colors.transparent, - builder: (BuildContext context) { - return const BrandBottomSheet( + builder: (final BuildContext context) => const BrandBottomSheet( isExpended: true, child: Padding( padding: paddingH15V0, @@ -64,14 +63,13 @@ class RecoveryConfirmBackblaze extends StatelessWidget { fileName: 'how_backblaze', ), ), - ); - }, + ), ), title: 'initializing.how'.tr(), ), ], ); - }), + },), ); } } diff --git a/lib/ui/pages/setup/recovering/recovery_confirm_cloudflare.dart b/lib/ui/pages/setup/recovering/recovery_confirm_cloudflare.dart index 28f1a8fc..1de939b1 100644 --- a/lib/ui/pages/setup/recovering/recovery_confirm_cloudflare.dart +++ b/lib/ui/pages/setup/recovering/recovery_confirm_cloudflare.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'package:cubit_form/cubit_form.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -10,22 +12,22 @@ import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.da import 'package:selfprivacy/ui/components/brand_md/brand_md.dart'; class RecoveryConfirmCloudflare extends StatelessWidget { - const RecoveryConfirmCloudflare({Key? key}) : super(key: key); + const RecoveryConfirmCloudflare({super.key}); @override - Widget build(BuildContext context) { - var appConfig = context.watch(); + Widget build(final BuildContext context) { + final ServerInstallationCubit appConfig = context.watch(); return BlocProvider( - create: (context) => CloudFlareFormCubit(appConfig), - child: Builder(builder: (context) { - var formCubitState = context.watch().state; + create: (final BuildContext context) => CloudFlareFormCubit(appConfig), + child: Builder(builder: (final BuildContext context) { + final FormCubitState formCubitState = context.watch().state; return BrandHeroScreen( heroTitle: 'recovering.confirm_cloudflare'.tr(), heroSubtitle: 'recovering.confirm_cloudflare_description'.tr(args: [ appConfig.state.serverDomain?.domainName ?? 'your domain' - ]), + ],), hasBackButton: true, hasFlashButton: false, children: [ @@ -49,8 +51,7 @@ class RecoveryConfirmCloudflare extends StatelessWidget { context: context, isScrollControlled: true, backgroundColor: Colors.transparent, - builder: (BuildContext context) { - return const BrandBottomSheet( + builder: (final BuildContext context) => const BrandBottomSheet( isExpended: true, child: Padding( padding: paddingH15V0, @@ -58,14 +59,13 @@ class RecoveryConfirmCloudflare extends StatelessWidget { fileName: 'how_cloudflare', ), ), - ); - }, + ), ), title: 'initializing.how'.tr(), ), ], ); - }), + },), ); } } diff --git a/lib/ui/pages/setup/recovering/recovery_confirm_server.dart b/lib/ui/pages/setup/recovering/recovery_confirm_server.dart index 8242e521..fd7658ab 100644 --- a/lib/ui/pages/setup/recovering/recovery_confirm_server.dart +++ b/lib/ui/pages/setup/recovering/recovery_confirm_server.dart @@ -8,7 +8,7 @@ import 'package:selfprivacy/ui/components/brand_cards/brand_cards.dart'; import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart'; class RecoveryConfirmServer extends StatefulWidget { - const RecoveryConfirmServer({Key? key}) : super(key: key); + const RecoveryConfirmServer({super.key}); @override State createState() => _RecoveryConfirmServerState(); @@ -259,11 +259,11 @@ class _RecoveryConfirmServerState extends State { class IsValidStringDisplay extends StatelessWidget { const IsValidStringDisplay({ - Key? key, + super.key, required this.isValid, required this.textIfValid, required this.textIfInvalid, - }) : super(key: key); + }); final bool isValid; final String textIfValid; diff --git a/lib/ui/pages/setup/recovering/recovery_hentzner_connected.dart b/lib/ui/pages/setup/recovering/recovery_hentzner_connected.dart index 04093aed..6973ae2d 100644 --- a/lib/ui/pages/setup/recovering/recovery_hentzner_connected.dart +++ b/lib/ui/pages/setup/recovering/recovery_hentzner_connected.dart @@ -11,17 +11,17 @@ import 'package:selfprivacy/logic/cubit/server_installation/server_installation_ import 'package:selfprivacy/ui/components/brand_md/brand_md.dart'; class RecoveryHetznerConnected extends StatelessWidget { - const RecoveryHetznerConnected({Key? key}) : super(key: key); + const RecoveryHetznerConnected({final Key? key}) : super(key: key); @override - Widget build(BuildContext context) { - var appConfig = context.watch(); + Widget build(final BuildContext context) { + ServerInstallationCubit appConfig = context.watch(); return BlocProvider( - create: (context) => HetznerFormCubit(appConfig), + create: (final BuildContext context) => HetznerFormCubit(appConfig), child: Builder( - builder: (context) { - var formCubitState = context.watch().state; + builder: (final BuildContext context) { + FormCubitState formCubitState = context.watch().state; return BrandHeroScreen( heroTitle: 'recovering.hetzner_connected'.tr(), @@ -52,7 +52,7 @@ class RecoveryHetznerConnected extends StatelessWidget { context: context, isScrollControlled: true, backgroundColor: Colors.transparent, - builder: (BuildContext context) { + builder: (final BuildContext context) { return const BrandBottomSheet( isExpended: true, child: Padding( diff --git a/lib/utils/extensions/duration.dart b/lib/utils/extensions/duration.dart index 49fa96b8..aac00eb2 100644 --- a/lib/utils/extensions/duration.dart +++ b/lib/utils/extensions/duration.dart @@ -6,9 +6,7 @@ extension DurationFormatter on Duration { this.inHours.remainder(24), this.inMinutes.remainder(60), this.inSeconds.remainder(60) - ].map((seg) { - return seg.toString().padLeft(2, '0'); - }).join(':'); + ].map((seg) => seg.toString().padLeft(2, '0')).join(':'); } String toDayHourMinuteFormat() { @@ -17,9 +15,7 @@ extension DurationFormatter on Duration { var segments = [ this.inHours.remainder(24).abs(), this.inMinutes.remainder(60).abs(), - ].map((seg) { - return seg.toString().padLeft(2, '0'); - }); + ].map((seg) => seg.toString().padLeft(2, '0')); return '$designator${segments.first}:${segments.last}'; } @@ -33,9 +29,7 @@ extension DurationFormatter on Duration { var segments = [ this.inHours.remainder(24), this.inMinutes.remainder(60), - ].map((seg) { - return seg.toString().padLeft(2, '0'); - }); + ].map((seg) => seg.toString().padLeft(2, '0')); return '${segments.first} h ${segments.last} min'; } } diff --git a/lib/utils/extensions/elevation_extension.dart b/lib/utils/extensions/elevation_extension.dart index 78de82f1..4b1cbf3f 100644 --- a/lib/utils/extensions/elevation_extension.dart +++ b/lib/utils/extensions/elevation_extension.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + library elevation_extension; import 'package:flutter/material.dart'; @@ -5,16 +7,15 @@ import 'package:flutter/cupertino.dart'; extension ElevationExtension on BoxDecoration { BoxDecoration copyWith({ - Color? color, - DecorationImage? image, - BoxBorder? border, - BorderRadiusGeometry? borderRadius, - List? boxShadow, - Gradient? gradient, - BlendMode? backgroundBlendMode, - BoxShape? shape, - }) { - return BoxDecoration( + final Color? color, + final DecorationImage? image, + final BoxBorder? border, + final BorderRadiusGeometry? borderRadius, + final List? boxShadow, + final Gradient? gradient, + final BlendMode? backgroundBlendMode, + final BoxShape? shape, + }) => BoxDecoration( color: color ?? this.color, image: image ?? this.image, border: border ?? this.border, @@ -26,5 +27,4 @@ extension ElevationExtension on BoxDecoration { backgroundBlendMode: backgroundBlendMode ?? this.backgroundBlendMode, shape: shape ?? this.shape, ); - } } diff --git a/lib/utils/extensions/text_extensions.dart b/lib/utils/extensions/text_extensions.dart index bf810f51..6afaee08 100644 --- a/lib/utils/extensions/text_extensions.dart +++ b/lib/utils/extensions/text_extensions.dart @@ -1,7 +1,7 @@ import 'package:flutter/cupertino.dart'; extension TextExtension on Text { - Text withColor(Color color) => Text( + Text withColor(final Color color) => Text( data!, key: key, strutStyle: strutStyle, @@ -20,20 +20,19 @@ extension TextExtension on Text { ); Text copyWith({ - Key? key, - StrutStyle? strutStyle, - TextAlign? textAlign, - TextDirection? textDirection, - Locale? locale, - bool? softWrap, - TextOverflow? overflow, - double? textScaleFactor, - int? maxLines, - String? semanticsLabel, - TextWidthBasis? textWidthBasis, - TextStyle? style, - }) { - return Text(data!, + final Key? key, + final StrutStyle? strutStyle, + final TextAlign? textAlign, + final TextDirection? textDirection, + final Locale? locale, + final bool? softWrap, + final TextOverflow? overflow, + final double? textScaleFactor, + final int? maxLines, + final String? semanticsLabel, + final TextWidthBasis? textWidthBasis, + final TextStyle? style, + }) => Text(data!, key: key ?? this.key, strutStyle: strutStyle ?? this.strutStyle, textAlign: textAlign ?? this.textAlign, @@ -45,6 +44,5 @@ extension TextExtension on Text { maxLines: maxLines ?? this.maxLines, semanticsLabel: semanticsLabel ?? this.semanticsLabel, textWidthBasis: textWidthBasis ?? this.textWidthBasis, - style: style != null ? this.style?.merge(style) ?? style : this.style); - } + style: style != null ? this.style?.merge(style) ?? style : this.style,); } diff --git a/lib/utils/password_generator.dart b/lib/utils/password_generator.dart index 35bdaecb..70fd83a9 100644 --- a/lib/utils/password_generator.dart +++ b/lib/utils/password_generator.dart @@ -1,3 +1,5 @@ +// ignore_for_file: always_specify_types + import 'dart:math'; Random _rnd = Random(); @@ -5,19 +7,19 @@ Random _rnd = Random(); typedef StringGeneratorFunction = String Function(); class StringGenerators { - static const letters = 'abcdefghijklmnopqrstuvwxyz'; - static const numbers = '1234567890'; - static const symbols = '_'; + static const String letters = 'abcdefghijklmnopqrstuvwxyz'; + static const String numbers = '1234567890'; + static const String symbols = '_'; static String getRandomString( - int length, { - hasLowercaseLetters = false, - hasUppercaseLetters = false, - hasNumbers = false, - hasSymbols = false, - isStrict = false, + final int length, { + final hasLowercaseLetters = false, + final hasUppercaseLetters = false, + final hasNumbers = false, + final hasSymbols = false, + final isStrict = false, }) { - var chars = ''; + String chars = ''; if (hasLowercaseLetters) chars += letters; if (hasUppercaseLetters) chars += letters.toUpperCase(); if (hasNumbers) chars += numbers; @@ -29,8 +31,8 @@ class StringGenerators { return genString(length, chars); } - var res = ''; - var loose = length; + String res = ''; + int loose = length; if (hasLowercaseLetters) { loose -= 1; res += genString(1, letters); @@ -49,20 +51,18 @@ class StringGenerators { } res += genString(loose, chars); - var shuffledlist = res.split('')..shuffle(); + final List shuffledlist = res.split('')..shuffle(); return shuffledlist.join(); } - static String genString(int length, String chars) { - return String.fromCharCodes( + static String genString(final int length, final String chars) => String.fromCharCodes( Iterable.generate( length, - (_) => chars.codeUnitAt( + (final _) => chars.codeUnitAt( _rnd.nextInt(chars.length), ), ), ); - } static StringGeneratorFunction userPassword = () => getRandomString( 8, diff --git a/lib/utils/route_transitions/basic.dart b/lib/utils/route_transitions/basic.dart index 2cea3eb9..5cd69cfd 100644 --- a/lib/utils/route_transitions/basic.dart +++ b/lib/utils/route_transitions/basic.dart @@ -1,9 +1,11 @@ +// ignore_for_file: always_specify_types + import 'package:flutter/material.dart'; -Route materialRoute(Widget widget) => MaterialPageRoute( - builder: (context) => widget, +Route materialRoute(final Widget widget) => MaterialPageRoute( + builder: (final BuildContext context) => widget, ); -Route noAnimationRoute(Widget widget) => PageRouteBuilder( - pageBuilder: (context, animation1, animation2) => widget, +Route noAnimationRoute(final Widget widget) => PageRouteBuilder( + pageBuilder: (final BuildContext context, final Animation animation1, final Animation animation2) => widget, ); diff --git a/lib/utils/route_transitions/slide_bottom.dart b/lib/utils/route_transitions/slide_bottom.dart index 28363e2d..374a5e90 100644 --- a/lib/utils/route_transitions/slide_bottom.dart +++ b/lib/utils/route_transitions/slide_bottom.dart @@ -1,19 +1,18 @@ import 'package:flutter/material.dart'; -Function pageBuilder = (Widget widget) => ( - BuildContext context, - Animation animation, - Animation secondaryAnimation, +Function pageBuilder = (final Widget widget) => ( + final BuildContext context, + final Animation animation, + final Animation secondaryAnimation, ) => widget; Function transitionsBuilder = ( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, -) { - return SlideTransition( + final BuildContext context, + final Animation animation, + final Animation secondaryAnimation, + final Widget child, +) => SlideTransition( position: Tween( begin: const Offset(0, 1), end: Offset.zero, @@ -31,7 +30,6 @@ Function transitionsBuilder = ( child: child, ), ); -}; class SlideBottomRoute extends PageRouteBuilder { SlideBottomRoute(this.widget) @@ -39,7 +37,7 @@ class SlideBottomRoute extends PageRouteBuilder { transitionDuration: const Duration(milliseconds: 150), pageBuilder: pageBuilder(widget), transitionsBuilder: transitionsBuilder as Widget Function( - BuildContext, Animation, Animation, Widget), + BuildContext, Animation, Animation, Widget,), ); final Widget widget; diff --git a/lib/utils/route_transitions/slide_right.dart b/lib/utils/route_transitions/slide_right.dart index 635bb021..774dcaff 100644 --- a/lib/utils/route_transitions/slide_right.dart +++ b/lib/utils/route_transitions/slide_right.dart @@ -1,19 +1,18 @@ import 'package:flutter/material.dart'; -Function pageBuilder = (Widget widget) => ( - BuildContext context, - Animation animation, - Animation secondaryAnimation, +Function pageBuilder = (final Widget widget) => ( + final BuildContext context, + final Animation animation, + final Animation secondaryAnimation, ) => widget; Function transitionsBuilder = ( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child, -) { - return SlideTransition( + final BuildContext context, + final Animation animation, + final Animation secondaryAnimation, + final Widget child, +) => SlideTransition( position: Tween( begin: const Offset(-1, 0), end: Offset.zero, @@ -31,14 +30,13 @@ Function transitionsBuilder = ( child: child, ), ); -}; class SlideRightRoute extends PageRouteBuilder { SlideRightRoute(this.widget) : super( pageBuilder: pageBuilder(widget), transitionsBuilder: transitionsBuilder as Widget Function( - BuildContext, Animation, Animation, Widget), + BuildContext, Animation, Animation, Widget,), ); final Widget widget; diff --git a/lib/utils/ui_helpers.dart b/lib/utils/ui_helpers.dart index 1958c90f..c34721e1 100644 --- a/lib/utils/ui_helpers.dart +++ b/lib/utils/ui_helpers.dart @@ -3,6 +3,6 @@ import 'package:selfprivacy/logic/cubit/server_installation/server_installation_ /// it's ui helpers use only for ui components, don't use for logic components. class UiHelpers { - static String getDomainName(ServerInstallationState config) => + static String getDomainName(final ServerInstallationState config) => config.isDomainFilled ? config.serverDomain!.domainName : 'example.com'; } diff --git a/test/widget_test.dart b/test/widget_test.dart index 48cbdccf..72a8e56e 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -8,12 +8,12 @@ void main() { test('assert chart empty', () { expect(() { StringGenerators.getRandomString(8); - }, throwsAssertionError); + }, throwsAssertionError,); }); test('only lowercase string', () { - var length = 8; - var generatedString = + const int length = 8; + final String generatedString = StringGenerators.getRandomString(length, hasLowercaseLetters: true); expect(generatedString, isNot(matches(regExpNewLines))); @@ -26,9 +26,9 @@ void main() { }); test('only uppercase string', () { - var length = 8; - var generatedString = StringGenerators.getRandomString(length, - hasLowercaseLetters: false, hasUppercaseLetters: true); + const int length = 8; + final String generatedString = StringGenerators.getRandomString(length, + hasLowercaseLetters: false, hasUppercaseLetters: true,); expect(generatedString, isNot(matches(regExpNewLines))); expect(generatedString, isNot(matches(regExpWhiteSpaces))); @@ -40,11 +40,11 @@ void main() { }); test('only numbers string', () { - var length = 8; - var generatedString = StringGenerators.getRandomString(length, + const int length = 8; + final String generatedString = StringGenerators.getRandomString(length, hasLowercaseLetters: false, hasUppercaseLetters: false, - hasNumbers: true); + hasNumbers: true,); expect(generatedString, isNot(matches(regExpNewLines))); expect(generatedString, isNot(matches(regExpWhiteSpaces))); @@ -56,8 +56,8 @@ void main() { }); test('only symbols string', () { - var length = 8; - var generatedString = StringGenerators.getRandomString( + const int length = 8; + final String generatedString = StringGenerators.getRandomString( length, hasLowercaseLetters: false, hasUppercaseLetters: false, @@ -77,13 +77,13 @@ void main() { group('Strict mode', () { test('All', () { - var length = 5; - var generatedString = StringGenerators.getRandomString(length, + const int length = 5; + final String generatedString = StringGenerators.getRandomString(length, hasLowercaseLetters: true, hasUppercaseLetters: true, hasNumbers: true, hasSymbols: true, - isStrict: true); + isStrict: true,); expect(generatedString, isNot(matches(regExpNewLines))); expect(generatedString, isNot(matches(regExpWhiteSpaces))); @@ -94,13 +94,13 @@ void main() { expect(generatedString.length, equals(length)); }); test('Lowercase letters and numbers', () { - var length = 3; - var generatedString = StringGenerators.getRandomString(length, + const int length = 3; + final String generatedString = StringGenerators.getRandomString(length, hasLowercaseLetters: true, hasUppercaseLetters: false, hasNumbers: true, hasSymbols: false, - isStrict: true); + isStrict: true,); expect(generatedString, isNot(matches(regExpNewLines))); expect(generatedString, isNot(matches(regExpWhiteSpaces))); @@ -114,9 +114,9 @@ void main() { }); } -var regExpNewLines = RegExp(r'[\n\r]+'); -var regExpWhiteSpaces = RegExp(r'[\s]+'); -var regExpUppercaseLetters = RegExp(r'[A-Z]'); -var regExpLowercaseLetters = RegExp(r'[a-z]'); -var regExpNumbers = RegExp(r'[0-9]'); -var regExpSymbols = RegExp(r'(?:_|[^\w\s])+'); +RegExp regExpNewLines = RegExp(r'[\n\r]+'); +RegExp regExpWhiteSpaces = RegExp(r'[\s]+'); +RegExp regExpUppercaseLetters = RegExp(r'[A-Z]'); +RegExp regExpLowercaseLetters = RegExp(r'[a-z]'); +RegExp regExpNumbers = RegExp(r'[0-9]'); +RegExp regExpSymbols = RegExp(r'(?:_|[^\w\s])+');