diff --git a/lib/logic/api_maps/graphql_maps/server_api/server_actions_api.dart b/lib/logic/api_maps/graphql_maps/server_api/server_actions_api.dart index 07ca101d..780f1d37 100644 --- a/lib/logic/api_maps/graphql_maps/server_api/server_actions_api.dart +++ b/lib/logic/api_maps/graphql_maps/server_api/server_actions_api.dart @@ -24,9 +24,7 @@ mixin ServerActionsApi on ApiMap { try { final GraphQLClient client = await getClient(); return await _commonBoolRequest( - () async { - await client.mutate$RebootSystem(); - }, + () async => client.mutate$RebootSystem(), ); } catch (e) { return false; @@ -37,9 +35,7 @@ mixin ServerActionsApi on ApiMap { try { final GraphQLClient client = await getClient(); return await _commonBoolRequest( - () async { - await client.mutate$PullRepositoryChanges(); - }, + () async => client.mutate$PullRepositoryChanges(), ); } catch (e) { return false; @@ -49,10 +45,8 @@ mixin ServerActionsApi on ApiMap { Future upgrade() async { try { final GraphQLClient client = await getClient(); - return await _commonBoolRequest( - () async { - await client.mutate$RunSystemUpgrade(); - }, + return _commonBoolRequest( + () async => client.mutate$RunSystemUpgrade(), ); } catch (e) { return false; diff --git a/lib/logic/cubit/client_jobs/client_jobs_cubit.dart b/lib/logic/cubit/client_jobs/client_jobs_cubit.dart index 49b856ff..4fa610cd 100644 --- a/lib/logic/cubit/client_jobs/client_jobs_cubit.dart +++ b/lib/logic/cubit/client_jobs/client_jobs_cubit.dart @@ -105,6 +105,7 @@ class JobsCubit extends Cubit { emit(JobsStateLoading()); bool hasServiceJobs = false; for (final ClientJob job in jobs) { + // TODO: Rewrite to polymorphism if (job is CreateUserJob) { await usersCubit.createUser(job.user); } @@ -124,6 +125,9 @@ class JobsCubit extends Cubit { if (job is ResetUserPasswordJob) { await usersCubit.changeUserPassword(job.user, job.user.password!); } + if (job is RebuildServerJob) { + await upgradeServer(); + } } await api.pullConfigurationUpdate(); diff --git a/lib/logic/models/job.dart b/lib/logic/models/job.dart index 2d62a305..1dc1bd91 100644 --- a/lib/logic/models/job.dart +++ b/lib/logic/models/job.dart @@ -20,6 +20,13 @@ class ClientJob extends Equatable { List get props => [id, title]; } +class RebuildServerJob extends ClientJob { + RebuildServerJob({ + required final super.title, + final super.id, + }); +} + class CreateUserJob extends ClientJob { CreateUserJob({ required this.user, diff --git a/lib/ui/pages/server_details/server_details_screen.dart b/lib/ui/pages/server_details/server_details_screen.dart index 367d8de8..24675dad 100644 --- a/lib/ui/pages/server_details/server_details_screen.dart +++ b/lib/ui/pages/server_details/server_details_screen.dart @@ -3,11 +3,13 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:selfprivacy/config/brand_colors.dart'; import 'package:selfprivacy/logic/common_enum/common_enum.dart'; +import 'package:selfprivacy/logic/cubit/client_jobs/client_jobs_cubit.dart'; import 'package:selfprivacy/logic/cubit/hetzner_metrics/hetzner_metrics_cubit.dart'; import 'package:selfprivacy/logic/cubit/server_detailed_info/server_detailed_info_cubit.dart'; import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart'; import 'package:selfprivacy/logic/cubit/server_volumes/server_volume_cubit.dart'; import 'package:selfprivacy/logic/models/auto_upgrade_settings.dart'; +import 'package:selfprivacy/logic/models/job.dart'; import 'package:selfprivacy/ui/components/brand_button/segmented_buttons.dart'; import 'package:selfprivacy/ui/components/brand_cards/filled_card.dart'; import 'package:selfprivacy/ui/components/brand_header/brand_header.dart'; diff --git a/lib/ui/pages/server_details/server_settings.dart b/lib/ui/pages/server_details/server_settings.dart index 9a35e74a..38c7133b 100644 --- a/lib/ui/pages/server_details/server_settings.dart +++ b/lib/ui/pages/server_details/server_settings.dart @@ -10,6 +10,7 @@ class _ServerSettings extends StatefulWidget { class _ServerSettingsState extends State<_ServerSettings> { bool? allowAutoUpgrade; bool? rebootAfterUpgrade; + bool? didSomethingChange; @override Widget build(final BuildContext context) { @@ -24,11 +25,18 @@ class _ServerSettingsState extends State<_ServerSettings> { rebootAfterUpgrade = serverDetailsState.autoUpgradeSettings.allowReboot; } + didSomethingChange ??= false; + return Column( children: [ SwitchListTile( value: allowAutoUpgrade ?? false, onChanged: (final switched) { + if (didSomethingChange == false) { + context.read().addJob( + RebuildServerJob(title: 'jobs.upgradeServer'.tr()), + ); + } context .read() .repository @@ -40,6 +48,7 @@ class _ServerSettingsState extends State<_ServerSettings> { ); setState(() { allowAutoUpgrade = switched; + didSomethingChange = true; }); }, title: Text('providers.server.settings.allow_autoupgrade'.tr()), @@ -51,6 +60,11 @@ class _ServerSettingsState extends State<_ServerSettings> { SwitchListTile( value: rebootAfterUpgrade ?? false, onChanged: (final switched) { + if (didSomethingChange == false) { + context.read().addJob( + RebuildServerJob(title: 'jobs.upgradeServer'.tr()), + ); + } context .read() .repository @@ -62,6 +76,7 @@ class _ServerSettingsState extends State<_ServerSettings> { ); setState(() { rebootAfterUpgrade = switched; + didSomethingChange = true; }); }, title: Text('providers.server.settings.reboot_after_upgrade'.tr()), @@ -76,6 +91,14 @@ class _ServerSettingsState extends State<_ServerSettings> { serverDetailsState.serverTimezone.toString(), ), onTap: () { + if (didSomethingChange == false) { + context.read().addJob( + RebuildServerJob(title: 'jobs.upgradeServer'.tr()), + ); + } + setState(() { + didSomethingChange = true; + }); Navigator.of(context).push( materialRoute( const SelectTimezone(),