Skip to content

Commit

Permalink
Add backup page UI
Browse files Browse the repository at this point in the history
  • Loading branch information
SIKV committed Feb 9, 2024
1 parent abe89e8 commit 323c515
Show file tree
Hide file tree
Showing 9 changed files with 119 additions and 24 deletions.
3 changes: 3 additions & 0 deletions lib/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:moneymanager/feature/account/add_account_page.dart';
import 'package:moneymanager/feature/account_settings/account_settings_page.dart';
import 'package:moneymanager/feature/backup/backup_page.dart';
import 'package:moneymanager/feature/categories/categories_page.dart';
import 'package:moneymanager/feature/change_theme/change_theme_page.dart';
import 'package:moneymanager/feature/search/search_page.dart';
Expand Down Expand Up @@ -70,6 +71,8 @@ class App extends ConsumerWidget {
return MaterialPageRoute(builder: (_) => CalculatorPage(
args: settings.arguments as CalculatorPageArgs,
));
case AppRoutes.backup:
return MaterialPageRoute(builder: (_) => const BackupPage());
}
assert(false, '${settings.name} route is not implemented.');
return null;
Expand Down
42 changes: 42 additions & 0 deletions lib/feature/backup/backup_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

class BackupPage extends ConsumerWidget {
const BackupPage({super.key});

@override
Widget build(BuildContext context, WidgetRef ref) {
return Scaffold(
body: CustomScrollView(
slivers: [
SliverAppBar.medium(
title: Text(AppLocalizations.of(context)!.backup),
),
SliverToBoxAdapter(
child: Column(
children: [
ListTile(
onTap: () {
// TODO: Implement.
},
leading: const Icon(Icons.file_upload),
title: Text(AppLocalizations.of(context)!.exportBackupFileTitle),
subtitle: Text(AppLocalizations.of(context)!.exportBackupFileSubtitle),
),
ListTile(
onTap: () {
// TODO: Implement.
},
leading: const Icon(Icons.file_download),
title: Text(AppLocalizations.of(context)!.importBackupFileTitle),
subtitle: Text(AppLocalizations.of(context)!.importBackupFileSubtitle),
),
],
),
),
],
),
);
}
}
23 changes: 10 additions & 13 deletions lib/feature/more/controller/more_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,38 +15,35 @@ final moreControllerProvider = AsyncNotifierProvider
});

