Skip to content

Commit

Permalink
Merge pull request #252 from flow-mn/sadespresso/onboarding-choices-2…
Browse files Browse the repository at this point in the history
…0241230

fix onboarding
  • Loading branch information
sadespresso authored Dec 31, 2024
2 parents 63ff1bf + 6161609 commit 28ed34b
Show file tree
Hide file tree
Showing 14 changed files with 216 additions and 14 deletions.
5 changes: 5 additions & 0 deletions assets/l10n/en_IN.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,11 @@
"setup.categories.preset.utils": "Utils",
"setup.categories.preset.taxes": "Taxes",
"setup.categories.preset.paychecks": "Paycheck",
"setup.onboarding": "Let's start",
"setup.onboarding.freshStart": "Start fresh",
"setup.onboarding.freshStart.description": "I'm using Flow for the first time",
"setup.onboarding.importExisting": "Import from a backup",
"setup.onboarding.importExisting.description": "Restore data from a previous Flow backup",

"account": "Account",
"account.name": "Account name",
Expand Down
5 changes: 5 additions & 0 deletions assets/l10n/en_US.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,11 @@
"setup.categories.preset.utils": "Utils",
"setup.categories.preset.taxes": "Taxes",
"setup.categories.preset.paychecks": "Paycheck",
"setup.onboarding": "Let's start",
"setup.onboarding.freshStart": "Start fresh",
"setup.onboarding.freshStart.description": "I'm using Flow for the first time",
"setup.onboarding.importExisting": "Import from a backup",
"setup.onboarding.importExisting.description": "Restore data from a previous Flow backup",

"account": "Account",
"account.name": "Account name",
Expand Down
5 changes: 5 additions & 0 deletions assets/l10n/it_IT.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,11 @@
"setup.categories.preset.utils": "Utenze",
"setup.categories.preset.taxes": "Tasse",
"setup.categories.preset.paychecks": "Stipendio",
"setup.onboarding": "Cominciamo",
"setup.onboarding.freshStart": "Nuova installazione",
"setup.onboarding.freshStart.description": "È la prima volta che uso Flow",
"setup.onboarding.importExisting": "Importa da un backup",
"setup.onboarding.importExisting.description": "Ripristina i dati da un file di backup di Flow precedente",

"account": "Conto",
"account.name": "Nome del conto",
Expand Down
5 changes: 5 additions & 0 deletions assets/l10n/mn_MN.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,11 @@
"setup.categories.preset.utils": "Ус, цахилгаан",
"setup.categories.preset.taxes": "Татвар",
"setup.categories.preset.paychecks": "Цалин",
"setup.onboarding": "Эхэлцгээе",
"setup.onboarding.freshStart": "Шинээр эхлэх",
"setup.onboarding.freshStart.description": "Цоо шинээр тохируулах",
"setup.onboarding.importExisting": "Нөөцөөс сэргээх",
"setup.onboarding.importExisting.description": "Өмнө нь Flow-с нөөцөлж авсан өгөгдлийг сэргээх",

