diff --git a/lib/logic/cubit/client_jobs/client_jobs_cubit.dart b/lib/logic/cubit/client_jobs/client_jobs_cubit.dart index dacdcc29..e9378bed 100644 --- a/lib/logic/cubit/client_jobs/client_jobs_cubit.dart +++ b/lib/logic/cubit/client_jobs/client_jobs_cubit.dart @@ -24,14 +24,13 @@ class JobsCubit extends Cubit { final ServicesCubit servicesCubit; void addJob(final ClientJob job) { - final List newJobsList = []; - if (state is JobsStateWithJobs) { - final JobsStateWithJobs jobsState = state as JobsStateWithJobs; - newJobsList.addAll(jobsState.clientJobList); + final jobs = currentJobList; + if (job.canAddTo(jobs)) { + _updateJobsState([ + ...jobs, + ...[job], + ]); } - newJobsList.add(job); - getIt().showSnackBar('jobs.job_added'.tr()); - emit(JobsStateWithJobs(newJobsList)); } void removeJob(final String id) { @@ -39,37 +38,18 @@ class JobsCubit extends Cubit { emit(newState); } - void createOrRemoveServiceToggleJob(final ToggleJob job) { - final List newJobsList = []; + List get currentJobList { + final List jobs = []; if (state is JobsStateWithJobs) { - newJobsList.addAll((state as JobsStateWithJobs).clientJobList); - } - final bool needToRemoveJob = newJobsList - .any((final el) => el is ServiceToggleJob && el.id == job.id); - if (needToRemoveJob) { - final ClientJob removingJob = newJobsList.firstWhere( - (final el) => el is ServiceToggleJob && el.id == job.id, - ); - removeJob(removingJob.id); - } else { - newJobsList.add(job); - getIt().showSnackBar('jobs.job_added'.tr()); - emit(JobsStateWithJobs(newJobsList)); + jobs.addAll((state as JobsStateWithJobs).clientJobList); } + + return jobs; } - void createShhJobIfNotExist(final CreateSSHKeyJob job) { - final List newJobsList = []; - if (state is JobsStateWithJobs) { - newJobsList.addAll((state as JobsStateWithJobs).clientJobList); - } - final bool isExistInJobList = - newJobsList.any((final el) => el is CreateSSHKeyJob); - if (!isExistInJobList) { - newJobsList.add(job); - getIt().showSnackBar('jobs.job_added'.tr()); - emit(JobsStateWithJobs(newJobsList)); - } + void _updateJobsState(final List newJobs) { + getIt().showSnackBar('jobs.job_added'.tr()); + emit(JobsStateWithJobs(newJobs)); } Future rebootServer() async { diff --git a/lib/logic/models/job.dart b/lib/logic/models/job.dart index 13abdb72..076e0d16 100644 --- a/lib/logic/models/job.dart +++ b/lib/logic/models/job.dart @@ -17,6 +17,7 @@ abstract class ClientJob extends Equatable { final String title; final String id; + bool canAddTo(final List jobs) => true; void execute(final JobsCubit cubit); @override @@ -25,10 +26,14 @@ abstract class ClientJob extends Equatable { class RebuildServerJob extends ClientJob { RebuildServerJob({ - required final super.title, - final super.id, + required super.title, + super.id, }); + @override + bool canAddTo(final List jobs) => + !jobs.any((final job) => job is RebuildServerJob); + @override void execute(final JobsCubit cubit) async { await cubit.upgradeServer(); @@ -74,6 +79,11 @@ class DeleteUserJob extends ClientJob { final User user; + @override + bool canAddTo(final List jobs) => !jobs.any( + (final job) => job is DeleteUserJob && job.user.login == user.login, + ); + @override void execute(final JobsCubit cubit) async { await cubit.usersCubit.deleteUser(user); @@ -83,33 +93,30 @@ class DeleteUserJob extends ClientJob { List get props => [id, title, user]; } -abstract class ToggleJob extends ClientJob { - ToggleJob({ - required final this.service, - required final super.title, - }); - - final Service service; - - @override - List get props => [...super.props, service]; -} - -class ServiceToggleJob extends ToggleJob { +class ServiceToggleJob extends ClientJob { ServiceToggleJob({ - required super.service, + required this.service, required this.needToTurnOn, }) : super( title: '${needToTurnOn ? "jobs.service_turn_on".tr() : "jobs.service_turn_off".tr()} ${service.displayName}', ); + final bool needToTurnOn; + final Service service; + + @override + bool canAddTo(final List jobs) => !jobs.any( + (final job) => job is ServiceToggleJob && job.service.id == service.id, + ); + @override void execute(final JobsCubit cubit) async { await cubit.api.switchService(service.id, needToTurnOn); } - final bool needToTurnOn; + @override + List get props => [...super.props, service]; } class CreateSSHKeyJob extends ClientJob { @@ -139,6 +146,14 @@ class DeleteSSHKeyJob extends ClientJob { final User user; final String publicKey; + @override + bool canAddTo(final List jobs) => !jobs.any( + (final job) => + job is DeleteSSHKeyJob && + job.publicKey == publicKey && + job.user.login == user.login, + ); + @override void execute(final JobsCubit cubit) async { await cubit.usersCubit.deleteSshKey(user, publicKey); diff --git a/lib/ui/pages/server_details/server_settings.dart b/lib/ui/pages/server_details/server_settings.dart index f669dce0..a9facd5d 100644 --- a/lib/ui/pages/server_details/server_settings.dart +++ b/lib/ui/pages/server_details/server_settings.dart @@ -10,7 +10,6 @@ class _ServerSettings extends StatefulWidget { class _ServerSettingsState extends State<_ServerSettings> { bool? allowAutoUpgrade; bool? rebootAfterUpgrade; - bool? didSomethingChange; @override Widget build(final BuildContext context) { @@ -25,18 +24,14 @@ 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.upgrade_server'.tr()), - ); - } + context.read().addJob( + RebuildServerJob(title: 'jobs.upgrade_server'.tr()), + ); context .read() .repository @@ -48,7 +43,6 @@ class _ServerSettingsState extends State<_ServerSettings> { ); setState(() { allowAutoUpgrade = switched; - didSomethingChange = true; }); }, title: Text('server.allow_autoupgrade'.tr()), @@ -60,11 +54,9 @@ class _ServerSettingsState extends State<_ServerSettings> { SwitchListTile( value: rebootAfterUpgrade ?? false, onChanged: (final switched) { - if (didSomethingChange == false) { - context.read().addJob( - RebuildServerJob(title: 'jobs.upgrade_server'.tr()), - ); - } + context.read().addJob( + RebuildServerJob(title: 'jobs.upgrade_server'.tr()), + ); context .read() .repository @@ -76,7 +68,6 @@ class _ServerSettingsState extends State<_ServerSettings> { ); setState(() { rebootAfterUpgrade = switched; - didSomethingChange = true; }); }, title: Text('server.reboot_after_upgrade'.tr()), @@ -91,14 +82,9 @@ class _ServerSettingsState extends State<_ServerSettings> { serverDetailsState.serverTimezone.toString(), ), onTap: () { - if (didSomethingChange == false) { - context.read().addJob( - RebuildServerJob(title: 'jobs.upgrade_server'.tr()), - ); - } - setState(() { - didSomethingChange = true; - }); + context.read().addJob( + RebuildServerJob(title: 'jobs.upgrade_server'.tr()), + ); Navigator.of(context).push( materialRoute( const SelectTimezone(), diff --git a/lib/ui/pages/services/service_page.dart b/lib/ui/pages/services/service_page.dart index 6cd49f28..35741016 100644 --- a/lib/ui/pages/services/service_page.dart +++ b/lib/ui/pages/services/service_page.dart @@ -89,7 +89,7 @@ class _ServicePageState extends State { ListTile( iconColor: Theme.of(context).colorScheme.onBackground, onTap: () => { - context.read().createOrRemoveServiceToggleJob( + context.read().addJob( ServiceToggleJob( service: service, needToTurnOn: serviceDisabled, diff --git a/lib/ui/pages/services/services.dart b/lib/ui/pages/services/services.dart index 22fd3c91..89a7348a 100644 --- a/lib/ui/pages/services/services.dart +++ b/lib/ui/pages/services/services.dart @@ -157,8 +157,7 @@ class _Card extends StatelessWidget { return BrandSwitch( value: isActive, - onChanged: (final value) => - jobsCubit.createOrRemoveServiceToggleJob( + onChanged: (final value) => jobsCubit.addJob( ServiceToggleJob( service: service, needToTurnOn: value,