From 26607251d968a4c54fe71a7c29706477f29ebacc Mon Sep 17 00:00:00 2001 From: Kherel Date: Sun, 29 Aug 2021 17:02:51 +0200 Subject: [PATCH] update --- lib/logic/api_maps/server.dart | 9 +++- .../cubit/forms/user/user_form_cubit.dart | 2 +- lib/logic/cubit/jobs/jobs_cubit.dart | 26 +++++++++- lib/logic/cubit/services/services_state.dart | 17 +++++++ lib/logic/models/{jobs => }/job.dart | 10 ++-- .../components/jobs_content/jobs_content.dart | 6 +-- lib/ui/pages/services/services.dart | 50 +++++++++++++++++-- lib/ui/pages/users/users.dart | 2 +- 8 files changed, 105 insertions(+), 17 deletions(-) rename lib/logic/models/{jobs => }/job.dart (76%) diff --git a/lib/logic/api_maps/server.dart b/lib/logic/api_maps/server.dart index 0080981e..7c729789 100644 --- a/lib/logic/api_maps/server.dart +++ b/lib/logic/api_maps/server.dart @@ -90,8 +90,13 @@ class ServerApi extends ApiMap { close(client); return res; } -} + Future switchService(ServiceTypes type, bool needToTurnOn) async { + var client = await getClient(); + client.post('/services/${type.url}/${needToTurnOn ? 'enable' : 'disable'}'); + client.close(); + } +} extension UrlServerExt on ServiceTypes { String get url { @@ -116,4 +121,4 @@ extension UrlServerExt on ServiceTypes { throw Exception('wrong state'); } } -} \ No newline at end of file +} diff --git a/lib/logic/cubit/forms/user/user_form_cubit.dart b/lib/logic/cubit/forms/user/user_form_cubit.dart index 5501b38b..dd4d2bcf 100644 --- a/lib/logic/cubit/forms/user/user_form_cubit.dart +++ b/lib/logic/cubit/forms/user/user_form_cubit.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:cubit_form/cubit_form.dart'; import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart'; -import 'package:selfprivacy/logic/models/jobs/job.dart'; +import 'package:selfprivacy/logic/models/job.dart'; import 'package:selfprivacy/logic/models/user.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:selfprivacy/utils/password_generator.dart'; diff --git a/lib/logic/cubit/jobs/jobs_cubit.dart b/lib/logic/cubit/jobs/jobs_cubit.dart index 100d837b..19ad09de 100644 --- a/lib/logic/cubit/jobs/jobs_cubit.dart +++ b/lib/logic/cubit/jobs/jobs_cubit.dart @@ -4,7 +4,7 @@ import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/logic/api_maps/server.dart'; import 'package:selfprivacy/logic/cubit/services/services_cubit.dart'; import 'package:selfprivacy/logic/cubit/users/users_cubit.dart'; -import 'package:selfprivacy/logic/models/jobs/job.dart'; +import 'package:selfprivacy/logic/models/job.dart'; import 'package:equatable/equatable.dart'; import 'package:selfprivacy/logic/models/user.dart'; export 'package:provider/provider.dart'; @@ -40,6 +40,23 @@ class JobsCubit extends Cubit { emit(newState); } + void createOrRemove(ServiceToggleJob job) { + var newJobsList = []; + if (state is JobsStateWithJobs) { + newJobsList.addAll((state as JobsStateWithJobs).jobList); + } + var needToRemoveJob = + newJobsList.any((el) => el is ServiceToggleJob && el.type == job.type); + if (needToRemoveJob) { + var removingJob = newJobsList + .firstWhere(((el) => el is ServiceToggleJob && el.type == job.type)); + removeJob(removingJob.id); + } else { + newJobsList.add(job); + emit(JobsStateWithJobs(newJobsList)); + } + } + Future applyAll() async { if (state is JobsStateWithJobs) { var jobs = (state as JobsStateWithJobs).jobList; @@ -50,6 +67,13 @@ class JobsCubit extends Cubit { if (job is CreateUserJob) { newUsers.add(job.user); await api.createUser(job.user); + } else if (job is ServiceToggleJob) { + await api.switchService(job.type, job.needToTurnOn); + if (job.needToTurnOn) { + servicesCubit.turnOnist([job.type]); + } else { + servicesCubit.turnOffList([job.type]); + } } } diff --git a/lib/logic/cubit/services/services_state.dart b/lib/logic/cubit/services/services_state.dart index ff111e99..ed84ffa8 100644 --- a/lib/logic/cubit/services/services_state.dart +++ b/lib/logic/cubit/services/services_state.dart @@ -81,4 +81,21 @@ class ServicesState extends Equatable { isSocialNetworkEnable, isVpnEnable ]; + + bool isEnableByType(ServiceTypes type) { + switch (type) { + case ServiceTypes.passwordManager: + return isPasswordManagerEnable; + case ServiceTypes.cloud: + return isCloudEnable; + case ServiceTypes.socialNetwork: + return isSocialNetworkEnable; + case ServiceTypes.git: + return isGitEnable; + case ServiceTypes.vpn: + return isVpnEnable; + default: + throw Exception('wrong state'); + } + } } diff --git a/lib/logic/models/jobs/job.dart b/lib/logic/models/job.dart similarity index 76% rename from lib/logic/models/jobs/job.dart rename to lib/logic/models/job.dart index 69ae0b79..d1fb0193 100644 --- a/lib/logic/models/jobs/job.dart +++ b/lib/logic/models/job.dart @@ -4,7 +4,7 @@ import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/utils/password_generator.dart'; import 'package:easy_localization/easy_localization.dart'; -import '../user.dart'; +import 'user.dart'; @immutable class Job extends Equatable { @@ -28,18 +28,20 @@ class CreateUserJob extends Job { final User user; @override - List get props => [id, title]; + List get props => [id, title, user]; } class ServiceToggleJob extends Job { ServiceToggleJob({ required this.type, required this.needToTurnOn, - }) : super(title: '${needToTurnOn ? "jobs.serviceTurnOn".tr() : "jobs.serviceTurnOff".tr()} '); + }) : super( + title: + '${needToTurnOn ? "jobs.serviceTurnOn".tr() : "jobs.serviceTurnOff".tr()} ${type.title}'); final ServiceTypes type; final bool needToTurnOn; @override - List get props => [id, title]; + List get props => [id, title, type, needToTurnOn]; } diff --git a/lib/ui/components/jobs_content/jobs_content.dart b/lib/ui/components/jobs_content/jobs_content.dart index aa4b1c65..10879f0e 100644 --- a/lib/ui/components/jobs_content/jobs_content.dart +++ b/lib/ui/components/jobs_content/jobs_content.dart @@ -36,11 +36,7 @@ class JobsContent extends StatelessWidget { children: [ Expanded( child: BrandCards.small( - child: Row( - children: [ - BrandText.body1(j.title), - ], - ), + child: Text(j.title), ), ), SizedBox(width: 10), diff --git a/lib/ui/pages/services/services.dart b/lib/ui/pages/services/services.dart index 5f16a262..3a1de59b 100644 --- a/lib/ui/pages/services/services.dart +++ b/lib/ui/pages/services/services.dart @@ -4,10 +4,14 @@ import 'package:selfprivacy/config/brand_theme.dart'; import 'package:selfprivacy/config/text_themes.dart'; import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart'; +import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart'; +import 'package:selfprivacy/logic/cubit/services/services_cubit.dart'; +import 'package:selfprivacy/logic/models/job.dart'; import 'package:selfprivacy/logic/models/state_types.dart'; import 'package:selfprivacy/ui/components/brand_button/brand_button.dart'; import 'package:selfprivacy/ui/components/brand_cards/brand_cards.dart'; import 'package:selfprivacy/ui/components/brand_header/brand_header.dart'; +import 'package:selfprivacy/ui/components/brand_switch/brand_switch.dart'; import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; import 'package:selfprivacy/ui/components/icon_status_mask/icon_status_mask.dart'; import 'package:selfprivacy/ui/components/not_ready_card/not_ready_card.dart'; @@ -65,6 +69,11 @@ class _Card extends StatelessWidget { Widget build(BuildContext context) { var isReady = context.watch().state.isFullyInitilized; var changeTab = context.read().onPress; + + var serviceState = context.watch().state; + var jobsCubit = context.watch(); + var hasSwitcher = switchableServices.contains(serviceType); + return GestureDetector( onTap: isReady ? () => showDialog( @@ -87,9 +96,43 @@ class _Card extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - IconStatusMask( - status: isReady ? StateType.stable : StateType.uninitialized, - child: Icon(serviceType.icon, size: 30, color: Colors.white), + Row( + children: [ + IconStatusMask( + status: isReady ? StateType.stable : StateType.uninitialized, + child: Icon(serviceType.icon, size: 30, color: Colors.white), + ), + if (hasSwitcher) ...[ + Spacer(), + Builder( + builder: (context) { + late bool isActive; + var jobState = jobsCubit.state; + if (jobState is JobsStateWithJobs && + jobState.jobList.any((el) => + el is ServiceToggleJob && + el.type == serviceType)) { + isActive = (jobState.jobList.firstWhere((el) => + el is ServiceToggleJob && + el.type == serviceType) as ServiceToggleJob) + .needToTurnOn; + } else { + isActive = serviceState.isEnableByType(serviceType); + } + + return BrandSwitch( + value: isActive, + onChanged: (value) => jobsCubit.createOrRemove( + ServiceToggleJob( + type: serviceType, + needToTurnOn: value, + ), + ), + ); + }, + ), + ] + ], ), SizedBox(height: 10), BrandText.h2(serviceType.title), @@ -306,6 +349,7 @@ class _ServiceDetails extends StatelessWidget { 'services.vpn.bottom_sheet.1'.tr(), ); } + return Dialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), diff --git a/lib/ui/pages/users/users.dart b/lib/ui/pages/users/users.dart index da994ef9..3088116d 100644 --- a/lib/ui/pages/users/users.dart +++ b/lib/ui/pages/users/users.dart @@ -6,7 +6,7 @@ import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart'; import 'package:selfprivacy/logic/cubit/forms/user/user_form_cubit.dart'; import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart'; import 'package:selfprivacy/logic/cubit/users/users_cubit.dart'; -import 'package:selfprivacy/logic/models/jobs/job.dart'; +import 'package:selfprivacy/logic/models/job.dart'; import 'package:selfprivacy/logic/models/user.dart'; import 'package:selfprivacy/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart'; import 'package:selfprivacy/ui/components/brand_button/brand_button.dart';