pull/65/head
Kherel 2021-09-23 15:45:13 +02:00
parent 2e1b502699
commit 93754769fd
17 changed files with 302 additions and 207 deletions

View File

@ -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,

View File

@ -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',

View File

@ -105,6 +105,20 @@ class ServerApi extends ApiMap {
);
client.close();
}
Future<Map<ServiceTypes, bool>> 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 {

View File

@ -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<AppConfigState> {
AppConfigCubit(this.servicesCubit) : super(InitialAppConfigState());
AppConfigCubit() : super(AppConfigEmpty());
final repository = AppConfigRepository();
final ServicesCubit servicesCubit;
Future<void> 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<AppConfigState> {
}
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<AppConfigState> {
}
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<AppConfigState> {
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<AppConfigState> {
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<AppConfigState> {
void clearAppConfig() {
closeTimer();
servicesCubit.allOff();
repository.clearAppConfig();
emit(InitialAppConfigState());
emit(AppConfigEmpty());
}
Future<void> serverDelete() async {
closeTimer();
servicesCubit.allOff();
if (state.hetznerServer != null) {
await repository.deleteServer(state.cloudFlareDomain!);
await getIt<SSHModel>().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<AppConfigState> {
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,

View File

@ -22,22 +22,37 @@ class AppConfigRepository {
Box box = Hive.box(BNames.appConfig);
Future<AppConfigState> load() async {
var res = AppConfigState(
hetznerKey: getIt<ApiConfigModel>().hetznerKey,
cloudFlareKey: getIt<ApiConfigModel>().cloudFlareKey,
cloudFlareDomain: getIt<ApiConfigModel>().cloudFlareDomain,
backblazeCredential: getIt<ApiConfigModel>().backblazeCredential,
hetznerServer: getIt<ApiConfigModel>().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<ApiConfigModel>().hetznerKey!,
cloudFlareKey: getIt<ApiConfigModel>().cloudFlareKey!,
cloudFlareDomain: getIt<ApiConfigModel>().cloudFlareDomain!,
backblazeCredential: getIt<ApiConfigModel>().backblazeCredential!,
hetznerServer: getIt<ApiConfigModel>().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<ApiConfigModel>().hetznerKey,
cloudFlareKey: getIt<ApiConfigModel>().cloudFlareKey,
cloudFlareDomain: getIt<ApiConfigModel>().cloudFlareDomain,
backblazeCredential: getIt<ApiConfigModel>().backblazeCredential,
hetznerServer: getIt<ApiConfigModel>().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;
}

View File

@ -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<Object?> 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<Object?> get props => [
hetznerKey,
cloudFlareKey,
backblazeCredential,
cloudFlareDomain,
rootUser,
hetznerServer,
isServerStarted,
isServerResetedFirstTime,
];
}

View File

@ -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<T extends AppConfigDependendState>
extends Cubit<T> {
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<void> close() {
authCubitSubscription.cancel();
return super.close();
}
}

View File

@ -0,0 +1,5 @@
part of 'authentication_dependend_cubit.dart';
abstract class AppConfigDependendState extends Equatable {
const AppConfigDependendState();
}

View File

@ -73,17 +73,14 @@ class JobsCubit extends Cubit<JobsState> {
var jobs = (state as JobsStateWithJobs).jobList;
emit(JobsStateLoading());
var newUsers = <User>[];
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<SSHModel>().generateKeys();
@ -93,6 +90,9 @@ class JobsCubit extends Cubit<JobsState> {
usersCubit.addUsers(newUsers);
await api.apply();
if (hasServiceJobs) {
await servicesCubit.load();
}
emit(JobsStateEmpty());

View File

@ -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<ServicesState> {
ServicesCubit() : super(ServicesState.allOff());
class ServicesCubit extends AppConfigDependendCubit<ServicesState> {
ServicesCubit(AppConfigCubit appConfigCubit)
: super(appConfigCubit, ServicesState.allOff());
Box box = Hive.box(BNames.servicesState);
void load() {
final api = ServerApi();
Future<void> 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<ServiceTypes> list) {
for (final service in list) {
box.put(service.txt, false);
}
emit(state.disableList(list));
}
void turnOnist(List<ServiceTypes> list) {
for (final service in list) {
box.put(service.txt, true);
}
emit(state.enableList(list));
}
}

View File

@ -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,

View File

@ -40,7 +40,7 @@ class InitializingPage extends StatelessWidget {
][cubit.state.progress]();
return BlocListener<AppConfigCubit, AppConfigState>(
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;

View File

@ -36,7 +36,7 @@ class MorePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
var jobsCubit = context.watch<JobsCubit>();
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
var isReady = context.watch<AppConfigCubit>().state is AppConfigFinished;
return Scaffold(
appBar: PreferredSize(

View File

@ -28,7 +28,7 @@ class ProvidersPage extends StatefulWidget {
class _ProvidersPageState extends State<ProvidersPage> {
@override
Widget build(BuildContext context) {
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
var isReady = context.watch<AppConfigCubit>().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<AppConfigCubit>().state.isFullyInitilized;
var isReady = context.watch<AppConfigCubit>().state is AppConfigFinished;
AppConfigState appConfig = context.watch<AppConfigCubit>().state;
var domainName =

View File

@ -53,7 +53,7 @@ class _ServerDetailsState extends State<ServerDetails>
@override
Widget build(BuildContext context) {
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
var isReady = context.watch<AppConfigCubit>().state is AppConfigFinished;
var providerState = isReady ? StateType.stable : StateType.uninitialized;
return Scaffold(

View File

@ -41,7 +41,7 @@ class ServicesPage extends StatefulWidget {
class _ServicesPageState extends State<ServicesPage> {
@override
Widget build(BuildContext context) {
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
var isReady = context.watch<AppConfigCubit>().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<AppConfigCubit>().state.isFullyInitilized;
var isReady = context.watch<AppConfigCubit>().state is AppConfigFinished;
var changeTab = context.read<ChangeTab>().onPress;
var serviceState = context.watch<ServicesCubit>().state;

View File

@ -32,7 +32,7 @@ class UsersPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final usersCubitState = context.watch<UsersCubit>().state;
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
var isReady = context.watch<AppConfigCubit>().state is AppConfigFinished;
final users = usersCubitState.users;
final isEmpty = usersCubitState.isEmpty;
Widget child;