"account": "Данс",
"account.name": "Дансны нэр",
Expand Down
25 changes: 21 additions & 4 deletions lib/routes.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import "package:flow/routes/profile_page.dart";
import "package:flow/routes/setup/setup_accounts_page.dart";
import "package:flow/routes/setup/setup_categories_page.dart";
import "package:flow/routes/setup/setup_currency_page.dart";
import "package:flow/routes/setup/setup_onboarding_page.dart";
import "package:flow/routes/setup/setup_profile_page.dart";
import "package:flow/routes/setup/setup_profile_picture_page.dart";
import "package:flow/routes/setup_page.dart";
Expand Down Expand Up @@ -236,13 +237,20 @@ final router = GoRouter(
),
GoRoute(
path: "/import",
builder: (context, state) => const ImportPage(),
builder: (context, state) {
return ImportPage(
setupMode: state.uri.queryParameters["setupMode"] == "true",
);
},
),
GoRoute(
path: "/import/wizard/v1",
builder: (context, state) {
if (state.extra case ImportV1 importV1) {
return ImportWizardV1Page(importer: importV1);
return ImportWizardV1Page(
importer: importV1,
setupMode: state.uri.queryParameters["setupMode"] == "true",
);
}

return ErrorPage(
Expand All @@ -254,7 +262,10 @@ final router = GoRouter(
path: "/import/wizard/v2",
builder: (context, state) {
if (state.extra case ImportV2 importV2) {
return ImportWizardV2Page(importer: importV2);
return ImportWizardV2Page(
importer: importV2,
setupMode: state.uri.queryParameters["setupMode"] == "true",
);
}

return ErrorPage(
Expand All @@ -275,12 +286,18 @@ final router = GoRouter(
),
GoRoute(
path: "/import",
builder: (context, state) => const ImportPage(),
builder: (context, state) => ImportPage(
setupMode: state.uri.queryParameters["setupMode"] == "true",
),
),
GoRoute(
path: "/setup",
builder: (context, state) => const SetupPage(),
routes: [
GoRoute(
path: "choose",
builder: (context, state) => const SetupOnboardingPage(),
),
GoRoute(
path: "profile",
builder: (context, state) => const SetupProfilePage(),
Expand Down
14 changes: 13 additions & 1 deletion lib/routes/home_page.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import "dart:async";
import "dart:developer";

import "package:flow/entity/account.dart";
import "package:flow/entity/transaction.dart";
Expand Down Expand Up @@ -56,7 +57,18 @@ class _HomePageState extends State<HomePage>
if (LocalPreferences().completedInitialSetup.get()) return;

context.pushReplacement("/setup");
unawaited(LocalPreferences().completedInitialSetup.set(true));

unawaited(
LocalPreferences().completedInitialSetup.set(true).catchError(
(error) {
log(
"Failed to set LocalPreferences().completedInitialSetup -> true",
error: error,
);
return false;
},
),
);
});
}

Expand Down
14 changes: 11 additions & 3 deletions lib/routes/import_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ import "package:cross_file/cross_file.dart";
import "package:go_router/go_router.dart";

class ImportPage extends StatefulWidget {
const ImportPage({super.key});
final bool? setupMode;

const ImportPage({this.setupMode = false, super.key});

@override
State<ImportPage> createState() => _ImportPageState();
Expand Down Expand Up @@ -58,10 +60,16 @@ class _ImportPageState extends State<ImportPage> {
if (mounted) {
switch (importer) {
case ImportV1 importV1:
context.pushReplacement("/import/wizard/v1", extra: importV1);
context.pushReplacement(
"/import/wizard/v1?setupMode=${widget.setupMode}",
extra: importV1,
);
break;
case ImportV2 importV2:
context.pushReplacement("/import/wizard/v2", extra: importV2);
context.pushReplacement(
"/import/wizard/v2?setupMode=${widget.setupMode}",
extra: importV2,
);
break;
case null:
context.showErrorToast(
Expand Down
22 changes: 20 additions & 2 deletions lib/routes/import_wizard/v1.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,17 @@ import "package:flow/widgets/general/spinner.dart";
import "package:flow/widgets/import_wizard/backup_info.dart";
import "package:flow/widgets/import_wizard/import_success.dart";
import "package:flutter/material.dart";
import "package:go_router/go_router.dart";

class ImportWizardV1Page extends StatefulWidget {
final ImportV1 importer;
final bool setupMode;

const ImportWizardV1Page({super.key, required this.importer});
const ImportWizardV1Page({
super.key,
required this.importer,
this.setupMode = false,
});

@override
State<ImportWizardV1Page> createState() => _ImportWizardV1PageState();
Expand All @@ -36,7 +42,19 @@ class _ImportWizardV1PageState extends State<ImportWizardV1Page> {
onClickStart: _start,
),
ImportV1Progress.error => Text(error.toString()),
ImportV1Progress.success => const ImportSuccess(),
ImportV1Progress.success => ImportSuccess(
onDone: () {
if (widget.setupMode) {
GoRouter.of(context).popUntil(
(route) => route.path == "/setup",
);

context.pushReplacement("/");
} else {
Navigator.of(context).pop();
}
},
),
_ => Center(
child: Column(
mainAxisSize: MainAxisSize.min,
Expand Down
22 changes: 20 additions & 2 deletions lib/routes/import_wizard/v2.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,17 @@ import "package:flow/widgets/general/spinner.dart";
import "package:flow/widgets/import_wizard/backup_info.dart";
import "package:flow/widgets/import_wizard/import_success.dart";
import "package:flutter/material.dart";
import "package:go_router/go_router.dart";

class ImportWizardV2Page extends StatefulWidget {
final ImportV2 importer;
final bool setupMode;

const ImportWizardV2Page({super.key, required this.importer});
const ImportWizardV2Page({
super.key,
required this.importer,
this.setupMode = false,
});

@override
State<ImportWizardV2Page> createState() => _ImportWizardV2PageState();
Expand All @@ -38,7 +44,19 @@ class _ImportWizardV2PageState extends State<ImportWizardV2Page> {
onClickStart: _start,
),
ImportV2Progress.error => Text(error.toString()),
ImportV2Progress.success => const ImportSuccess(),
ImportV2Progress.success => ImportSuccess(
onDone: () {
if (widget.setupMode) {
GoRouter.of(context).popUntil(
(route) => route.path == "/setup",
);

context.pushReplacement("/");
} else {
Navigator.of(context).pop();
}
},
),
_ => Center(
child: Column(
mainAxisSize: MainAxisSize.min,
Expand Down
5 changes: 5 additions & 0 deletions lib/routes/setup/setup_categories_page.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import "dart:async";

import "package:flow/data/setup/default_categories.dart";
import "package:flow/entity/category.dart";
import "package:flow/l10n/extensions.dart";
import "package:flow/objectbox.dart";
import "package:flow/objectbox/objectbox.g.dart";
import "package:flow/prefs.dart";
import "package:flow/utils/utils.dart";
import "package:flow/widgets/add_category_card.dart";
import "package:flow/widgets/category_card.dart";
Expand Down Expand Up @@ -206,6 +209,8 @@ class _SetupCategoriesPageState extends State<SetupCategoriesPage> {

context.pushReplacement("/");
}

unawaited(LocalPreferences().completedInitialSetup.set(true));
} finally {
busy = false;
if (mounted) {
Expand Down
92 changes: 92 additions & 0 deletions lib/routes/setup/setup_onboarding_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import "package:flow/data/flow_icon.dart";
import "package:flow/l10n/extensions.dart";
import "package:flow/theme/theme.dart";
import "package:flow/widgets/action_card.dart";
import "package:flow/widgets/general/flow_icon.dart";
import "package:flutter/material.dart";
import "package:go_router/go_router.dart";
import "package:material_symbols_icons/symbols.dart";

class SetupOnboardingPage extends StatelessWidget {
const SetupOnboardingPage({super.key});

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("setup.onboarding".t(context)),
),
body: SafeArea(
child: SingleChildScrollView(
padding: EdgeInsets.all(16.0),
child: Column(
children: [
ActionCard(
onTap: () => context.push("/setup/profile"),
builder: (context) => Padding(
padding: const EdgeInsets.symmetric(
horizontal: 24.0,
vertical: 16.0,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
FlowIcon(
FlowIconData.icon(Symbols.book_4_spark_rounded),
size: 80.0,
plated: true,
),
const SizedBox(height: 8.0),
Text(
"setup.onboarding.freshStart".t(context),
style: context.textTheme.headlineSmall,
),
const SizedBox(height: 8.0),
Text(
"setup.onboarding.freshStart.description".t(context),
style: context.textTheme.bodySmall,
),
],
),
),
),
const SizedBox(height: 16.0),
ActionCard(
onTap: () => context.push("/import?setupMode=true"),
builder: (context) => Padding(
padding: const EdgeInsets.symmetric(
horizontal: 24.0,
vertical: 16.0,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
FlowIcon(
FlowIconData.icon(Symbols.restore_page_rounded),
size: 80.0,
plated: true,
),
const SizedBox(height: 8.0),
Text(
"setup.onboarding.importExisting".t(context),
style: context.textTheme.headlineSmall,
),
const SizedBox(height: 8.0),
Text(
"setup.onboarding.importExisting.description"
.t(context),
style: context.textTheme.bodySmall,
),
],
),
),
),
],
),
),
),
);
}
}
2 changes: 2 additions & 0 deletions lib/routes/setup/setup_profile_page.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import "dart:async";

import "package:flow/entity/profile.dart";
import "package:flow/form_validators.dart";
import "package:flow/l10n/extensions.dart";
Expand Down
2 changes: 1 addition & 1 deletion lib/routes/setup_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ class _SetupPageState extends State<SetupPage> {
curve: Curves.easeOut,
);
} else {
context.push("/setup/profile");
context.push("/setup/choose");
}
}
}
Loading

0 comments on commit 28ed34b

Please sign in to comment.