feat(backups): Allow to change snapshot rotation settings

pull/332/head
Inex Code 2023-09-09 21:13:27 +03:00
parent 90f84e8c9c
commit 1b26f2cf29
12 changed files with 1970 additions and 306 deletions

View File

@ -227,6 +227,64 @@
"explicit": "Created by your explicit request",
"pre_restore": "Created as a precaution before risky restore",
"unknown": "Unknown"
},
"rotation_quotas_title": "Snapshot rotation settings",
"set_rotation_quotas": "Set new rotation quotas",
"quotas_set": "New backup rotation quotas set",
"quota_titles": {
"last": "How many latest backups to keep",
"daily": "How many daily backups to keep",
"weekly": "How many weekly backups to keep",
"monthly": "How many monthly backups to keep",
"yearly": "How many yearly backups to keep"
},
"quota_subtitles": {
"no_effect": "This rule has no effect because another rule will keep more backups",
"last": {
"zero": "Rule is disabled",
"one": "Last {} backup will be kept regardless of its age",
"two": "Last {} backups will be kept regardless of their age",
"few": "Last {} backups will be kept regardless of their age",
"many": "Last {} backups will be kept regardless of their age",
"other": "Last {} backups will be kept regardless of their age"
},
"last_infinite": "All backups will be kept",
"daily": {
"zero": "Rule is disabled",
"one": "Last {} daily backup will be kept",
"two": "Last {} daily backups will be kept",
"few": "Last {} daily backups will be kept",
"many": "Last {} daily backups will be kept",
"other": "Last {} daily backups will be kept"
},
"daily_infinite": "All daily backups will be kept",
"weekly": {
"zero": "Rule is disabled",
"one": "Last {} weekly backup will be kept",
"two": "Last {} weekly backups will be kept",
"few": "Last {} weekly backups will be kept",
"many": "Last {} weekly backups will be kept",
"other": "Last {} weekly backups will be kept"
},
"weekly_infinite": "All weekly backups will be kept",
"monthly": {
"zero": "Rule is disabled",
"one": "Last {} monthly backup will be kept",
"two": "Last {} monthly backups will be kept",
"few": "Last {} monthly backups will be kept",
"many": "Last {} monthly backups will be kept",
"other": "Last {} monthly backups will be kept"
},
"monthly_infinite": "All monthly backups will be kept",
"yearly": {
"zero": "Rule is disabled",
"one": "Last {} yearly backup will be kept",
"two": "Last {} yearly backups will be kept",
"few": "Last {} yearly backups will be kept",
"many": "Last {} yearly backups will be kept",
"other": "Last {} yearly backups will be kept"
},
"yearly_infinite": "All yearly backups will be kept"
}
},
"storage": {

View File

@ -1,7 +1,7 @@
{
nixConfig.bash-prompt = "\[selfprivacy\]$ ";
inputs.nixpkgs.url = "nixpkgs/nixpkgs-unstable";
inputs.nixpkgs.url = "nixpkgs/nixos-unstable";
inputs.flake-utils.url = "github:numtide/flake-utils";
inputs.nixgl.url = "github:guibou/nixGL";
@ -9,19 +9,48 @@
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
config.allowUnfree = true;
config.android_sdk.accept_license = true;
system = "x86_64-linux";
overlays = [ nixgl.overlay ];
};
androidComposition = pkgs.androidenv.composeAndroidPackages {
toolsVersion = "26.1.1";
platformToolsVersion = "33.0.2";
buildToolsVersions = [ "30.0.3" ];
platformVersions = [ "31" "30" "29" ];
platformToolsVersion = "34.0.4";
buildToolsVersions = [ "34.0.0" ];
platformVersions = [ "34" "33" "32" "31" "30" ];
};
spAndroidStudio = pkgs.symlinkJoin {
name = "spAndroidStudio";
paths = with pkgs; [
android-studio
flutter.unwrapped
# dart
gnumake
check
pkg-config
glibc
android-tools
jdk
git
];
nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = ''
wrapProgram $out/bin/flutter \
--prefix ANDROID_SDK_ROOT=${androidComposition.androidsdk}/libexec/android-sdk \
--prefix ANDROID_HOME=${androidComposition.androidsdk}/libexec/android-sdk \
--prefix ANDROID_JAVA_HOME=${pkgs.jdk.home}
wrapProgram $out/bin/android-studio \
--prefix FLUTTER_SDK=${pkgs.flutter.unwrapped} \
--prefix ANDROID_SDKz_ROOT=${androidComposition.androidsdk}/libexec/android-sdk \
--prefix ANDROID_HOME=${androidComposition.androidsdk}/libexec/android-sdk \
--prefix ANDROID_JAVA_HOME=${pkgs.jdk.home}
'';
};
buildDeps = with pkgs; [
gtk3
glib
@ -62,23 +91,23 @@
openjdk11_headless
clang
];
releaseDerivation = pkgs.flutter.mkFlutterApp rec {
pname = "selfprivacy";
version = "0.6.0";
vendorHash = "sha256-7cbiAyIlaz3HqEsZN/nZxaLZjseJv5CmiIHqsoGa4ZI=";
nativeBuildInputs = [ pkgs.nixgl.auto.nixGLDefault ];
src = ./.;
desktopItem = pkgs.makeDesktopItem {
name = "${pname}";
exec = "@out@/bin/${pname}";
desktopName = "SelfPrivacy";
};
postInstall = ''
rm $out/bin/$pname
@ -86,7 +115,7 @@
patchShebangs $out/bin/$pname
chmod +x $out/bin/$pname
wrapProgram $out/bin/$pname --set PATH ${pkgs.lib.makeBinPath [ pkgs.xdg-user-dirs ]}
mkdir -p $out/share/applications
cp $desktopItem/share/applications/*.desktop $out/share/applications
substituteInPlace $out/share/applications/*.desktop --subst-var out

View File

@ -7,6 +7,13 @@ query BackupConfiguration {
locationId
locationName
provider
autobackupQuotas {
last
daily
weekly
monthly
yearly
}
}
}
}
@ -36,6 +43,13 @@ fragment genericBackupConfigReturn on GenericBackupConfigReturn {
autobackupPeriod
locationName
locationId
autobackupQuotas {
last
daily
weekly
monthly
yearly
}
}
}
@ -66,6 +80,14 @@ mutation SetAutobackupPeriod($period: Int = null) {
}
}
mutation setAutobackupQuotas($quotas: AutobackupQuotasInput!) {
backup {
setAutobackupQuotas(quotas: $quotas) {
...genericBackupConfigReturn
}
}
}
mutation RemoveRepository {
backup {
removeRepository {

File diff suppressed because it is too large Load Diff

View File

@ -143,6 +143,51 @@ mixin BackupsApi on GraphQLApiMap {
return result;
}
Future<GenericResult> setAutobackupQuotas(
final AutobackupQuotas quotas,
) async {
QueryResult<Mutation$setAutobackupQuotas> response;
GenericResult? result;
try {
final GraphQLClient client = await getClient();
final variables = Variables$Mutation$setAutobackupQuotas(
quotas: Input$AutobackupQuotasInput(
last: quotas.last,
daily: quotas.daily,
weekly: quotas.weekly,
monthly: quotas.monthly,
yearly: quotas.yearly,
),
);
final options =
Options$Mutation$setAutobackupQuotas(variables: variables);
response = await client.mutate$setAutobackupQuotas(options);
if (response.hasException) {
final message = response.exception.toString();
print(message);
result = GenericResult(
success: false,
data: null,
message: message,
);
}
result = GenericResult(
success: true,
data: null,
);
} catch (e) {
print(e);
result = GenericResult(
success: false,
data: null,
message: e.toString(),
);
}
return result;
}
Future<GenericResult> removeRepository() async {
try {
final GraphQLClient client = await getClient();

View File

@ -36,6 +36,7 @@ class BackupsCubit extends ServerInstallationDependendCubit<BackupsState> {
backblazeBucket: bucket,
isInitialized: backupConfig?.isInitialized,
autobackupPeriod: backupConfig?.autobackupPeriod ?? Duration.zero,
autobackupQuotas: backupConfig?.autobackupQuotas,
backups: backups,
preventActions: false,
refreshing: false,
@ -168,6 +169,7 @@ class BackupsCubit extends ServerInstallationDependendCubit<BackupsState> {
refreshing: false,
isInitialized: backupConfig?.isInitialized ?? false,
autobackupPeriod: backupConfig?.autobackupPeriod,
autobackupQuotas: backupConfig?.autobackupQuotas,
),
);
if (useTimer) {
@ -227,6 +229,25 @@ class BackupsCubit extends ServerInstallationDependendCubit<BackupsState> {
await updateBackups();
}
Future<void> setAutobackupQuotas(final AutobackupQuotas quotas) async {
emit(state.copyWith(preventActions: true));
final result = await api.setAutobackupQuotas(quotas);
if (result.success == false) {
getIt<NavigationService>()
.showSnackBar(result.message ?? 'Unknown error');
emit(state.copyWith(preventActions: false));
} else {
getIt<NavigationService>().showSnackBar('backup.quotas_set'.tr());
emit(
state.copyWith(
preventActions: false,
autobackupQuotas: quotas,
),
);
}
await updateBackups();
}
Future<void> forgetSnapshot(final String snapshotId) async {
final result = await api.forgetSnapshot(snapshotId);
if (!result.success) {

View File

@ -9,6 +9,7 @@ class BackupsState extends ServerInstallationDependendState {
this.refreshing = true,
this.autobackupPeriod,
this.backblazeBucket,
this.autobackupQuotas,
});
final bool isInitialized;
@ -18,6 +19,7 @@ class BackupsState extends ServerInstallationDependendState {
final bool refreshing;
final Duration? autobackupPeriod;
final BackblazeBucket? backblazeBucket;
final AutobackupQuotas? autobackupQuotas;
List<Backup> serviceBackups(final String serviceId) => backups
.where((final backup) => backup.serviceId == serviceId)
@ -40,6 +42,7 @@ class BackupsState extends ServerInstallationDependendState {
final bool? refreshing,
final Duration? autobackupPeriod,
final BackblazeBucket? backblazeBucket,
final AutobackupQuotas? autobackupQuotas,
}) =>
BackupsState(
isInitialized: isInitialized ?? this.isInitialized,
@ -53,5 +56,6 @@ class BackupsState extends ServerInstallationDependendState {
? null
: autobackupPeriod ?? this.autobackupPeriod,
backblazeBucket: backblazeBucket ?? this.backblazeBucket,
autobackupQuotas: autobackupQuotas ?? this.autobackupQuotas,
);
}

View File

@ -53,6 +53,9 @@ class BackupConfiguration {
locationId: configuration.locationId,
locationName: configuration.locationName,
provider: BackupsProviderType.fromGraphQL(configuration.provider),
autobackupQuotas: AutobackupQuotas.fromGraphQL(
configuration.autobackupQuotas,
),
);
BackupConfiguration({
@ -62,6 +65,7 @@ class BackupConfiguration {
required this.locationId,
required this.locationName,
required this.provider,
required this.autobackupQuotas,
});
final Duration? autobackupPeriod;
@ -70,6 +74,49 @@ class BackupConfiguration {
final String? locationId;
final String? locationName;
final BackupsProviderType provider;
final AutobackupQuotas autobackupQuotas;
}
class AutobackupQuotas {
AutobackupQuotas.fromGraphQL(
final Query$BackupConfiguration$backup$configuration$autobackupQuotas
autobackupQuotas,
) : this(
last: autobackupQuotas.last,
daily: autobackupQuotas.daily,
weekly: autobackupQuotas.weekly,
monthly: autobackupQuotas.monthly,
yearly: autobackupQuotas.yearly,
);
AutobackupQuotas({
required this.last,
required this.daily,
required this.weekly,
required this.monthly,
required this.yearly,
});
final int last;
final int daily;
final int weekly;
final int monthly;
final int yearly;
AutobackupQuotas copyWith({
final int? last,
final int? daily,
final int? weekly,
final int? monthly,
final int? yearly,
}) =>
AutobackupQuotas(
last: last ?? this.last,
daily: daily ?? this.daily,
weekly: weekly ?? this.weekly,
monthly: monthly ?? this.monthly,
yearly: yearly ?? this.yearly,
);
}
enum BackupRestoreStrategy {

View File

@ -16,6 +16,7 @@ import 'package:selfprivacy/ui/layouts/brand_hero_screen.dart';
import 'package:selfprivacy/ui/components/brand_icons/brand_icons.dart';
import 'package:selfprivacy/ui/helpers/modals.dart';
import 'package:selfprivacy/ui/pages/backups/change_period_modal.dart';
import 'package:selfprivacy/ui/pages/backups/change_rotation_quotas_modal.dart';
import 'package:selfprivacy/ui/pages/backups/copy_encryption_key_modal.dart';
import 'package:selfprivacy/ui/pages/backups/create_backups_modal.dart';
import 'package:selfprivacy/ui/pages/backups/snapshot_modal.dart';
@ -168,6 +169,38 @@ class BackupDetailsPage extends StatelessWidget {
: 'backup.autobackup_period_never'.tr(),
),
),
ListTile(
onTap: preventActions
? null
: () {
showModalBottomSheet(
useRootNavigator: true,
context: context,
isScrollControlled: true,
builder: (final BuildContext context) =>
DraggableScrollableSheet(
expand: false,
maxChildSize: 0.9,
minChildSize: 0.4,
initialChildSize: 0.6,
builder: (final context, final scrollController) =>
ChangeRotationQuotasModal(
scrollController: scrollController,
),
),
);
},
leading: Icon(
Icons.auto_delete_outlined,
color: overrideColor,
),
title: Text(
'backup.rotation_quotas_title'.tr(),
style: TextStyle(
color: overrideColor,
),
),
),
ListTile(
onTap: preventActions
? null

View File

@ -0,0 +1,244 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart';
import 'package:selfprivacy/logic/cubit/backups/backups_cubit.dart';
import 'package:selfprivacy/logic/cubit/server_jobs/server_jobs_cubit.dart';
import 'package:selfprivacy/logic/models/backup.dart';
class ChangeRotationQuotasModal extends StatefulWidget {
const ChangeRotationQuotasModal({
required this.scrollController,
super.key,
});
final ScrollController scrollController;
@override
State<ChangeRotationQuotasModal> createState() =>
_ChangeRotationQuotasModalState();
}
enum QuotaUnits {
last,
daily,
weekly,
monthly,
yearly,
}
class _ChangeRotationQuotasModalState extends State<ChangeRotationQuotasModal> {
AutobackupQuotas selectedQuotas = AutobackupQuotas(
last: 3,
daily: 7,
weekly: 4,
monthly: 6,
yearly: -1,
);
// Set initial period to the one currently set
@override
void initState() {
super.initState();
selectedQuotas =
context.read<BackupsCubit>().state.autobackupQuotas ?? selectedQuotas;
}
String generateSubtitle(final int value, final QuotaUnits unit) {
switch (unit) {
case QuotaUnits.last:
return value == -1
? 'backup.quota_subtitles.last_infinite'.tr()
: 'backup.quota_subtitles.last'.plural(value);
case QuotaUnits.daily:
if (selectedQuotas.last == -1) {
return 'backup.quota_subtitles.no_effect'.tr();
}
return value == -1
? 'backup.quota_subtitles.daily_infinite'.tr()
: 'backup.quota_subtitles.daily'.plural(value);
case QuotaUnits.weekly:
if (selectedQuotas.last == -1 || selectedQuotas.daily == -1) {
return 'backup.quota_subtitles.no_effect'.tr();
}
return value == -1
? 'backup.quota_subtitles.weekly_infinite'.tr()
: 'backup.quota_subtitles.weekly'.plural(value);
case QuotaUnits.monthly:
if (selectedQuotas.last == -1 || selectedQuotas.daily == -1) {
return 'backup.quota_subtitles.no_effect'.tr();
}
return value == -1
? 'backup.quota_subtitles.monthly_infinite'.tr()
: 'backup.quota_subtitles.monthly'.plural(value);
case QuotaUnits.yearly:
if (selectedQuotas.last == -1 || selectedQuotas.daily == -1) {
return 'backup.quota_subtitles.no_effect'.tr();
}
return value == -1
? 'backup.quota_subtitles.yearly_infinite'.tr()
: 'backup.quota_subtitles.yearly'.plural(value);
}
}
@override
Widget build(final BuildContext context) {
final AutobackupQuotas? initialAutobackupQuotas =
context.watch<BackupsCubit>().state.autobackupQuotas;
return ListView(
controller: widget.scrollController,
padding: const EdgeInsets.all(16),
children: [
const SizedBox(height: 16),
Text(
'backup.rotation_quotas_title'.tr(),
style: Theme.of(context).textTheme.headlineSmall,
textAlign: TextAlign.center,
),
const SizedBox(height: 16),
// Accordions for each quota type. When tapped allows to enter a new int value
// for the quota.
QuotaSelectionTile(
title: 'backup.quota_titles.last'.tr(),
subtitle: generateSubtitle(selectedQuotas.last, QuotaUnits.last),
value: selectedQuotas.last,
min: 1,
max: 30,
callback: (final double value) {
setState(() {
if (value == 31) {
selectedQuotas = selectedQuotas.copyWith(last: -1);
return;
}
selectedQuotas = selectedQuotas.copyWith(last: value.toInt());
});
},
),
QuotaSelectionTile(
title: 'backup.quota_titles.daily'.tr(),
subtitle: generateSubtitle(selectedQuotas.daily, QuotaUnits.daily),
value: selectedQuotas.daily,
min: 0,
max: 30,
callback: (final double value) {
setState(() {
if (value == 31) {
selectedQuotas = selectedQuotas.copyWith(daily: -1);
return;
}
selectedQuotas = selectedQuotas.copyWith(daily: value.toInt());
});
},
),
QuotaSelectionTile(
title: 'backup.quota_titles.weekly'.tr(),
subtitle: generateSubtitle(selectedQuotas.weekly, QuotaUnits.weekly),
value: selectedQuotas.weekly,
min: 0,
max: 15,
callback: (final double value) {
setState(() {
if (value == 16) {
selectedQuotas = selectedQuotas.copyWith(weekly: -1);
return;
}
selectedQuotas = selectedQuotas.copyWith(weekly: value.toInt());
});
},
),
QuotaSelectionTile(
title: 'backup.quota_titles.monthly'.tr(),
subtitle:
generateSubtitle(selectedQuotas.monthly, QuotaUnits.monthly),
value: selectedQuotas.monthly,
min: 0,
max: 24,
callback: (final double value) {
setState(() {
if (value == 25) {
selectedQuotas = selectedQuotas.copyWith(monthly: -1);
return;
}
selectedQuotas = selectedQuotas.copyWith(monthly: value.toInt());
});
},
),
QuotaSelectionTile(
title: 'backup.quota_titles.yearly'.tr(),
subtitle: generateSubtitle(selectedQuotas.yearly, QuotaUnits.yearly),
value: selectedQuotas.yearly,
min: 0,
max: 5,
callback: (final double value) {
setState(() {
if (value == 6) {
selectedQuotas = selectedQuotas.copyWith(yearly: -1);
return;
}
selectedQuotas = selectedQuotas.copyWith(yearly: value.toInt());
});
},
),
const SizedBox(height: 16),
FilledButton(
onPressed: selectedQuotas == initialAutobackupQuotas
? null
: () {
context
.read<BackupsCubit>()
.setAutobackupQuotas(selectedQuotas);
Navigator.of(context).pop();
},
child: Text(
'backup.set_rotation_quotas'.tr(),
),
),
],
);
}
}
class QuotaSelectionTile extends StatelessWidget {
const QuotaSelectionTile({
required this.title,
required this.subtitle,
required this.value,
required this.min,
required this.max,
required this.callback,
super.key,
});
final String title;
final String subtitle;
final int value;
final int min;
final int max;
final void Function(double) callback;
@override
Widget build(final BuildContext context) => ExpansionTile(
title: Text(title),
subtitle: Text(subtitle),
trailing: Text(
value == -1 ? '' : value.toString(),
style: Theme.of(context).textTheme.headlineMedium,
),
children: [
// Discrete slider to select the new value
if (value >= -1 && value <= max)
Slider(
value: value == -1 ? max + 1 : value.toDouble(),
min: min.toDouble(),
max: (max + 1).toDouble(),
divisions: max - min + 1,
label: value == -1 ? '' : value.toString(),
onChanged: callback,
),
if (value < -1 || value > max)
Text(
'Manually set to $value',
style: Theme.of(context).textTheme.headlineSmall,
),
],
);
}

View File

@ -320,7 +320,7 @@ class InitializingPage extends StatelessWidget {
Widget _stepDomain(final ServerInstallationCubit initializingCubit) =>
BlocProvider(
create: (final context) => DomainSetupCubit(initializingCubit)..load(),
child: DomainPicker(),
child: const DomainPicker(),
);
Widget _stepUser(final ServerInstallationCubit initializingCubit) =>

View File

@ -15,18 +15,6 @@ abstract class _$RootRouter extends RootStackRouter {
@override
final Map<String, PageFactory> pagesMap = {
OnboardingRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const OnboardingPage(),
);
},
BackupDetailsRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const BackupDetailsPage(),
);
},
BackupsListRoute.name: (routeData) {
final args = routeData.argsAs<BackupsListRouteArgs>();
return AutoRoutePage<dynamic>(
@ -37,10 +25,58 @@ abstract class _$RootRouter extends RootStackRouter {
),
);
},
RecoveryKeyRoute.name: (routeData) {
BackupDetailsRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const RecoveryKeyPage(),
child: const BackupDetailsPage(),
);
},
DevicesRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const DevicesScreen(),
);
},
DnsDetailsRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const DnsDetailsPage(),
);
},
AboutApplicationRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const AboutApplicationPage(),
);
},
AppSettingsRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const AppSettingsPage(),
);
},
DeveloperSettingsRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const DeveloperSettingsPage(),
);
},
ConsoleRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const ConsolePage(),
);
},
MoreRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const MorePage(),
);
},
OnboardingRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const OnboardingPage(),
);
},
ProvidersRoute.name: (routeData) {
@ -49,6 +85,18 @@ abstract class _$RootRouter extends RootStackRouter {
child: const ProvidersPage(),
);
},
RecoveryKeyRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const RecoveryKeyPage(),
);
},
RootRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: WrappedRoute(child: const RootPage()),
);
},
ServerDetailsRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
@ -67,17 +115,6 @@ abstract class _$RootRouter extends RootStackRouter {
),
);
},
ExtendingVolumeRoute.name: (routeData) {
final args = routeData.argsAs<ExtendingVolumeRouteArgs>();
return AutoRoutePage<dynamic>(
routeData: routeData,
child: ExtendingVolumePage(
diskVolumeToResize: args.diskVolumeToResize,
diskStatus: args.diskStatus,
key: args.key,
),
);
},
ServerStorageRoute.name: (routeData) {
final args = routeData.argsAs<ServerStorageRouteArgs>();
return AutoRoutePage<dynamic>(
@ -88,52 +125,15 @@ abstract class _$RootRouter extends RootStackRouter {
),
);
},
DevicesRoute.name: (routeData) {
ExtendingVolumeRoute.name: (routeData) {
final args = routeData.argsAs<ExtendingVolumeRouteArgs>();
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const DevicesScreen(),
);
},
RootRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: WrappedRoute(child: const RootPage()),
);
},
AboutApplicationRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const AboutApplicationPage(),
);
},
ConsoleRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const ConsolePage(),
);
},
MoreRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const MorePage(),
);
},
AppSettingsRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const AppSettingsPage(),
);
},
DeveloperSettingsRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const DeveloperSettingsPage(),
);
},
DnsDetailsRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const DnsDetailsPage(),
child: ExtendingVolumePage(
diskVolumeToResize: args.diskVolumeToResize,
diskStatus: args.diskStatus,
key: args.key,
),
);
},
ServiceRoute.name: (routeData) {
@ -152,6 +152,18 @@ abstract class _$RootRouter extends RootStackRouter {
child: const ServicesPage(),
);
},
InitializingRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const InitializingPage(),
);
},
RecoveryRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const RecoveryRouting(),
);
},
UsersRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
@ -174,49 +186,9 @@ abstract class _$RootRouter extends RootStackRouter {
),
);
},
InitializingRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const InitializingPage(),
);
},
RecoveryRoute.name: (routeData) {
return AutoRoutePage<dynamic>(
routeData: routeData,
child: const RecoveryRouting(),
);
},
};
}
/// generated route for
/// [OnboardingPage]
class OnboardingRoute extends PageRouteInfo<void> {
const OnboardingRoute({List<PageRouteInfo>? children})
: super(
OnboardingRoute.name,
initialChildren: children,
);
static const String name = 'OnboardingRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [BackupDetailsPage]
class BackupDetailsRoute extends PageRouteInfo<void> {
const BackupDetailsRoute({List<PageRouteInfo>? children})
: super(
BackupDetailsRoute.name,
initialChildren: children,
);
static const String name = 'BackupDetailsRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [BackupsListPage]
class BackupsListRoute extends PageRouteInfo<BackupsListRouteArgs> {
@ -256,15 +228,127 @@ class BackupsListRouteArgs {
}
/// generated route for
/// [RecoveryKeyPage]
class RecoveryKeyRoute extends PageRouteInfo<void> {
const RecoveryKeyRoute({List<PageRouteInfo>? children})
/// [BackupDetailsPage]
class BackupDetailsRoute extends PageRouteInfo<void> {
const BackupDetailsRoute({List<PageRouteInfo>? children})
: super(
RecoveryKeyRoute.name,
BackupDetailsRoute.name,
initialChildren: children,
);
static const String name = 'RecoveryKeyRoute';
static const String name = 'BackupDetailsRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [DevicesScreen]
class DevicesRoute extends PageRouteInfo<void> {
const DevicesRoute({List<PageRouteInfo>? children})
: super(
DevicesRoute.name,
initialChildren: children,
);
static const String name = 'DevicesRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [DnsDetailsPage]
class DnsDetailsRoute extends PageRouteInfo<void> {
const DnsDetailsRoute({List<PageRouteInfo>? children})
: super(
DnsDetailsRoute.name,
initialChildren: children,
);
static const String name = 'DnsDetailsRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [AboutApplicationPage]
class AboutApplicationRoute extends PageRouteInfo<void> {
const AboutApplicationRoute({List<PageRouteInfo>? children})
: super(
AboutApplicationRoute.name,
initialChildren: children,
);
static const String name = 'AboutApplicationRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [AppSettingsPage]
class AppSettingsRoute extends PageRouteInfo<void> {
const AppSettingsRoute({List<PageRouteInfo>? children})
: super(
AppSettingsRoute.name,
initialChildren: children,
);
static const String name = 'AppSettingsRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [DeveloperSettingsPage]
class DeveloperSettingsRoute extends PageRouteInfo<void> {
const DeveloperSettingsRoute({List<PageRouteInfo>? children})
: super(
DeveloperSettingsRoute.name,
initialChildren: children,
);
static const String name = 'DeveloperSettingsRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [ConsolePage]
class ConsoleRoute extends PageRouteInfo<void> {
const ConsoleRoute({List<PageRouteInfo>? children})
: super(
ConsoleRoute.name,
initialChildren: children,
);
static const String name = 'ConsoleRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [MorePage]
class MoreRoute extends PageRouteInfo<void> {
const MoreRoute({List<PageRouteInfo>? children})
: super(
MoreRoute.name,
initialChildren: children,
);
static const String name = 'MoreRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [OnboardingPage]
class OnboardingRoute extends PageRouteInfo<void> {
const OnboardingRoute({List<PageRouteInfo>? children})
: super(
OnboardingRoute.name,
initialChildren: children,
);
static const String name = 'OnboardingRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
@ -283,6 +367,34 @@ class ProvidersRoute extends PageRouteInfo<void> {
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [RecoveryKeyPage]
class RecoveryKeyRoute extends PageRouteInfo<void> {
const RecoveryKeyRoute({List<PageRouteInfo>? children})
: super(
RecoveryKeyRoute.name,
initialChildren: children,
);
static const String name = 'RecoveryKeyRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [RootPage]
class RootRoute extends PageRouteInfo<void> {
const RootRoute({List<PageRouteInfo>? children})
: super(
RootRoute.name,
initialChildren: children,
);
static const String name = 'RootRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [ServerDetailsScreen]
class ServerDetailsRoute extends PageRouteInfo<void> {
@ -345,6 +457,44 @@ class ServicesMigrationRouteArgs {
}
}
/// generated route for
/// [ServerStoragePage]
class ServerStorageRoute extends PageRouteInfo<ServerStorageRouteArgs> {
ServerStorageRoute({
required DiskStatus diskStatus,
Key? key,
List<PageRouteInfo>? children,
}) : super(
ServerStorageRoute.name,
args: ServerStorageRouteArgs(
diskStatus: diskStatus,
key: key,
),
initialChildren: children,
);
static const String name = 'ServerStorageRoute';
static const PageInfo<ServerStorageRouteArgs> page =
PageInfo<ServerStorageRouteArgs>(name);
}
class ServerStorageRouteArgs {
const ServerStorageRouteArgs({
required this.diskStatus,
this.key,
});
final DiskStatus diskStatus;
final Key? key;
@override
String toString() {
return 'ServerStorageRouteArgs{diskStatus: $diskStatus, key: $key}';
}
}
/// generated route for
/// [ExtendingVolumePage]
class ExtendingVolumeRoute extends PageRouteInfo<ExtendingVolumeRouteArgs> {
@ -388,156 +538,6 @@ class ExtendingVolumeRouteArgs {
}
}
/// generated route for
/// [ServerStoragePage]
class ServerStorageRoute extends PageRouteInfo<ServerStorageRouteArgs> {
ServerStorageRoute({
required DiskStatus diskStatus,
Key? key,
List<PageRouteInfo>? children,
}) : super(
ServerStorageRoute.name,
args: ServerStorageRouteArgs(
diskStatus: diskStatus,
key: key,
),
initialChildren: children,
);
static const String name = 'ServerStorageRoute';
static const PageInfo<ServerStorageRouteArgs> page =
PageInfo<ServerStorageRouteArgs>(name);
}
class ServerStorageRouteArgs {
const ServerStorageRouteArgs({
required this.diskStatus,
this.key,
});
final DiskStatus diskStatus;
final Key? key;
@override
String toString() {
return 'ServerStorageRouteArgs{diskStatus: $diskStatus, key: $key}';
}
}
/// generated route for
/// [DevicesScreen]
class DevicesRoute extends PageRouteInfo<void> {
const DevicesRoute({List<PageRouteInfo>? children})
: super(
DevicesRoute.name,
initialChildren: children,
);
static const String name = 'DevicesRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [RootPage]
class RootRoute extends PageRouteInfo<void> {
const RootRoute({List<PageRouteInfo>? children})
: super(
RootRoute.name,
initialChildren: children,
);
static const String name = 'RootRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [AboutApplicationPage]
class AboutApplicationRoute extends PageRouteInfo<void> {
const AboutApplicationRoute({List<PageRouteInfo>? children})
: super(
AboutApplicationRoute.name,
initialChildren: children,
);
static const String name = 'AboutApplicationRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [ConsolePage]
class ConsoleRoute extends PageRouteInfo<void> {
const ConsoleRoute({List<PageRouteInfo>? children})
: super(
ConsoleRoute.name,
initialChildren: children,
);
static const String name = 'ConsoleRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [MorePage]
class MoreRoute extends PageRouteInfo<void> {
const MoreRoute({List<PageRouteInfo>? children})
: super(
MoreRoute.name,
initialChildren: children,
);
static const String name = 'MoreRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [AppSettingsPage]
class AppSettingsRoute extends PageRouteInfo<void> {
const AppSettingsRoute({List<PageRouteInfo>? children})
: super(
AppSettingsRoute.name,
initialChildren: children,
);
static const String name = 'AppSettingsRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [DeveloperSettingsPage]
class DeveloperSettingsRoute extends PageRouteInfo<void> {
const DeveloperSettingsRoute({List<PageRouteInfo>? children})
: super(
DeveloperSettingsRoute.name,
initialChildren: children,
);
static const String name = 'DeveloperSettingsRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [DnsDetailsPage]
class DnsDetailsRoute extends PageRouteInfo<void> {
const DnsDetailsRoute({List<PageRouteInfo>? children})
: super(
DnsDetailsRoute.name,
initialChildren: children,
);
static const String name = 'DnsDetailsRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [ServicePage]
class ServiceRoute extends PageRouteInfo<ServiceRouteArgs> {
@ -590,6 +590,34 @@ class ServicesRoute extends PageRouteInfo<void> {
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [InitializingPage]
class InitializingRoute extends PageRouteInfo<void> {
const InitializingRoute({List<PageRouteInfo>? children})
: super(
InitializingRoute.name,
initialChildren: children,
);
static const String name = 'InitializingRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [RecoveryRouting]
class RecoveryRoute extends PageRouteInfo<void> {
const RecoveryRoute({List<PageRouteInfo>? children})
: super(
RecoveryRoute.name,
initialChildren: children,
);
static const String name = 'RecoveryRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [UsersPage]
class UsersRoute extends PageRouteInfo<void> {
@ -655,31 +683,3 @@ class UserDetailsRouteArgs {
return 'UserDetailsRouteArgs{login: $login, key: $key}';
}
}
/// generated route for
/// [InitializingPage]
class InitializingRoute extends PageRouteInfo<void> {
const InitializingRoute({List<PageRouteInfo>? children})
: super(
InitializingRoute.name,
initialChildren: children,
);
static const String name = 'InitializingRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}
/// generated route for
/// [RecoveryRouting]
class RecoveryRoute extends PageRouteInfo<void> {
const RecoveryRoute({List<PageRouteInfo>? children})
: super(
RecoveryRoute.name,
initialChildren: children,
);
static const String name = 'RecoveryRoute';
static const PageInfo<void> page = PageInfo<void>(name);
}