class MoreController extends AutoDisposeAsyncNotifier<MoreState> {
final _divider = const GeneralMoreItem(MoreItemType.divider);

@override
FutureOr<MoreState> build() async {
return MoreState(
items: [
await _createAccountSettingsItem(),
_createDivider(),
_divider,
_createBackupItem(),
_divider,
await _createDarkThemeItem(),
_createDivider(),
_divider,
],
appVersion: await _getAppVersion(),
);
}

MoreItem _createDivider() {
return const GeneralMoreItem(MoreItemType.divider);
}

Future<MoreItem> _createAccountSettingsItem() async {
final Account account = await ref.watch(currentAccountProvider.future);
return AccountSettingsMoreItem(account.currency.name);
}

return AccountSettingsMoreItem(MoreItemType.accountSettings,
currentAccountName: account.currency.name,
);
MoreItem _createBackupItem() {
return const GeneralMoreItem(MoreItemType.backup);
}

Future<MoreItem> _createDarkThemeItem() async {
final AppThemeManager themeManager = ref.read(appThemeManagerProvider.notifier);

return DarkThemeMoreItem(MoreItemType.darkTheme,
appTheme: themeManager.getType(),
);
return DarkThemeMoreItem(themeManager.getType());
}

Future<String> _getAppVersion() async {
Expand Down
11 changes: 5 additions & 6 deletions lib/feature/more/domain/more_item.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import '../../../theme/theme.dart';
enum MoreItemType {
divider,
accountSettings,
backup,
darkTheme,
}

Expand All @@ -25,16 +26,14 @@ class GeneralMoreItem extends MoreItem {
class AccountSettingsMoreItem extends MoreItem {
final String currentAccountName;

const AccountSettingsMoreItem(super.type, {
required this.currentAccountName,
});
const AccountSettingsMoreItem(this.currentAccountName)
: super(MoreItemType.accountSettings);
}

@immutable
class DarkThemeMoreItem extends MoreItem {
final AppThemeType appTheme;

const DarkThemeMoreItem(super.type, {
required this.appTheme,
});
const DarkThemeMoreItem(this.appTheme)
: super(MoreItemType.darkTheme);
}
21 changes: 18 additions & 3 deletions lib/feature/more/more_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,12 @@ class _Items extends StatelessWidget {
Widget build(BuildContext context) {
List<Widget> itemTiles = items.map((item) {
switch (item.type) {
case MoreItemType.divider:
// Divider
case MoreItemType.divider: {
return const Divider();
case MoreItemType.accountSettings:
}
// Account settings
case MoreItemType.accountSettings: {
String? subtitle;
if (item is AccountSettingsMoreItem) {
subtitle = item.currentAccountName;
Expand All @@ -67,8 +70,19 @@ class _Items extends StatelessWidget {
title: AppLocalizations.of(context)!.accountSettings,
subtitle: subtitle,
);
case MoreItemType.darkTheme:
}
// Backup
case MoreItemType.backup: {
return ActionTile(
onTap: () => Navigator.pushNamed(context, AppRoutes.backup),
leadingIcon: Icons.import_export_rounded,
title: AppLocalizations.of(context)!.backup,
);
}
// Dark theme
case MoreItemType.darkTheme: {
String? subtitle;

if (item is DarkThemeMoreItem) {
switch (item.appTheme) {
case AppThemeType.light:
Expand All @@ -85,6 +99,7 @@ class _Items extends StatelessWidget {
title: AppLocalizations.of(context)!.darkTheme,
subtitle: subtitle,
);
}
}
}).toList();

Expand Down
10 changes: 8 additions & 2 deletions lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
{
"add": "Add",

"save": "Save",
"done": "Done",
"cancel": "Cancel",
Expand Down Expand Up @@ -82,5 +81,12 @@
"type": "num"
}
}
}
},

"backup": "Backup",

"exportBackupFileTitle": "Export backup file",
"exportBackupFileSubtitle": "Export all data to a file. You can import it later",
"importBackupFileTitle": "Import backup file",
"importBackupFileSubtitle": "Import data from a file"
}
1 change: 1 addition & 0 deletions lib/navigation/routes.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ class AppRoutes {
static const viewTransaction = '/view-transaction';
static const changeTheme = '/change-theme';
static const calculator = '/calculator';
static const backup = '/backup';
}
23 changes: 23 additions & 0 deletions lib/service/backup_service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import '../data/repository/accounts_repository.dart';
import '../data/repository/categories_repository.dart';
import '../data/repository/transactions_repository.dart';

class BackupService {
final AccountsRepository accountsRepository;
final CategoriesRepository categoriesRepository;
final TransactionsRepository transactionsRepository;

BackupService(
this.accountsRepository,
this.categoriesRepository,
this.transactionsRepository,
);

void exportBackupFile() async {
// TODO:
}

void importBackupFile() async {
// TODO:
}
}
9 changes: 9 additions & 0 deletions lib/service/providers.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:moneymanager/local_preferences.dart';
import 'package:moneymanager/service/backup_service.dart';

import '../data/providers.dart';
import '../service/current_account_service.dart';
Expand All @@ -10,3 +11,11 @@ final currentAccountServiceProvider = Provider((ref) async {

return CurrentAccountService(accountsRepository, localPreferences);
});

final backupServiceProvider = Provider((ref) async {
final accountsRepository = await ref.watch(accountsRepositoryProvider);
final categoriesRepository = await ref.watch(categoriesRepositoryProvider);
final transactionsRepository = await ref.watch(transactionsRepositoryProvider);

return BackupService(accountsRepository, categoriesRepository, transactionsRepository);
});

0 comments on commit 323c515

Please sign in to comment.