diff --git a/lib/config/bloc_config.dart b/lib/config/bloc_config.dart index bc59e531..00f066a3 100644 --- a/lib/config/bloc_config.dart +++ b/lib/config/bloc_config.dart @@ -16,7 +16,8 @@ class BlocAndProviderConfig extends StatelessWidget { Widget build(BuildContext context) { var isDark = false; var usersCubit = UsersCubit(); - var servicesCubit = ServicesCubit(); + var appConfigCubit = AppConfigCubit()..load(); + var servicesCubit = ServicesCubit(appConfigCubit); return MultiProvider( providers: [ BlocProvider( @@ -25,18 +26,13 @@ class BlocAndProviderConfig extends StatelessWidget { isOnbordingShowing: true, )..load(), ), - BlocProvider( - lazy: false, - create: (_) => AppConfigCubit(servicesCubit)..load(), - ), + BlocProvider(lazy: false, create: (_) => appConfigCubit), BlocProvider(create: (_) => ProvidersCubit()), BlocProvider(create: (_) => usersCubit..load(), lazy: false), BlocProvider(create: (_) => servicesCubit..load(), lazy: false), BlocProvider( - create: (_) => JobsCubit( - usersCubit: usersCubit, - servicesCubit: servicesCubit, - ), + create: (_) => + JobsCubit(usersCubit: usersCubit, servicesCubit: servicesCubit), ), ], child: child, diff --git a/lib/logic/api_maps/hetzner.dart b/lib/logic/api_maps/hetzner.dart index 2b714aad..89722e38 100644 --- a/lib/logic/api_maps/hetzner.dart +++ b/lib/logic/api_maps/hetzner.dart @@ -94,7 +94,7 @@ class HetznerApi extends ApiMap { /// check the branch name, it could be "development" or "master". var data = jsonDecode( - '''{"name":"$domainName","server_type":"cx11","start_after_create":false,"image":"ubuntu-20.04", "volumes":[$dbId], "networks":[], "user_data":"#cloud-config\\nruncmd:\\n- curl https://git.selfprivacy.org/ilchub/selfprivacy-nixos-infect/raw/branch/master/nixos-infect | PROVIDER=hetzner NIX_CHANNEL=nixos-21.05 DOMAIN=$domainName LUSER=${rootUser.login} PASSWORD=${rootUser.password} CF_TOKEN=$cloudFlareKey DB_PASSWORD=$dbPassword bash 2>&1 | tee /tmp/infect.log","labels":{},"automount":true, "location": "fsn1"}'''); + '''{"name":"$domainName","server_type":"cx11","start_after_create":false,"image":"ubuntu-20.04", "volumes":[$dbId], "networks":[], "user_data":"#cloud-config\\nruncmd:\\n- curl https://git.selfprivacy.org/ilchub/selfprivacy-nixos-infect/raw/branch/development/nixos-infect | PROVIDER=hetzner NIX_CHANNEL=nixos-21.05 DOMAIN=$domainName LUSER=${rootUser.login} PASSWORD=${rootUser.password} CF_TOKEN=$cloudFlareKey DB_PASSWORD=$dbPassword bash 2>&1 | tee /tmp/infect.log","labels":{},"automount":true, "location": "fsn1"}'''); Response serverCreateResponse = await client.post( '/servers', diff --git a/lib/logic/api_maps/server.dart b/lib/logic/api_maps/server.dart index 18807b90..668c1ac0 100644 --- a/lib/logic/api_maps/server.dart +++ b/lib/logic/api_maps/server.dart @@ -105,6 +105,20 @@ class ServerApi extends ApiMap { ); client.close(); } + + Future> servicesPowerCheck() async { + var client = await getClient(); + Response response = await client.get('/services/status'); + + close(client); + return { + ServiceTypes.passwordManager: response.data['bitwarden'] == 0, + ServiceTypes.git: response.data['gitea'] == 0, + ServiceTypes.cloud: response.data['nextcloud'] == 0, + ServiceTypes.vpn: response.data['ocserv'] == 0, + ServiceTypes.socialNetwork: response.data['pleroma'] == 0, + }; + } } extension UrlServerExt on ServiceTypes { diff --git a/lib/logic/cubit/app_config/app_config_cubit.dart b/lib/logic/cubit/app_config/app_config_cubit.dart index d73eb8b3..9bdf5471 100644 --- a/lib/logic/cubit/app_config/app_config_cubit.dart +++ b/lib/logic/cubit/app_config/app_config_cubit.dart @@ -3,7 +3,6 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:selfprivacy/config/get_it_config.dart'; -import 'package:selfprivacy/logic/cubit/services/services_cubit.dart'; import 'package:selfprivacy/logic/get_it/ssh.dart'; import 'package:selfprivacy/logic/models/backblaze_credential.dart'; import 'package:selfprivacy/logic/models/cloudflare_domain.dart'; @@ -46,32 +45,35 @@ part 'app_config_state.dart'; /// c. if server is okay set that fully checked class AppConfigCubit extends Cubit { - AppConfigCubit(this.servicesCubit) : super(InitialAppConfigState()); + AppConfigCubit() : super(AppConfigEmpty()); final repository = AppConfigRepository(); - final ServicesCubit servicesCubit; Future load() async { var state = await repository.load(); - if (state.progress < 6 || state.isFullyInitilized) { + if (state is AppConfigFinished) { emit(state); - } else if (state.progress == 6) { - startServerIfDnsIsOkay(state: state, isImmediate: true); - } else if (state.progress == 7) { - resetServerIfServerIsOkay(state: state, isImmediate: true); - } else if (state.progress == 8) { - oneMoreReset(state: state, isImmediate: true); - } else if (state.progress == 9) { - finishCheckIfServerIsOkay(state: state, isImmediate: true); + } else if (state is AppConfigNotFinished) { + if (state.progress == 6) { + startServerIfDnsIsOkay(state: state, isImmediate: true); + } else if (state.progress == 7) { + resetServerIfServerIsOkay(state: state, isImmediate: true); + } else if (state.progress == 8) { + oneMoreReset(state: state, isImmediate: true); + } else if (state.progress == 9) { + finishCheckIfServerIsOkay(state: state, isImmediate: true); + } + } else { + throw 'wrong state'; } } void startServerIfDnsIsOkay({ - AppConfigState? state, + AppConfigNotFinished? state, bool isImmediate = false, }) async { - state = state ?? this.state; + state = state ?? this.state as AppConfigNotFinished; final work = () async { emit(TimerState(dataState: state!, isLoading: true)); @@ -116,10 +118,10 @@ class AppConfigCubit extends Cubit { } void oneMoreReset({ - AppConfigState? state, + AppConfigNotFinished? state, bool isImmediate = false, }) async { - var dataState = state ?? this.state; + var dataState = state ?? this.state as AppConfigNotFinished; var work = () async { emit(TimerState(dataState: dataState, isLoading: true)); @@ -169,10 +171,10 @@ class AppConfigCubit extends Cubit { } void resetServerIfServerIsOkay({ - AppConfigState? state, + AppConfigNotFinished? state, bool isImmediate = false, }) async { - var dataState = state ?? this.state; + var dataState = state ?? this.state as AppConfigNotFinished; var work = () async { emit(TimerState(dataState: dataState, isLoading: true)); @@ -224,10 +226,10 @@ class AppConfigCubit extends Cubit { Timer? timer; void finishCheckIfServerIsOkay({ - AppConfigState? state, + AppConfigNotFinished? state, bool isImmediate = false, }) async { - state = state ?? this.state; + state = state ?? this.state as AppConfigNotFinished; var work = () async { emit(TimerState(dataState: state!, isLoading: true)); @@ -236,12 +238,8 @@ class AppConfigCubit extends Cubit { if (isServerWorking) { await repository.saveHasFinalChecked(true); - servicesCubit.allOn(); - emit(state.copyWith( - hasFinalChecked: true, - isLoading: false, - )); + emit(state.finish()); } else { finishCheckIfServerIsOkay(); } @@ -264,45 +262,31 @@ class AppConfigCubit extends Cubit { void clearAppConfig() { closeTimer(); - servicesCubit.allOff(); repository.clearAppConfig(); - emit(InitialAppConfigState()); + emit(AppConfigEmpty()); } Future serverDelete() async { closeTimer(); - servicesCubit.allOff(); if (state.hetznerServer != null) { await repository.deleteServer(state.cloudFlareDomain!); await getIt().clear(); } await repository.deleteRecords(); - emit(AppConfigState( - hetznerKey: state.hetznerKey, - cloudFlareKey: state.cloudFlareKey, - backblazeCredential: state.backblazeCredential, - cloudFlareDomain: state.cloudFlareDomain, - rootUser: state.rootUser, - hetznerServer: null, - isServerStarted: false, - isServerResetedFirstTime: false, - isServerResetedSecondTime: false, - hasFinalChecked: false, - isLoading: false, - error: null, - )); + emit(AppConfigEmpty()); } void setHetznerKey(String hetznerKey) async { await repository.saveHetznerKey(hetznerKey); - emit(state.copyWith(hetznerKey: hetznerKey)); + emit((state as AppConfigNotFinished).copyWith(hetznerKey: hetznerKey)); } void setCloudflareKey(String cloudFlareKey) async { await repository.saveCloudFlareKey(cloudFlareKey); - emit(state.copyWith(cloudFlareKey: cloudFlareKey)); + emit( + (state as AppConfigNotFinished).copyWith(cloudFlareKey: cloudFlareKey)); } void setBackblazeKey(String keyId, String applicationKey) async { @@ -311,38 +295,41 @@ class AppConfigCubit extends Cubit { applicationKey: applicationKey, ); await repository.saveBackblazeKey(backblazeCredential); - emit(state.copyWith(backblazeCredential: backblazeCredential)); + emit((state as AppConfigNotFinished) + .copyWith(backblazeCredential: backblazeCredential)); } void setDomain(CloudFlareDomain cloudFlareDomain) async { await repository.saveDomain(cloudFlareDomain); - emit(state.copyWith(cloudFlareDomain: cloudFlareDomain)); + emit((state as AppConfigNotFinished) + .copyWith(cloudFlareDomain: cloudFlareDomain)); } void setRootUser(User rootUser) async { await repository.saveRootUser(rootUser); - emit(state.copyWith(rootUser: rootUser)); + emit((state as AppConfigNotFinished).copyWith(rootUser: rootUser)); } void createServerAndSetDnsRecords() async { - AppConfigState _stateCopy = state; + AppConfigNotFinished _stateCopy = state as AppConfigNotFinished; var onSuccess = (HetznerServerDetails serverDetails) async { await repository.createDnsRecords( serverDetails.ip4, state.cloudFlareDomain!, ); - emit(state.copyWith( + emit((state as AppConfigNotFinished).copyWith( isLoading: false, hetznerServer: serverDetails, )); startServerIfDnsIsOkay(); }; - var onCancel = () => emit(state.copyWith(isLoading: false)); + var onCancel = + () => emit((state as AppConfigNotFinished).copyWith(isLoading: false)); try { - emit(state.copyWith(isLoading: true)); + emit((state as AppConfigNotFinished).copyWith(isLoading: true)); await repository.createServer( state.rootUser!, state.cloudFlareDomain!.domainName, diff --git a/lib/logic/cubit/app_config/app_config_repository.dart b/lib/logic/cubit/app_config/app_config_repository.dart index b2930001..6e8c3251 100644 --- a/lib/logic/cubit/app_config/app_config_repository.dart +++ b/lib/logic/cubit/app_config/app_config_repository.dart @@ -22,22 +22,37 @@ class AppConfigRepository { Box box = Hive.box(BNames.appConfig); Future load() async { - var res = AppConfigState( - hetznerKey: getIt().hetznerKey, - cloudFlareKey: getIt().cloudFlareKey, - cloudFlareDomain: getIt().cloudFlareDomain, - backblazeCredential: getIt().backblazeCredential, - hetznerServer: getIt().hetznerServer, - rootUser: box.get(BNames.rootUser), - isServerStarted: box.get(BNames.isServerStarted, defaultValue: false), - isServerResetedFirstTime: - box.get(BNames.isServerResetedFirstTime, defaultValue: false), - isServerResetedSecondTime: - box.get(BNames.isServerResetedSecondTime, defaultValue: false), - hasFinalChecked: box.get(BNames.hasFinalChecked, defaultValue: false), - error: null, - isLoading: box.get(BNames.isLoading, defaultValue: false), - ); + late AppConfigState res; + if (box.get(BNames.hasFinalChecked, defaultValue: false)) { + res = AppConfigFinished( + hetznerKey: getIt().hetznerKey!, + cloudFlareKey: getIt().cloudFlareKey!, + cloudFlareDomain: getIt().cloudFlareDomain!, + backblazeCredential: getIt().backblazeCredential!, + hetznerServer: getIt().hetznerServer!, + rootUser: box.get(BNames.rootUser), + isServerStarted: box.get(BNames.isServerStarted, defaultValue: false), + isServerResetedFirstTime: + box.get(BNames.isServerResetedFirstTime, defaultValue: false), + isServerResetedSecondTime: + box.get(BNames.isServerResetedSecondTime, defaultValue: false), + ); + } else { + res = AppConfigNotFinished( + hetznerKey: getIt().hetznerKey, + cloudFlareKey: getIt().cloudFlareKey, + cloudFlareDomain: getIt().cloudFlareDomain, + backblazeCredential: getIt().backblazeCredential, + hetznerServer: getIt().hetznerServer, + rootUser: box.get(BNames.rootUser), + isServerStarted: box.get(BNames.isServerStarted, defaultValue: false), + isServerResetedFirstTime: + box.get(BNames.isServerResetedFirstTime, defaultValue: false), + isServerResetedSecondTime: + box.get(BNames.isServerResetedSecondTime, defaultValue: false), + isLoading: box.get(BNames.isLoading, defaultValue: false), + ); + } return res; } diff --git a/lib/logic/cubit/app_config/app_config_state.dart b/lib/logic/cubit/app_config/app_config_state.dart index 1269f930..d5e4b621 100644 --- a/lib/logic/cubit/app_config/app_config_state.dart +++ b/lib/logic/cubit/app_config/app_config_state.dart @@ -11,9 +11,6 @@ class AppConfigState extends Equatable { required this.isServerStarted, required this.isServerResetedFirstTime, required this.isServerResetedSecondTime, - required this.hasFinalChecked, - required this.isLoading, - required this.error, }); @override @@ -26,9 +23,6 @@ class AppConfigState extends Equatable { hetznerServer, isServerStarted, isServerResetedFirstTime, - hasFinalChecked, - isLoading, - error, ]; final String? hetznerKey; @@ -41,42 +35,6 @@ class AppConfigState extends Equatable { final bool isServerResetedFirstTime; final bool isServerResetedSecondTime; - final bool hasFinalChecked; - - final bool isLoading; - final Exception? error; - - AppConfigState copyWith({ - String? hetznerKey, - String? cloudFlareKey, - BackblazeCredential? backblazeCredential, - CloudFlareDomain? cloudFlareDomain, - User? rootUser, - HetznerServerDetails? hetznerServer, - bool? isServerStarted, - bool? isServerResetedFirstTime, - bool? isServerResetedSecondTime, - bool? hasFinalChecked, - bool? isLoading, - Exception? error, - }) => - AppConfigState( - hetznerKey: hetznerKey ?? this.hetznerKey, - cloudFlareKey: cloudFlareKey ?? this.cloudFlareKey, - backblazeCredential: backblazeCredential ?? this.backblazeCredential, - cloudFlareDomain: cloudFlareDomain ?? this.cloudFlareDomain, - rootUser: rootUser ?? this.rootUser, - hetznerServer: hetznerServer ?? this.hetznerServer, - isServerStarted: isServerStarted ?? this.isServerStarted, - isServerResetedFirstTime: - isServerResetedFirstTime ?? this.isServerResetedFirstTime, - isServerResetedSecondTime: - isServerResetedSecondTime ?? this.isServerResetedSecondTime, - hasFinalChecked: hasFinalChecked ?? this.hasFinalChecked, - isLoading: isLoading ?? this.isLoading, - error: error ?? this.error, - ); - bool get isHetznerFilled => hetznerKey != null; bool get isCloudFlareFilled => cloudFlareKey != null; bool get isBackblazeFilled => backblazeCredential != null; @@ -84,8 +42,8 @@ class AppConfigState extends Equatable { bool get isUserFilled => rootUser != null; bool get isServerCreated => hetznerServer != null; - bool get isFullyInitilized => _fulfilementList.every((el) => el!); - int get progress => _fulfilementList.where((el) => el!).length ; + // bool get isFullyInitilized => _fulfilementList.every((el) => el!); + int get progress => _fulfilementList.where((el) => el!).length; int get porgressBar { if (progress < 6) { @@ -108,32 +66,13 @@ class AppConfigState extends Equatable { isServerStarted, isServerResetedFirstTime, isServerResetedSecondTime, - hasFinalChecked, ]; return res; } } -class InitialAppConfigState extends AppConfigState { - InitialAppConfigState() - : super( - hetznerKey: null, - cloudFlareKey: null, - backblazeCredential: null, - cloudFlareDomain: null, - rootUser: null, - hetznerServer: null, - isServerStarted: false, - isServerResetedFirstTime: false, - isServerResetedSecondTime: false, - hasFinalChecked: false, - isLoading: false, - error: null, - ); -} - -class TimerState extends AppConfigState { +class TimerState extends AppConfigNotFinished { TimerState({ required this.dataState, this.timerStart, @@ -149,12 +88,10 @@ class TimerState extends AppConfigState { isServerStarted: dataState.isServerStarted, isServerResetedFirstTime: dataState.isServerResetedFirstTime, isServerResetedSecondTime: dataState.isServerResetedSecondTime, - hasFinalChecked: dataState.hasFinalChecked, isLoading: isLoading, - error: dataState.error, ); - final AppConfigState dataState; + final AppConfigNotFinished dataState; final DateTime? timerStart; final Duration? duration; @@ -165,3 +102,134 @@ class TimerState extends AppConfigState { duration, ]; } + +class AppConfigNotFinished extends AppConfigState { + final bool isLoading; + + AppConfigNotFinished({ + String? hetznerKey, + String? cloudFlareKey, + BackblazeCredential? backblazeCredential, + CloudFlareDomain? cloudFlareDomain, + User? rootUser, + HetznerServerDetails? hetznerServer, + required bool isServerStarted, + required bool isServerResetedFirstTime, + required bool isServerResetedSecondTime, + required this.isLoading, + }) : super( + hetznerKey: hetznerKey, + cloudFlareKey: cloudFlareKey, + backblazeCredential: backblazeCredential, + cloudFlareDomain: cloudFlareDomain, + rootUser: rootUser, + hetznerServer: hetznerServer, + isServerStarted: isServerStarted, + isServerResetedFirstTime: isServerResetedFirstTime, + isServerResetedSecondTime: isServerResetedSecondTime, + ); + + @override + List get props => [ + hetznerKey, + cloudFlareKey, + backblazeCredential, + cloudFlareDomain, + rootUser, + hetznerServer, + isServerStarted, + isServerResetedFirstTime, + isLoading + ]; + + AppConfigNotFinished copyWith({ + String? hetznerKey, + String? cloudFlareKey, + BackblazeCredential? backblazeCredential, + CloudFlareDomain? cloudFlareDomain, + User? rootUser, + HetznerServerDetails? hetznerServer, + bool? isServerStarted, + bool? isServerResetedFirstTime, + bool? isServerResetedSecondTime, + bool? isLoading, + }) => + AppConfigNotFinished( + hetznerKey: hetznerKey ?? this.hetznerKey, + cloudFlareKey: cloudFlareKey ?? this.cloudFlareKey, + backblazeCredential: backblazeCredential ?? this.backblazeCredential, + cloudFlareDomain: cloudFlareDomain ?? this.cloudFlareDomain, + rootUser: rootUser ?? this.rootUser, + hetznerServer: hetznerServer ?? this.hetznerServer, + isServerStarted: isServerStarted ?? this.isServerStarted, + isServerResetedFirstTime: + isServerResetedFirstTime ?? this.isServerResetedFirstTime, + isServerResetedSecondTime: + isServerResetedSecondTime ?? this.isServerResetedSecondTime, + isLoading: isLoading ?? this.isLoading, + ); + + AppConfigFinished finish() => AppConfigFinished( + hetznerKey: hetznerKey!, + cloudFlareKey: cloudFlareKey!, + backblazeCredential: backblazeCredential!, + cloudFlareDomain: cloudFlareDomain!, + rootUser: rootUser!, + hetznerServer: hetznerServer!, + isServerStarted: isServerStarted, + isServerResetedFirstTime: isServerResetedFirstTime, + isServerResetedSecondTime: isServerResetedSecondTime, + ); +} + +class AppConfigEmpty extends AppConfigNotFinished { + AppConfigEmpty() + : super( + hetznerKey: null, + cloudFlareKey: null, + backblazeCredential: null, + cloudFlareDomain: null, + rootUser: null, + hetznerServer: null, + isServerStarted: false, + isServerResetedFirstTime: false, + isServerResetedSecondTime: false, + isLoading: false, + ); +} + +class AppConfigFinished extends AppConfigState { + const AppConfigFinished({ + required String hetznerKey, + required String cloudFlareKey, + required BackblazeCredential backblazeCredential, + required CloudFlareDomain cloudFlareDomain, + required User rootUser, + required HetznerServerDetails hetznerServer, + required bool isServerStarted, + required bool isServerResetedFirstTime, + required bool isServerResetedSecondTime, + }) : super( + hetznerKey: hetznerKey, + cloudFlareKey: cloudFlareKey, + backblazeCredential: backblazeCredential, + cloudFlareDomain: cloudFlareDomain, + rootUser: rootUser, + hetznerServer: hetznerServer, + isServerStarted: isServerStarted, + isServerResetedFirstTime: isServerResetedFirstTime, + isServerResetedSecondTime: isServerResetedSecondTime, + ); + + @override + List get props => [ + hetznerKey, + cloudFlareKey, + backblazeCredential, + cloudFlareDomain, + rootUser, + hetznerServer, + isServerStarted, + isServerResetedFirstTime, + ]; +} diff --git a/lib/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart b/lib/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart new file mode 100644 index 00000000..70d1af8f --- /dev/null +++ b/lib/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart @@ -0,0 +1,39 @@ +import 'dart:async'; +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart'; + +export 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart'; + +part 'authentication_dependend_state.dart'; + +abstract class AppConfigDependendCubit + extends Cubit { + AppConfigDependendCubit( + this.appConfigCubit, + T initState, + ) : super(initState) { + authCubitSubscription = appConfigCubit.stream.listen(checkAuthStatus); + checkAuthStatus(appConfigCubit.state); + } + + void checkAuthStatus(AppConfigState state) { + if (state is AppConfigFinished) { + load(); + } else if (state is AppConfigEmpty) { + clear(); + } + } + + late StreamSubscription authCubitSubscription; + final AppConfigCubit appConfigCubit; + + void load(); + void clear(); + + @override + Future close() { + authCubitSubscription.cancel(); + return super.close(); + } +} diff --git a/lib/logic/cubit/app_config_dependent/authentication_dependend_state.dart b/lib/logic/cubit/app_config_dependent/authentication_dependend_state.dart new file mode 100644 index 00000000..43339c85 --- /dev/null +++ b/lib/logic/cubit/app_config_dependent/authentication_dependend_state.dart @@ -0,0 +1,5 @@ +part of 'authentication_dependend_cubit.dart'; + +abstract class AppConfigDependendState extends Equatable { + const AppConfigDependendState(); +} diff --git a/lib/logic/cubit/jobs/jobs_cubit.dart b/lib/logic/cubit/jobs/jobs_cubit.dart index 3cf0a677..0a6c4a12 100644 --- a/lib/logic/cubit/jobs/jobs_cubit.dart +++ b/lib/logic/cubit/jobs/jobs_cubit.dart @@ -73,17 +73,14 @@ class JobsCubit extends Cubit { var jobs = (state as JobsStateWithJobs).jobList; emit(JobsStateLoading()); var newUsers = []; + var hasServiceJobs = false; for (var job in jobs) { if (job is CreateUserJob) { newUsers.add(job.user); await api.createUser(job.user); } else if (job is ServiceToggleJob) { + hasServiceJobs = true; await api.switchService(job.type, job.needToTurnOn); - if (job.needToTurnOn) { - servicesCubit.turnOnist([job.type]); - } else { - servicesCubit.turnOffList([job.type]); - } } if (job is CreateSSHKeyJob) { await getIt().generateKeys(); @@ -93,6 +90,9 @@ class JobsCubit extends Cubit { usersCubit.addUsers(newUsers); await api.apply(); + if (hasServiceJobs) { + await servicesCubit.load(); + } emit(JobsStateEmpty()); diff --git a/lib/logic/cubit/services/services_cubit.dart b/lib/logic/cubit/services/services_cubit.dart index c5fb6cf3..2fcf8559 100644 --- a/lib/logic/cubit/services/services_cubit.dart +++ b/lib/logic/cubit/services/services_cubit.dart @@ -1,63 +1,34 @@ -import 'package:bloc/bloc.dart'; -import 'package:equatable/equatable.dart'; import 'package:hive/hive.dart'; import 'package:selfprivacy/config/hive_config.dart'; +import 'package:selfprivacy/logic/api_maps/server.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/app_config_dependent/authentication_dependend_cubit.dart'; part 'services_state.dart'; -class ServicesCubit extends Cubit { - ServicesCubit() : super(ServicesState.allOff()); +class ServicesCubit extends AppConfigDependendCubit { + ServicesCubit(AppConfigCubit appConfigCubit) + : super(appConfigCubit, ServicesState.allOff()); Box box = Hive.box(BNames.servicesState); - - void load() { + final api = ServerApi(); + Future load() async { + var statuses = await api.servicesPowerCheck(); emit( ServicesState( - isPasswordManagerEnable: - box.get(ServiceTypes.passwordManager.txt, defaultValue: false), - isCloudEnable: box.get(ServiceTypes.cloud.txt, defaultValue: false), - isGitEnable: box.get(ServiceTypes.git.txt, defaultValue: false), - isSocialNetworkEnable: - box.get(ServiceTypes.socialNetwork.txt, defaultValue: false), - isVpnEnable: box.get(ServiceTypes.vpn.txt, defaultValue: false), + isPasswordManagerEnable: statuses[ServiceTypes.passwordManager]!, + isCloudEnable: statuses[ServiceTypes.cloud]!, + isGitEnable: statuses[ServiceTypes.git]!, + isSocialNetworkEnable: statuses[ServiceTypes.socialNetwork]!, + isVpnEnable: statuses[ServiceTypes.vpn]!, ), ); } - void allOn() { - box.put(ServiceTypes.passwordManager.txt, true); - box.put(ServiceTypes.cloud.txt, true); - box.put(ServiceTypes.git.txt, true); - box.put(ServiceTypes.socialNetwork.txt, true); - box.put(ServiceTypes.vpn.txt, true); - - emit(ServicesState.allOn()); - } - - void allOff() { - box.put(ServiceTypes.passwordManager.txt, false); - box.put(ServiceTypes.cloud.txt, false); - box.put(ServiceTypes.git.txt, false); - box.put(ServiceTypes.socialNetwork.txt, false); - box.put(ServiceTypes.vpn.txt, false); - + @override + void clear() async { + box.clear(); emit(ServicesState.allOff()); } - - void turnOffList(List list) { - for (final service in list) { - box.put(service.txt, false); - } - - emit(state.disableList(list)); - } - - void turnOnist(List list) { - for (final service in list) { - box.put(service.txt, true); - } - - emit(state.enableList(list)); - } } diff --git a/lib/logic/cubit/services/services_state.dart b/lib/logic/cubit/services/services_state.dart index a41b5a59..3595e6b1 100644 --- a/lib/logic/cubit/services/services_state.dart +++ b/lib/logic/cubit/services/services_state.dart @@ -1,6 +1,6 @@ part of 'services_cubit.dart'; -class ServicesState extends Equatable { +class ServicesState extends AppConfigDependendState { const ServicesState({ required this.isPasswordManagerEnable, required this.isCloudEnable, diff --git a/lib/ui/pages/initializing/initializing.dart b/lib/ui/pages/initializing/initializing.dart index 202d22f4..baee55af 100644 --- a/lib/ui/pages/initializing/initializing.dart +++ b/lib/ui/pages/initializing/initializing.dart @@ -40,7 +40,7 @@ class InitializingPage extends StatelessWidget { ][cubit.state.progress](); return BlocListener( listener: (context, state) { - if (state.isFullyInitilized) { + if (cubit.state is AppConfigFinished) { Navigator.of(context).pushReplacement(materialRoute(RootPage())); } }, @@ -80,7 +80,7 @@ class InitializingPage extends StatelessWidget { child: Container( alignment: Alignment.center, child: BrandButton.text( - title: cubit.state.isFullyInitilized + title: cubit.state is AppConfigFinished ? 'basis.close'.tr() : 'basis.later'.tr(), onPressed: () { @@ -411,7 +411,7 @@ class InitializingPage extends StatelessWidget { } Widget _stepServer(AppConfigCubit appConfigCubit) { - var isLoading = appConfigCubit.state.isLoading; + var isLoading = (appConfigCubit.state as AppConfigNotFinished).isLoading; return Builder(builder: (context) { return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -438,7 +438,7 @@ class InitializingPage extends StatelessWidget { } Widget _stepCheck(AppConfigCubit appConfigCubit) { - assert(appConfigCubit.state is TimerState, 'wronge state'); + assert(appConfigCubit.state is AppConfigNotFinished, 'wronge state'); var state = appConfigCubit.state as TimerState; late int doneCount; late String? text; diff --git a/lib/ui/pages/more/more.dart b/lib/ui/pages/more/more.dart index 2c008b88..e01fba11 100644 --- a/lib/ui/pages/more/more.dart +++ b/lib/ui/pages/more/more.dart @@ -36,7 +36,7 @@ class MorePage extends StatelessWidget { @override Widget build(BuildContext context) { var jobsCubit = context.watch(); - var isReady = context.watch().state.isFullyInitilized; + var isReady = context.watch().state is AppConfigFinished; return Scaffold( appBar: PreferredSize( diff --git a/lib/ui/pages/providers/providers.dart b/lib/ui/pages/providers/providers.dart index 5e7ec7a6..0378a853 100644 --- a/lib/ui/pages/providers/providers.dart +++ b/lib/ui/pages/providers/providers.dart @@ -28,7 +28,7 @@ class ProvidersPage extends StatefulWidget { class _ProvidersPageState extends State { @override Widget build(BuildContext context) { - var isReady = context.watch().state.isFullyInitilized; + var isReady = context.watch().state is AppConfigFinished; final cards = ProviderType.values .map( @@ -75,7 +75,7 @@ class _Card extends StatelessWidget { String? message; late String stableText; late VoidCallback onTap; - var isReady = context.watch().state.isFullyInitilized; + var isReady = context.watch().state is AppConfigFinished; AppConfigState appConfig = context.watch().state; var domainName = diff --git a/lib/ui/pages/server_details/server_details.dart b/lib/ui/pages/server_details/server_details.dart index 965e018b..6e3a895f 100644 --- a/lib/ui/pages/server_details/server_details.dart +++ b/lib/ui/pages/server_details/server_details.dart @@ -53,7 +53,7 @@ class _ServerDetailsState extends State @override Widget build(BuildContext context) { - var isReady = context.watch().state.isFullyInitilized; + var isReady = context.watch().state is AppConfigFinished; var providerState = isReady ? StateType.stable : StateType.uninitialized; return Scaffold( diff --git a/lib/ui/pages/services/services.dart b/lib/ui/pages/services/services.dart index 0ba92220..726955ee 100644 --- a/lib/ui/pages/services/services.dart +++ b/lib/ui/pages/services/services.dart @@ -41,7 +41,7 @@ class ServicesPage extends StatefulWidget { class _ServicesPageState extends State { @override Widget build(BuildContext context) { - var isReady = context.watch().state.isFullyInitilized; + var isReady = context.watch().state is AppConfigFinished; return Scaffold( appBar: PreferredSize( @@ -77,7 +77,7 @@ class _Card extends StatelessWidget { final ServiceTypes serviceType; @override Widget build(BuildContext context) { - var isReady = context.watch().state.isFullyInitilized; + var isReady = context.watch().state is AppConfigFinished; var changeTab = context.read().onPress; var serviceState = context.watch().state; diff --git a/lib/ui/pages/users/users.dart b/lib/ui/pages/users/users.dart index 3088116d..c0dd76cc 100644 --- a/lib/ui/pages/users/users.dart +++ b/lib/ui/pages/users/users.dart @@ -32,7 +32,7 @@ class UsersPage extends StatelessWidget { @override Widget build(BuildContext context) { final usersCubitState = context.watch().state; - var isReady = context.watch().state.isFullyInitilized; + var isReady = context.watch().state is AppConfigFinished; final users = usersCubitState.users; final isEmpty = usersCubitState.isEmpty; Widget child;