update
parent
2e1b502699
commit
93754769fd
|
@ -16,7 +16,8 @@ class BlocAndProviderConfig extends StatelessWidget {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var isDark = false;
|
var isDark = false;
|
||||||
var usersCubit = UsersCubit();
|
var usersCubit = UsersCubit();
|
||||||
var servicesCubit = ServicesCubit();
|
var appConfigCubit = AppConfigCubit()..load();
|
||||||
|
var servicesCubit = ServicesCubit(appConfigCubit);
|
||||||
return MultiProvider(
|
return MultiProvider(
|
||||||
providers: [
|
providers: [
|
||||||
BlocProvider(
|
BlocProvider(
|
||||||
|
@ -25,18 +26,13 @@ class BlocAndProviderConfig extends StatelessWidget {
|
||||||
isOnbordingShowing: true,
|
isOnbordingShowing: true,
|
||||||
)..load(),
|
)..load(),
|
||||||
),
|
),
|
||||||
BlocProvider(
|
BlocProvider(lazy: false, create: (_) => appConfigCubit),
|
||||||
lazy: false,
|
|
||||||
create: (_) => AppConfigCubit(servicesCubit)..load(),
|
|
||||||
),
|
|
||||||
BlocProvider(create: (_) => ProvidersCubit()),
|
BlocProvider(create: (_) => ProvidersCubit()),
|
||||||
BlocProvider(create: (_) => usersCubit..load(), lazy: false),
|
BlocProvider(create: (_) => usersCubit..load(), lazy: false),
|
||||||
BlocProvider(create: (_) => servicesCubit..load(), lazy: false),
|
BlocProvider(create: (_) => servicesCubit..load(), lazy: false),
|
||||||
BlocProvider(
|
BlocProvider(
|
||||||
create: (_) => JobsCubit(
|
create: (_) =>
|
||||||
usersCubit: usersCubit,
|
JobsCubit(usersCubit: usersCubit, servicesCubit: servicesCubit),
|
||||||
servicesCubit: servicesCubit,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
child: child,
|
child: child,
|
||||||
|
|
|
@ -94,7 +94,7 @@ class HetznerApi extends ApiMap {
|
||||||
/// check the branch name, it could be "development" or "master".
|
/// check the branch name, it could be "development" or "master".
|
||||||
|
|
||||||
var data = jsonDecode(
|
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(
|
Response serverCreateResponse = await client.post(
|
||||||
'/servers',
|
'/servers',
|
||||||
|
|
|
@ -105,6 +105,20 @@ class ServerApi extends ApiMap {
|
||||||
);
|
);
|
||||||
client.close();
|
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 {
|
extension UrlServerExt on ServiceTypes {
|
||||||
|
|
|
@ -3,7 +3,6 @@ import 'dart:async';
|
||||||
import 'package:bloc/bloc.dart';
|
import 'package:bloc/bloc.dart';
|
||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
import 'package:selfprivacy/config/get_it_config.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/get_it/ssh.dart';
|
||||||
import 'package:selfprivacy/logic/models/backblaze_credential.dart';
|
import 'package:selfprivacy/logic/models/backblaze_credential.dart';
|
||||||
import 'package:selfprivacy/logic/models/cloudflare_domain.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
|
/// c. if server is okay set that fully checked
|
||||||
|
|
||||||
class AppConfigCubit extends Cubit<AppConfigState> {
|
class AppConfigCubit extends Cubit<AppConfigState> {
|
||||||
AppConfigCubit(this.servicesCubit) : super(InitialAppConfigState());
|
AppConfigCubit() : super(AppConfigEmpty());
|
||||||
|
|
||||||
final repository = AppConfigRepository();
|
final repository = AppConfigRepository();
|
||||||
final ServicesCubit servicesCubit;
|
|
||||||
|
|
||||||
Future<void> load() async {
|
Future<void> load() async {
|
||||||
var state = await repository.load();
|
var state = await repository.load();
|
||||||
|
|
||||||
if (state.progress < 6 || state.isFullyInitilized) {
|
if (state is AppConfigFinished) {
|
||||||
emit(state);
|
emit(state);
|
||||||
} else if (state.progress == 6) {
|
} else if (state is AppConfigNotFinished) {
|
||||||
startServerIfDnsIsOkay(state: state, isImmediate: true);
|
if (state.progress == 6) {
|
||||||
} else if (state.progress == 7) {
|
startServerIfDnsIsOkay(state: state, isImmediate: true);
|
||||||
resetServerIfServerIsOkay(state: state, isImmediate: true);
|
} else if (state.progress == 7) {
|
||||||
} else if (state.progress == 8) {
|
resetServerIfServerIsOkay(state: state, isImmediate: true);
|
||||||
oneMoreReset(state: state, isImmediate: true);
|
} else if (state.progress == 8) {
|
||||||
} else if (state.progress == 9) {
|
oneMoreReset(state: state, isImmediate: true);
|
||||||
finishCheckIfServerIsOkay(state: state, isImmediate: true);
|
} else if (state.progress == 9) {
|
||||||
|
finishCheckIfServerIsOkay(state: state, isImmediate: true);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw 'wrong state';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void startServerIfDnsIsOkay({
|
void startServerIfDnsIsOkay({
|
||||||
AppConfigState? state,
|
AppConfigNotFinished? state,
|
||||||
bool isImmediate = false,
|
bool isImmediate = false,
|
||||||
}) async {
|
}) async {
|
||||||
state = state ?? this.state;
|
state = state ?? this.state as AppConfigNotFinished;
|
||||||
|
|
||||||
final work = () async {
|
final work = () async {
|
||||||
emit(TimerState(dataState: state!, isLoading: true));
|
emit(TimerState(dataState: state!, isLoading: true));
|
||||||
|
@ -116,10 +118,10 @@ class AppConfigCubit extends Cubit<AppConfigState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
void oneMoreReset({
|
void oneMoreReset({
|
||||||
AppConfigState? state,
|
AppConfigNotFinished? state,
|
||||||
bool isImmediate = false,
|
bool isImmediate = false,
|
||||||
}) async {
|
}) async {
|
||||||
var dataState = state ?? this.state;
|
var dataState = state ?? this.state as AppConfigNotFinished;
|
||||||
|
|
||||||
var work = () async {
|
var work = () async {
|
||||||
emit(TimerState(dataState: dataState, isLoading: true));
|
emit(TimerState(dataState: dataState, isLoading: true));
|
||||||
|
@ -169,10 +171,10 @@ class AppConfigCubit extends Cubit<AppConfigState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
void resetServerIfServerIsOkay({
|
void resetServerIfServerIsOkay({
|
||||||
AppConfigState? state,
|
AppConfigNotFinished? state,
|
||||||
bool isImmediate = false,
|
bool isImmediate = false,
|
||||||
}) async {
|
}) async {
|
||||||
var dataState = state ?? this.state;
|
var dataState = state ?? this.state as AppConfigNotFinished;
|
||||||
|
|
||||||
var work = () async {
|
var work = () async {
|
||||||
emit(TimerState(dataState: dataState, isLoading: true));
|
emit(TimerState(dataState: dataState, isLoading: true));
|
||||||
|
@ -224,10 +226,10 @@ class AppConfigCubit extends Cubit<AppConfigState> {
|
||||||
Timer? timer;
|
Timer? timer;
|
||||||
|
|
||||||
void finishCheckIfServerIsOkay({
|
void finishCheckIfServerIsOkay({
|
||||||
AppConfigState? state,
|
AppConfigNotFinished? state,
|
||||||
bool isImmediate = false,
|
bool isImmediate = false,
|
||||||
}) async {
|
}) async {
|
||||||
state = state ?? this.state;
|
state = state ?? this.state as AppConfigNotFinished;
|
||||||
|
|
||||||
var work = () async {
|
var work = () async {
|
||||||
emit(TimerState(dataState: state!, isLoading: true));
|
emit(TimerState(dataState: state!, isLoading: true));
|
||||||
|
@ -236,12 +238,8 @@ class AppConfigCubit extends Cubit<AppConfigState> {
|
||||||
|
|
||||||
if (isServerWorking) {
|
if (isServerWorking) {
|
||||||
await repository.saveHasFinalChecked(true);
|
await repository.saveHasFinalChecked(true);
|
||||||
servicesCubit.allOn();
|
|
||||||
|
|
||||||
emit(state.copyWith(
|
emit(state.finish());
|
||||||
hasFinalChecked: true,
|
|
||||||
isLoading: false,
|
|
||||||
));
|
|
||||||
} else {
|
} else {
|
||||||
finishCheckIfServerIsOkay();
|
finishCheckIfServerIsOkay();
|
||||||
}
|
}
|
||||||
|
@ -264,45 +262,31 @@ class AppConfigCubit extends Cubit<AppConfigState> {
|
||||||
|
|
||||||
void clearAppConfig() {
|
void clearAppConfig() {
|
||||||
closeTimer();
|
closeTimer();
|
||||||
servicesCubit.allOff();
|
|
||||||
|
|
||||||
repository.clearAppConfig();
|
repository.clearAppConfig();
|
||||||
emit(InitialAppConfigState());
|
emit(AppConfigEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> serverDelete() async {
|
Future<void> serverDelete() async {
|
||||||
closeTimer();
|
closeTimer();
|
||||||
servicesCubit.allOff();
|
|
||||||
|
|
||||||
if (state.hetznerServer != null) {
|
if (state.hetznerServer != null) {
|
||||||
await repository.deleteServer(state.cloudFlareDomain!);
|
await repository.deleteServer(state.cloudFlareDomain!);
|
||||||
await getIt<SSHModel>().clear();
|
await getIt<SSHModel>().clear();
|
||||||
}
|
}
|
||||||
await repository.deleteRecords();
|
await repository.deleteRecords();
|
||||||
emit(AppConfigState(
|
emit(AppConfigEmpty());
|
||||||
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,
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setHetznerKey(String hetznerKey) async {
|
void setHetznerKey(String hetznerKey) async {
|
||||||
await repository.saveHetznerKey(hetznerKey);
|
await repository.saveHetznerKey(hetznerKey);
|
||||||
emit(state.copyWith(hetznerKey: hetznerKey));
|
emit((state as AppConfigNotFinished).copyWith(hetznerKey: hetznerKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
void setCloudflareKey(String cloudFlareKey) async {
|
void setCloudflareKey(String cloudFlareKey) async {
|
||||||
await repository.saveCloudFlareKey(cloudFlareKey);
|
await repository.saveCloudFlareKey(cloudFlareKey);
|
||||||
emit(state.copyWith(cloudFlareKey: cloudFlareKey));
|
emit(
|
||||||
|
(state as AppConfigNotFinished).copyWith(cloudFlareKey: cloudFlareKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
void setBackblazeKey(String keyId, String applicationKey) async {
|
void setBackblazeKey(String keyId, String applicationKey) async {
|
||||||
|
@ -311,38 +295,41 @@ class AppConfigCubit extends Cubit<AppConfigState> {
|
||||||
applicationKey: applicationKey,
|
applicationKey: applicationKey,
|
||||||
);
|
);
|
||||||
await repository.saveBackblazeKey(backblazeCredential);
|
await repository.saveBackblazeKey(backblazeCredential);
|
||||||
emit(state.copyWith(backblazeCredential: backblazeCredential));
|
emit((state as AppConfigNotFinished)
|
||||||
|
.copyWith(backblazeCredential: backblazeCredential));
|
||||||
}
|
}
|
||||||
|
|
||||||
void setDomain(CloudFlareDomain cloudFlareDomain) async {
|
void setDomain(CloudFlareDomain cloudFlareDomain) async {
|
||||||
await repository.saveDomain(cloudFlareDomain);
|
await repository.saveDomain(cloudFlareDomain);
|
||||||
emit(state.copyWith(cloudFlareDomain: cloudFlareDomain));
|
emit((state as AppConfigNotFinished)
|
||||||
|
.copyWith(cloudFlareDomain: cloudFlareDomain));
|
||||||
}
|
}
|
||||||
|
|
||||||
void setRootUser(User rootUser) async {
|
void setRootUser(User rootUser) async {
|
||||||
await repository.saveRootUser(rootUser);
|
await repository.saveRootUser(rootUser);
|
||||||
emit(state.copyWith(rootUser: rootUser));
|
emit((state as AppConfigNotFinished).copyWith(rootUser: rootUser));
|
||||||
}
|
}
|
||||||
|
|
||||||
void createServerAndSetDnsRecords() async {
|
void createServerAndSetDnsRecords() async {
|
||||||
AppConfigState _stateCopy = state;
|
AppConfigNotFinished _stateCopy = state as AppConfigNotFinished;
|
||||||
var onSuccess = (HetznerServerDetails serverDetails) async {
|
var onSuccess = (HetznerServerDetails serverDetails) async {
|
||||||
await repository.createDnsRecords(
|
await repository.createDnsRecords(
|
||||||
serverDetails.ip4,
|
serverDetails.ip4,
|
||||||
state.cloudFlareDomain!,
|
state.cloudFlareDomain!,
|
||||||
);
|
);
|
||||||
|
|
||||||
emit(state.copyWith(
|
emit((state as AppConfigNotFinished).copyWith(
|
||||||
isLoading: false,
|
isLoading: false,
|
||||||
hetznerServer: serverDetails,
|
hetznerServer: serverDetails,
|
||||||
));
|
));
|
||||||
startServerIfDnsIsOkay();
|
startServerIfDnsIsOkay();
|
||||||
};
|
};
|
||||||
|
|
||||||
var onCancel = () => emit(state.copyWith(isLoading: false));
|
var onCancel =
|
||||||
|
() => emit((state as AppConfigNotFinished).copyWith(isLoading: false));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
emit(state.copyWith(isLoading: true));
|
emit((state as AppConfigNotFinished).copyWith(isLoading: true));
|
||||||
await repository.createServer(
|
await repository.createServer(
|
||||||
state.rootUser!,
|
state.rootUser!,
|
||||||
state.cloudFlareDomain!.domainName,
|
state.cloudFlareDomain!.domainName,
|
||||||
|
|
|
@ -22,22 +22,37 @@ class AppConfigRepository {
|
||||||
Box box = Hive.box(BNames.appConfig);
|
Box box = Hive.box(BNames.appConfig);
|
||||||
|
|
||||||
Future<AppConfigState> load() async {
|
Future<AppConfigState> load() async {
|
||||||
var res = AppConfigState(
|
late AppConfigState res;
|
||||||
hetznerKey: getIt<ApiConfigModel>().hetznerKey,
|
if (box.get(BNames.hasFinalChecked, defaultValue: false)) {
|
||||||
cloudFlareKey: getIt<ApiConfigModel>().cloudFlareKey,
|
res = AppConfigFinished(
|
||||||
cloudFlareDomain: getIt<ApiConfigModel>().cloudFlareDomain,
|
hetznerKey: getIt<ApiConfigModel>().hetznerKey!,
|
||||||
backblazeCredential: getIt<ApiConfigModel>().backblazeCredential,
|
cloudFlareKey: getIt<ApiConfigModel>().cloudFlareKey!,
|
||||||
hetznerServer: getIt<ApiConfigModel>().hetznerServer,
|
cloudFlareDomain: getIt<ApiConfigModel>().cloudFlareDomain!,
|
||||||
rootUser: box.get(BNames.rootUser),
|
backblazeCredential: getIt<ApiConfigModel>().backblazeCredential!,
|
||||||
isServerStarted: box.get(BNames.isServerStarted, defaultValue: false),
|
hetznerServer: getIt<ApiConfigModel>().hetznerServer!,
|
||||||
isServerResetedFirstTime:
|
rootUser: box.get(BNames.rootUser),
|
||||||
box.get(BNames.isServerResetedFirstTime, defaultValue: false),
|
isServerStarted: box.get(BNames.isServerStarted, defaultValue: false),
|
||||||
isServerResetedSecondTime:
|
isServerResetedFirstTime:
|
||||||
box.get(BNames.isServerResetedSecondTime, defaultValue: false),
|
box.get(BNames.isServerResetedFirstTime, defaultValue: false),
|
||||||
hasFinalChecked: box.get(BNames.hasFinalChecked, defaultValue: false),
|
isServerResetedSecondTime:
|
||||||
error: null,
|
box.get(BNames.isServerResetedSecondTime, defaultValue: false),
|
||||||
isLoading: box.get(BNames.isLoading, 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;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,9 +11,6 @@ class AppConfigState extends Equatable {
|
||||||
required this.isServerStarted,
|
required this.isServerStarted,
|
||||||
required this.isServerResetedFirstTime,
|
required this.isServerResetedFirstTime,
|
||||||
required this.isServerResetedSecondTime,
|
required this.isServerResetedSecondTime,
|
||||||
required this.hasFinalChecked,
|
|
||||||
required this.isLoading,
|
|
||||||
required this.error,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -26,9 +23,6 @@ class AppConfigState extends Equatable {
|
||||||
hetznerServer,
|
hetznerServer,
|
||||||
isServerStarted,
|
isServerStarted,
|
||||||
isServerResetedFirstTime,
|
isServerResetedFirstTime,
|
||||||
hasFinalChecked,
|
|
||||||
isLoading,
|
|
||||||
error,
|
|
||||||
];
|
];
|
||||||
|
|
||||||
final String? hetznerKey;
|
final String? hetznerKey;
|
||||||
|
@ -41,42 +35,6 @@ class AppConfigState extends Equatable {
|
||||||
final bool isServerResetedFirstTime;
|
final bool isServerResetedFirstTime;
|
||||||
final bool isServerResetedSecondTime;
|
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 isHetznerFilled => hetznerKey != null;
|
||||||
bool get isCloudFlareFilled => cloudFlareKey != null;
|
bool get isCloudFlareFilled => cloudFlareKey != null;
|
||||||
bool get isBackblazeFilled => backblazeCredential != null;
|
bool get isBackblazeFilled => backblazeCredential != null;
|
||||||
|
@ -84,8 +42,8 @@ class AppConfigState extends Equatable {
|
||||||
bool get isUserFilled => rootUser != null;
|
bool get isUserFilled => rootUser != null;
|
||||||
bool get isServerCreated => hetznerServer != null;
|
bool get isServerCreated => hetznerServer != null;
|
||||||
|
|
||||||
bool get isFullyInitilized => _fulfilementList.every((el) => el!);
|
// bool get isFullyInitilized => _fulfilementList.every((el) => el!);
|
||||||
int get progress => _fulfilementList.where((el) => el!).length ;
|
int get progress => _fulfilementList.where((el) => el!).length;
|
||||||
|
|
||||||
int get porgressBar {
|
int get porgressBar {
|
||||||
if (progress < 6) {
|
if (progress < 6) {
|
||||||
|
@ -108,32 +66,13 @@ class AppConfigState extends Equatable {
|
||||||
isServerStarted,
|
isServerStarted,
|
||||||
isServerResetedFirstTime,
|
isServerResetedFirstTime,
|
||||||
isServerResetedSecondTime,
|
isServerResetedSecondTime,
|
||||||
hasFinalChecked,
|
|
||||||
];
|
];
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class InitialAppConfigState extends AppConfigState {
|
class TimerState extends AppConfigNotFinished {
|
||||||
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 {
|
|
||||||
TimerState({
|
TimerState({
|
||||||
required this.dataState,
|
required this.dataState,
|
||||||
this.timerStart,
|
this.timerStart,
|
||||||
|
@ -149,12 +88,10 @@ class TimerState extends AppConfigState {
|
||||||
isServerStarted: dataState.isServerStarted,
|
isServerStarted: dataState.isServerStarted,
|
||||||
isServerResetedFirstTime: dataState.isServerResetedFirstTime,
|
isServerResetedFirstTime: dataState.isServerResetedFirstTime,
|
||||||
isServerResetedSecondTime: dataState.isServerResetedSecondTime,
|
isServerResetedSecondTime: dataState.isServerResetedSecondTime,
|
||||||
hasFinalChecked: dataState.hasFinalChecked,
|
|
||||||
isLoading: isLoading,
|
isLoading: isLoading,
|
||||||
error: dataState.error,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
final AppConfigState dataState;
|
final AppConfigNotFinished dataState;
|
||||||
final DateTime? timerStart;
|
final DateTime? timerStart;
|
||||||
final Duration? duration;
|
final Duration? duration;
|
||||||
|
|
||||||
|
@ -165,3 +102,134 @@ class TimerState extends AppConfigState {
|
||||||
duration,
|
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,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
part of 'authentication_dependend_cubit.dart';
|
||||||
|
|
||||||
|
abstract class AppConfigDependendState extends Equatable {
|
||||||
|
const AppConfigDependendState();
|
||||||
|
}
|
|
@ -73,17 +73,14 @@ class JobsCubit extends Cubit<JobsState> {
|
||||||
var jobs = (state as JobsStateWithJobs).jobList;
|
var jobs = (state as JobsStateWithJobs).jobList;
|
||||||
emit(JobsStateLoading());
|
emit(JobsStateLoading());
|
||||||
var newUsers = <User>[];
|
var newUsers = <User>[];
|
||||||
|
var hasServiceJobs = false;
|
||||||
for (var job in jobs) {
|
for (var job in jobs) {
|
||||||
if (job is CreateUserJob) {
|
if (job is CreateUserJob) {
|
||||||
newUsers.add(job.user);
|
newUsers.add(job.user);
|
||||||
await api.createUser(job.user);
|
await api.createUser(job.user);
|
||||||
} else if (job is ServiceToggleJob) {
|
} else if (job is ServiceToggleJob) {
|
||||||
|
hasServiceJobs = true;
|
||||||
await api.switchService(job.type, job.needToTurnOn);
|
await api.switchService(job.type, job.needToTurnOn);
|
||||||
if (job.needToTurnOn) {
|
|
||||||
servicesCubit.turnOnist([job.type]);
|
|
||||||
} else {
|
|
||||||
servicesCubit.turnOffList([job.type]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (job is CreateSSHKeyJob) {
|
if (job is CreateSSHKeyJob) {
|
||||||
await getIt<SSHModel>().generateKeys();
|
await getIt<SSHModel>().generateKeys();
|
||||||
|
@ -93,6 +90,9 @@ class JobsCubit extends Cubit<JobsState> {
|
||||||
|
|
||||||
usersCubit.addUsers(newUsers);
|
usersCubit.addUsers(newUsers);
|
||||||
await api.apply();
|
await api.apply();
|
||||||
|
if (hasServiceJobs) {
|
||||||
|
await servicesCubit.load();
|
||||||
|
}
|
||||||
|
|
||||||
emit(JobsStateEmpty());
|
emit(JobsStateEmpty());
|
||||||
|
|
||||||
|
|
|
@ -1,63 +1,34 @@
|
||||||
import 'package:bloc/bloc.dart';
|
|
||||||
import 'package:equatable/equatable.dart';
|
|
||||||
import 'package:hive/hive.dart';
|
import 'package:hive/hive.dart';
|
||||||
import 'package:selfprivacy/config/hive_config.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/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';
|
part 'services_state.dart';
|
||||||
|
|
||||||
class ServicesCubit extends Cubit<ServicesState> {
|
class ServicesCubit extends AppConfigDependendCubit<ServicesState> {
|
||||||
ServicesCubit() : super(ServicesState.allOff());
|
ServicesCubit(AppConfigCubit appConfigCubit)
|
||||||
|
: super(appConfigCubit, ServicesState.allOff());
|
||||||
|
|
||||||
Box box = Hive.box(BNames.servicesState);
|
Box box = Hive.box(BNames.servicesState);
|
||||||
|
final api = ServerApi();
|
||||||
void load() {
|
Future<void> load() async {
|
||||||
|
var statuses = await api.servicesPowerCheck();
|
||||||
emit(
|
emit(
|
||||||
ServicesState(
|
ServicesState(
|
||||||
isPasswordManagerEnable:
|
isPasswordManagerEnable: statuses[ServiceTypes.passwordManager]!,
|
||||||
box.get(ServiceTypes.passwordManager.txt, defaultValue: false),
|
isCloudEnable: statuses[ServiceTypes.cloud]!,
|
||||||
isCloudEnable: box.get(ServiceTypes.cloud.txt, defaultValue: false),
|
isGitEnable: statuses[ServiceTypes.git]!,
|
||||||
isGitEnable: box.get(ServiceTypes.git.txt, defaultValue: false),
|
isSocialNetworkEnable: statuses[ServiceTypes.socialNetwork]!,
|
||||||
isSocialNetworkEnable:
|
isVpnEnable: statuses[ServiceTypes.vpn]!,
|
||||||
box.get(ServiceTypes.socialNetwork.txt, defaultValue: false),
|
|
||||||
isVpnEnable: box.get(ServiceTypes.vpn.txt, defaultValue: false),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void allOn() {
|
@override
|
||||||
box.put(ServiceTypes.passwordManager.txt, true);
|
void clear() async {
|
||||||
box.put(ServiceTypes.cloud.txt, true);
|
box.clear();
|
||||||
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);
|
|
||||||
|
|
||||||
emit(ServicesState.allOff());
|
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));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
part of 'services_cubit.dart';
|
part of 'services_cubit.dart';
|
||||||
|
|
||||||
class ServicesState extends Equatable {
|
class ServicesState extends AppConfigDependendState {
|
||||||
const ServicesState({
|
const ServicesState({
|
||||||
required this.isPasswordManagerEnable,
|
required this.isPasswordManagerEnable,
|
||||||
required this.isCloudEnable,
|
required this.isCloudEnable,
|
||||||
|
|
|
@ -40,7 +40,7 @@ class InitializingPage extends StatelessWidget {
|
||||||
][cubit.state.progress]();
|
][cubit.state.progress]();
|
||||||
return BlocListener<AppConfigCubit, AppConfigState>(
|
return BlocListener<AppConfigCubit, AppConfigState>(
|
||||||
listener: (context, state) {
|
listener: (context, state) {
|
||||||
if (state.isFullyInitilized) {
|
if (cubit.state is AppConfigFinished) {
|
||||||
Navigator.of(context).pushReplacement(materialRoute(RootPage()));
|
Navigator.of(context).pushReplacement(materialRoute(RootPage()));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -80,7 +80,7 @@ class InitializingPage extends StatelessWidget {
|
||||||
child: Container(
|
child: Container(
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
child: BrandButton.text(
|
child: BrandButton.text(
|
||||||
title: cubit.state.isFullyInitilized
|
title: cubit.state is AppConfigFinished
|
||||||
? 'basis.close'.tr()
|
? 'basis.close'.tr()
|
||||||
: 'basis.later'.tr(),
|
: 'basis.later'.tr(),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
|
@ -411,7 +411,7 @@ class InitializingPage extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _stepServer(AppConfigCubit appConfigCubit) {
|
Widget _stepServer(AppConfigCubit appConfigCubit) {
|
||||||
var isLoading = appConfigCubit.state.isLoading;
|
var isLoading = (appConfigCubit.state as AppConfigNotFinished).isLoading;
|
||||||
return Builder(builder: (context) {
|
return Builder(builder: (context) {
|
||||||
return Column(
|
return Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
@ -438,7 +438,7 @@ class InitializingPage extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _stepCheck(AppConfigCubit appConfigCubit) {
|
Widget _stepCheck(AppConfigCubit appConfigCubit) {
|
||||||
assert(appConfigCubit.state is TimerState, 'wronge state');
|
assert(appConfigCubit.state is AppConfigNotFinished, 'wronge state');
|
||||||
var state = appConfigCubit.state as TimerState;
|
var state = appConfigCubit.state as TimerState;
|
||||||
late int doneCount;
|
late int doneCount;
|
||||||
late String? text;
|
late String? text;
|
||||||
|
|
|
@ -36,7 +36,7 @@ class MorePage extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var jobsCubit = context.watch<JobsCubit>();
|
var jobsCubit = context.watch<JobsCubit>();
|
||||||
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
|
var isReady = context.watch<AppConfigCubit>().state is AppConfigFinished;
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: PreferredSize(
|
appBar: PreferredSize(
|
||||||
|
|
|
@ -28,7 +28,7 @@ class ProvidersPage extends StatefulWidget {
|
||||||
class _ProvidersPageState extends State<ProvidersPage> {
|
class _ProvidersPageState extends State<ProvidersPage> {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
|
var isReady = context.watch<AppConfigCubit>().state is AppConfigFinished;
|
||||||
|
|
||||||
final cards = ProviderType.values
|
final cards = ProviderType.values
|
||||||
.map(
|
.map(
|
||||||
|
@ -75,7 +75,7 @@ class _Card extends StatelessWidget {
|
||||||
String? message;
|
String? message;
|
||||||
late String stableText;
|
late String stableText;
|
||||||
late VoidCallback onTap;
|
late VoidCallback onTap;
|
||||||
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
|
var isReady = context.watch<AppConfigCubit>().state is AppConfigFinished;
|
||||||
AppConfigState appConfig = context.watch<AppConfigCubit>().state;
|
AppConfigState appConfig = context.watch<AppConfigCubit>().state;
|
||||||
|
|
||||||
var domainName =
|
var domainName =
|
||||||
|
|
|
@ -53,7 +53,7 @@ class _ServerDetailsState extends State<ServerDetails>
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
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;
|
var providerState = isReady ? StateType.stable : StateType.uninitialized;
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
|
|
|
@ -41,7 +41,7 @@ class ServicesPage extends StatefulWidget {
|
||||||
class _ServicesPageState extends State<ServicesPage> {
|
class _ServicesPageState extends State<ServicesPage> {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var isReady = context.watch<AppConfigCubit>().state.isFullyInitilized;
|
var isReady = context.watch<AppConfigCubit>().state is AppConfigFinished;
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: PreferredSize(
|
appBar: PreferredSize(
|
||||||
|
@ -77,7 +77,7 @@ class _Card extends StatelessWidget {
|
||||||
final ServiceTypes serviceType;
|
final ServiceTypes serviceType;
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
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 changeTab = context.read<ChangeTab>().onPress;
|
||||||
|
|
||||||
var serviceState = context.watch<ServicesCubit>().state;
|
var serviceState = context.watch<ServicesCubit>().state;
|
||||||
|
|
|
@ -32,7 +32,7 @@ class UsersPage extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final usersCubitState = context.watch<UsersCubit>().state;
|
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 users = usersCubitState.users;
|
||||||
final isEmpty = usersCubitState.isEmpty;
|
final isEmpty = usersCubitState.isEmpty;
|
||||||
Widget child;
|
Widget child;
|
||||||
|
|
Loading…
Reference in New Issue