diff --git a/lib/config/bloc_config.dart b/lib/config/bloc_config.dart index a6cf7202..b80dada7 100644 --- a/lib/config/bloc_config.dart +++ b/lib/config/bloc_config.dart @@ -31,7 +31,7 @@ class BlocAndProviderConfig extends StatelessWidget { final recoveryKeyCubit = RecoveryKeyCubit(serverInstallationCubit); final apiDevicesCubit = ApiDevicesCubit(serverInstallationCubit); final apiVolumesCubit = ApiProviderVolumeCubit(serverInstallationCubit); - final apiServerVolumesCubit = ApiServerVolumeCubit(serverInstallationCubit); + final apiServerVolumesCubit = ApiServerVolumeCubit(serverInstallationCubit, apiVolumesCubit); final serverJobsCubit = ServerJobsCubit(serverInstallationCubit); final serverDetailsCubit = ServerDetailsCubit(serverInstallationCubit); diff --git a/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart b/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart index a4df4469..d64a32c8 100644 --- a/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart +++ b/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart @@ -5,7 +5,7 @@ import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_pro import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart'; import 'package:selfprivacy/logic/models/hive/server_details.dart'; -import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart'; +import 'package:selfprivacy/logic/models/disk_status.dart'; part 'provider_volume_state.dart'; diff --git a/lib/logic/cubit/server_volumes/server_volume_cubit.dart b/lib/logic/cubit/server_volumes/server_volume_cubit.dart index 53b185c7..f13a4b07 100644 --- a/lib/logic/cubit/server_volumes/server_volume_cubit.dart +++ b/lib/logic/cubit/server_volumes/server_volume_cubit.dart @@ -1,14 +1,22 @@ +import 'dart:async'; + import 'package:selfprivacy/logic/api_maps/graphql_maps/server_api/server.dart'; import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart'; +import 'package:selfprivacy/logic/cubit/provider_volumes/provider_volume_cubit.dart'; +import 'package:selfprivacy/logic/models/disk_status.dart'; import 'package:selfprivacy/logic/models/json/server_disk_volume.dart'; part 'server_volume_state.dart'; class ApiServerVolumeCubit extends ServerInstallationDependendCubit { - ApiServerVolumeCubit(final ServerInstallationCubit serverInstallationCubit) - : super(serverInstallationCubit, const ApiServerVolumeState.initial()); + ApiServerVolumeCubit( + final ServerInstallationCubit serverInstallationCubit, this.providerVolumeCubit, + ) : super(serverInstallationCubit, ApiServerVolumeState.initial()) { + _providerVolumeSubscription = + providerVolumeCubit.stream.listen(checkProviderVolumes); + } final ServerApi serverApi = ServerApi(); @@ -19,6 +27,21 @@ class ApiServerVolumeCubit } } + late StreamSubscription _providerVolumeSubscription; + final ApiProviderVolumeCubit providerVolumeCubit; + + void checkProviderVolumes(final ApiProviderVolumeState state) { + emit( + ApiServerVolumeState( + this.state._volumes, + this.state.status, + this.state.usesBinds, + DiskStatus.fromVolumes(this.state._volumes, state.volumes), + ), + ); + return; + } + Future _refetch() async { final volumes = await serverApi.getServerDiskVolumes(); final usesBinds = await serverApi.isUsingBinds(); @@ -28,11 +51,27 @@ class ApiServerVolumeCubit status = LoadingStatus.success; } - emit(ApiServerVolumeState(volumes, status, usesBinds)); + emit( + ApiServerVolumeState( + volumes, + status, + usesBinds, + DiskStatus.fromVolumes( + volumes, + providerVolumeCubit.state.volumes, + ), + ), + ); } @override void clear() { - emit(const ApiServerVolumeState.initial()); + emit(ApiServerVolumeState.initial()); + } + + @override + Future close() { + _providerVolumeSubscription.cancel(); + return super.close(); } } diff --git a/lib/logic/cubit/server_volumes/server_volume_state.dart b/lib/logic/cubit/server_volumes/server_volume_state.dart index 3df43855..1764d7fc 100644 --- a/lib/logic/cubit/server_volumes/server_volume_state.dart +++ b/lib/logic/cubit/server_volumes/server_volume_state.dart @@ -5,26 +5,33 @@ class ApiServerVolumeState extends ServerInstallationDependendState { this._volumes, this.status, this.usesBinds, + this._diskStatus, ); - const ApiServerVolumeState.initial() - : this(const [], LoadingStatus.uninitialized, null); + ApiServerVolumeState.initial() + : this(const [], LoadingStatus.uninitialized, null, DiskStatus()); final List _volumes; + final DiskStatus _diskStatus; final bool? usesBinds; final LoadingStatus status; - List get volumes => _volumes; + List get volumes => _diskStatus.diskVolumes; + DiskStatus get diskStatus => _diskStatus; + + DiskVolume getVolume(final String volumeName) => volumes.firstWhere((final volume) => volume.name == volumeName, orElse: () => DiskVolume()); ApiServerVolumeState copyWith({ final List? volumes, final LoadingStatus? status, final bool? usesBinds, + final DiskStatus? diskStatus, }) => ApiServerVolumeState( volumes ?? _volumes, status ?? this.status, usesBinds ?? this.usesBinds, + diskStatus ?? _diskStatus, ); @override diff --git a/lib/ui/pages/server_storage/disk_status.dart b/lib/logic/models/disk_status.dart similarity index 100% rename from lib/ui/pages/server_storage/disk_status.dart rename to lib/logic/models/disk_status.dart diff --git a/lib/ui/pages/more/more.dart b/lib/ui/pages/more/more.dart index e2b78423..593abc28 100644 --- a/lib/ui/pages/more/more.dart +++ b/lib/ui/pages/more/more.dart @@ -2,7 +2,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:ionicons/ionicons.dart'; import 'package:selfprivacy/config/brand_theme.dart'; -import 'package:selfprivacy/logic/cubit/provider_volumes/provider_volume_cubit.dart'; import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart'; import 'package:selfprivacy/logic/cubit/server_volumes/server_volume_cubit.dart'; import 'package:selfprivacy/logic/cubit/services/services_cubit.dart'; @@ -12,7 +11,6 @@ import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart'; import 'package:selfprivacy/ui/pages/devices/devices.dart'; import 'package:selfprivacy/ui/pages/recovery_key/recovery_key.dart'; import 'package:selfprivacy/ui/pages/server_storage/data_migration.dart'; -import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart'; import 'package:selfprivacy/ui/pages/setup/initializing.dart'; import 'package:selfprivacy/ui/pages/onboarding/onboarding.dart'; import 'package:selfprivacy/ui/pages/root_route.dart'; @@ -53,10 +51,7 @@ class MorePage extends StatelessWidget { title: 'providers.storage.start_migration_button'.tr(), iconData: Icons.drive_file_move_outline, goTo: DataMigrationPage( - diskStatus: DiskStatus.fromVolumes( - context.read().state.volumes, - context.read().state.volumes, - ), + diskStatus: context.watch().state.diskStatus, services: context .read() .state diff --git a/lib/ui/pages/providers/providers.dart b/lib/ui/pages/providers/providers.dart index 6cc1495d..8b06751b 100644 --- a/lib/ui/pages/providers/providers.dart +++ b/lib/ui/pages/providers/providers.dart @@ -3,12 +3,9 @@ import 'package:flutter/material.dart'; import 'package:selfprivacy/config/brand_theme.dart'; import 'package:selfprivacy/logic/cubit/backups/backups_cubit.dart'; import 'package:selfprivacy/logic/cubit/dns_records/dns_records_cubit.dart'; -import 'package:selfprivacy/logic/cubit/provider_volumes/provider_volume_cubit.dart'; import 'package:selfprivacy/logic/cubit/providers/providers_cubit.dart'; import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart'; import 'package:selfprivacy/logic/cubit/server_volumes/server_volume_cubit.dart'; -import 'package:selfprivacy/logic/models/hive/server_details.dart'; -import 'package:selfprivacy/logic/models/json/server_disk_volume.dart'; import 'package:selfprivacy/ui/components/brand_header/brand_header.dart'; import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart'; import 'package:selfprivacy/ui/components/icon_status_mask/icon_status_mask.dart'; @@ -16,7 +13,6 @@ import 'package:selfprivacy/ui/components/not_ready_card/not_ready_card.dart'; import 'package:selfprivacy/ui/pages/backup_details/backup_details.dart'; import 'package:selfprivacy/ui/pages/dns_details/dns_details.dart'; import 'package:selfprivacy/ui/pages/server_details/server_details_screen.dart'; -import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart'; GlobalKey navigatorKey = GlobalKey(); @@ -38,11 +34,7 @@ class _ProvidersPageState extends State { final DnsRecordsStatus dnsStatus = context.watch().state.dnsState; - final List serverVolumes = - context.watch().state.volumes; - final List providerVolumes = - context.watch().state.volumes; - final diskStatus = DiskStatus.fromVolumes(serverVolumes, providerVolumes); + final diskStatus = context.watch().state.diskStatus; final ServerInstallationState appConfig = context.watch().state; diff --git a/lib/ui/pages/server_details/server_details_screen.dart b/lib/ui/pages/server_details/server_details_screen.dart index 5b839ef1..9d25e8ba 100644 --- a/lib/ui/pages/server_details/server_details_screen.dart +++ b/lib/ui/pages/server_details/server_details_screen.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:selfprivacy/config/brand_colors.dart'; import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/logic/cubit/hetzner_metrics/hetzner_metrics_cubit.dart'; -import 'package:selfprivacy/logic/cubit/provider_volumes/provider_volume_cubit.dart'; import 'package:selfprivacy/logic/cubit/server_detailed_info/server_detailed_info_cubit.dart'; import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart'; import 'package:selfprivacy/logic/cubit/server_volumes/server_volume_cubit.dart'; @@ -19,7 +18,6 @@ import 'package:selfprivacy/ui/components/brand_text/brand_text.dart'; import 'package:selfprivacy/ui/components/switch_block/switch_bloc.dart'; import 'package:selfprivacy/ui/pages/server_storage/storage_card.dart'; import 'package:selfprivacy/ui/pages/server_details/time_zone/lang.dart'; -import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart'; import 'package:selfprivacy/utils/extensions/duration.dart'; import 'package:selfprivacy/utils/named_font_weight.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart'; @@ -83,10 +81,7 @@ class _ServerDetailsScreenState extends State heroSubtitle: 'providers.server.bottom_sheet.1'.tr(), children: [ StorageCard( - diskStatus: DiskStatus.fromVolumes( - context.read().state.volumes, - context.read().state.volumes, - ), + diskStatus: context.watch().state.diskStatus, ), const Divider(height: 32), Text( diff --git a/lib/ui/pages/server_storage/data_migration.dart b/lib/ui/pages/server_storage/data_migration.dart index 67eca453..cf43bd9c 100644 --- a/lib/ui/pages/server_storage/data_migration.dart +++ b/lib/ui/pages/server_storage/data_migration.dart @@ -5,7 +5,7 @@ import 'package:selfprivacy/logic/models/service.dart'; import 'package:selfprivacy/ui/components/brand_button/filled_button.dart'; import 'package:selfprivacy/ui/components/brand_header/brand_header.dart'; import 'package:selfprivacy/ui/components/info_box/info_box.dart'; -import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart'; +import 'package:selfprivacy/logic/models/disk_status.dart'; import 'package:selfprivacy/ui/pages/server_storage/server_storage_list_item.dart'; import 'package:selfprivacy/ui/pages/server_storage/service_migration_list_item.dart'; diff --git a/lib/ui/pages/server_storage/extending_volume.dart b/lib/ui/pages/server_storage/extending_volume.dart index 02b1dba7..c0c48b2e 100644 --- a/lib/ui/pages/server_storage/extending_volume.dart +++ b/lib/ui/pages/server_storage/extending_volume.dart @@ -5,7 +5,7 @@ import 'package:selfprivacy/logic/cubit/provider_volumes/provider_volume_cubit.d import 'package:selfprivacy/logic/models/disk_size.dart'; import 'package:selfprivacy/ui/components/brand_button/filled_button.dart'; import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart'; -import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart'; +import 'package:selfprivacy/logic/models/disk_status.dart'; class ExtendingVolumePage extends StatefulWidget { const ExtendingVolumePage({ diff --git a/lib/ui/pages/server_storage/server_storage.dart b/lib/ui/pages/server_storage/server_storage.dart index 766440be..94a0532e 100644 --- a/lib/ui/pages/server_storage/server_storage.dart +++ b/lib/ui/pages/server_storage/server_storage.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart'; import 'package:selfprivacy/ui/components/brand_button/outlined_button.dart'; import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart'; -import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart'; +import 'package:selfprivacy/logic/models/disk_status.dart'; import 'package:selfprivacy/ui/pages/server_storage/extending_volume.dart'; import 'package:selfprivacy/ui/pages/server_storage/server_storage_list_item.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart'; diff --git a/lib/ui/pages/server_storage/server_storage_list_item.dart b/lib/ui/pages/server_storage/server_storage_list_item.dart index 3aad19b2..371769a8 100644 --- a/lib/ui/pages/server_storage/server_storage_list_item.dart +++ b/lib/ui/pages/server_storage/server_storage_list_item.dart @@ -1,7 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:selfprivacy/ui/components/brand_linear_indicator/brand_linear_indicator.dart'; -import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart'; +import 'package:selfprivacy/logic/models/disk_status.dart'; class ServerStorageListItem extends StatelessWidget { const ServerStorageListItem({ diff --git a/lib/ui/pages/server_storage/service_migration_list_item.dart b/lib/ui/pages/server_storage/service_migration_list_item.dart index ac6fc5bf..f6b59663 100644 --- a/lib/ui/pages/server_storage/service_migration_list_item.dart +++ b/lib/ui/pages/server_storage/service_migration_list_item.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:selfprivacy/logic/models/service.dart'; -import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart'; +import 'package:selfprivacy/logic/models/disk_status.dart'; class ServiceMigrationListItem extends StatelessWidget { const ServiceMigrationListItem({ diff --git a/lib/ui/pages/server_storage/storage_card.dart b/lib/ui/pages/server_storage/storage_card.dart index 210eec48..7bad8958 100644 --- a/lib/ui/pages/server_storage/storage_card.dart +++ b/lib/ui/pages/server_storage/storage_card.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart'; import 'package:selfprivacy/logic/cubit/providers/providers_cubit.dart'; import 'package:selfprivacy/ui/components/icon_status_mask/icon_status_mask.dart'; -import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart'; +import 'package:selfprivacy/logic/models/disk_status.dart'; import 'package:selfprivacy/ui/pages/server_storage/server_storage.dart'; import 'package:selfprivacy/ui/pages/server_storage/server_storage_list_item.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart'; diff --git a/lib/ui/pages/services/service_page.dart b/lib/ui/pages/services/service_page.dart index 2bdf8f72..dd5f8e86 100644 --- a/lib/ui/pages/services/service_page.dart +++ b/lib/ui/pages/services/service_page.dart @@ -117,6 +117,10 @@ class _ServicePageState extends State { 'services.service_page.move'.tr(), style: Theme.of(context).textTheme.titleMedium, ), + // subtitle: Text( + // 'Uses ${service.storageUsage.used} on ${context.read().state.totalStorage}', + // style: Theme.of(context).textTheme.bodyMedium, + // ), ), ], );