prasule/lib/views/setup.dart

315 lines
12 KiB
Dart
Raw Normal View History

2023-09-08 11:50:21 +02:00
import 'package:currency_picker/currency_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter_iconpicker/flutter_iconpicker.dart';
import 'package:introduction_screen/introduction_screen.dart';
import 'package:prasule/api/category.dart';
import 'package:prasule/api/wallet.dart';
import 'package:prasule/api/walletmanager.dart';
import 'package:prasule/pw/platformbutton.dart';
import 'package:prasule/pw/platformdialog.dart';
import 'package:prasule/pw/platformfield.dart';
import 'package:prasule/views/home.dart';
2023-10-11 18:37:18 +02:00
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
2023-09-08 11:50:21 +02:00
class SetupView extends StatefulWidget {
const SetupView({super.key});
@override
State<SetupView> createState() => _SetupViewState();
}
class _SetupViewState extends State<SetupView> {
var _selectedCurrency = Currency.from(json: {
"code": "USD",
"name": "United States Dollar",
"symbol": "\$",
"flag": "USD",
"decimal_digits": 2,
"number": 840,
"name_plural": "US dollars",
"thousands_separator": ",",
"decimal_separator": ".",
"space_between_amount_and_symbol": false,
"symbol_on_left": true,
});
2023-10-11 18:37:18 +02:00
var categories = <WalletCategory>[];
2023-09-08 11:50:21 +02:00
var name = "";
2023-10-11 18:37:18 +02:00
@override
void initState() {
super.initState();
categories = [
WalletCategory(
name: AppLocalizations.of(context)!.categoryHealth,
type: EntryType.expense,
id: 1,
icon: IconData(Icons.medical_information.codePoint,
fontFamily: 'MaterialIcons'),
),
WalletCategory(
name: AppLocalizations.of(context)!.categoryCar,
type: EntryType.expense,
id: 2,
icon: IconData(Icons.car_repair.codePoint, fontFamily: 'MaterialIcons'),
),
WalletCategory(
name: AppLocalizations.of(context)!.categoryFood,
type: EntryType.expense,
id: 3,
icon: IconData(Icons.restaurant.codePoint, fontFamily: 'MaterialIcons'),
),
WalletCategory(
name: AppLocalizations.of(context)!.categoryTravel,
type: EntryType.expense,
id: 4,
icon: IconData(Icons.train.codePoint, fontFamily: 'MaterialIcons'),
),
];
setState(() {});
}
2023-09-08 11:50:21 +02:00
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: SizedBox(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: IntroductionScreen(
dotsDecorator: DotsDecorator(
activeColor: Theme.of(context).colorScheme.primary,
),
showNextButton: true,
showBackButton: true,
showDoneButton: true,
2023-10-11 18:37:18 +02:00
next: Text(AppLocalizations.of(context)!.next),
back: Text(AppLocalizations.of(context)!.back),
done: Text(AppLocalizations.of(context)!.finish),
2023-09-08 11:50:21 +02:00
onDone: () {
if (name.isEmpty) {
ScaffoldMessenger.of(context)
.clearSnackBars(); // TODO: iOS replacement
2023-10-11 18:37:18 +02:00
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content:
Text(AppLocalizations.of(context)!.errorEmptyName)));
2023-09-08 11:50:21 +02:00
return;
}
var wallet = Wallet(
name: name,
currency: _selectedCurrency,
categories: categories);
WalletManager.saveWallet(wallet).then(
(value) => Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (c) => const HomeView(),
),
),
);
},
pages: [
PageViewModel(
decoration:
const PageDecoration(bodyAlignment: Alignment.center),
2023-10-11 18:37:18 +02:00
titleWidget: Padding(
padding: const EdgeInsets.all(8),
2023-09-08 11:50:21 +02:00
child: Text(
2023-10-11 18:37:18 +02:00
AppLocalizations.of(context)!.welcome,
style: const TextStyle(
fontSize: 24, fontWeight: FontWeight.bold),
2023-09-08 11:50:21 +02:00
textAlign: TextAlign.center,
),
),
2023-10-11 18:37:18 +02:00
bodyWidget: Column(
2023-09-08 11:50:21 +02:00
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Flexible(
2023-10-11 18:37:18 +02:00
child: Text(
AppLocalizations.of(context)!.welcomeAboutPrasule),
),
const SizedBox(
2023-09-08 11:50:21 +02:00
height: 5,
),
Flexible(
2023-10-11 18:37:18 +02:00
child: Text(
AppLocalizations.of(context)!.welcomeInstruction),
),
2023-09-08 11:50:21 +02:00
],
),
),
PageViewModel(
decoration:
const PageDecoration(bodyAlignment: Alignment.center),
2023-10-11 18:37:18 +02:00
titleWidget: Padding(
padding: const EdgeInsets.all(8),
2023-09-08 11:50:21 +02:00
child: Text(
2023-10-11 18:37:18 +02:00
AppLocalizations.of(context)!.setupWalletNameCurrency,
2023-09-08 11:50:21 +02:00
textAlign: TextAlign.center,
2023-10-11 18:37:18 +02:00
style: const TextStyle(
fontSize: 24, fontWeight: FontWeight.bold),
2023-09-08 11:50:21 +02:00
),
),
bodyWidget: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SizedBox(
width: MediaQuery.of(context).size.width * 0.7,
child: PlatformField(
2023-10-11 18:37:18 +02:00
labelText:
AppLocalizations.of(context)!.setupNamePlaceholder,
2023-09-08 11:50:21 +02:00
onChanged: (t) {
name = t;
},
),
),
const SizedBox(
height: 5,
),
PlatformButton(
2023-10-11 18:37:18 +02:00
text: AppLocalizations.of(context)!
.setupCurrency(_selectedCurrency.code),
2023-09-08 11:50:21 +02:00
onPressed: () {
showCurrencyPicker(
context: context,
onSelect: (currency) {
_selectedCurrency = currency;
setState(() {});
},
);
},
)
],
),
),
PageViewModel(
decoration:
const PageDecoration(bodyAlignment: Alignment.center),
2023-10-11 18:37:18 +02:00
titleWidget: Padding(
padding: const EdgeInsets.all(8),
2023-09-08 11:50:21 +02:00
child: Text(
2023-10-11 18:37:18 +02:00
AppLocalizations.of(context)!.setupCategoriesHeading,
2023-09-08 11:50:21 +02:00
textAlign: TextAlign.center,
2023-10-11 18:37:18 +02:00
style: const TextStyle(
fontSize: 24, fontWeight: FontWeight.bold),
2023-09-08 11:50:21 +02:00
),
),
bodyWidget: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
2023-10-11 18:37:18 +02:00
Text(
AppLocalizations.of(context)!.setupCategoriesEditHint,
2023-09-08 11:50:21 +02:00
textAlign: TextAlign.center,
),
SizedBox(
height: MediaQuery.of(context).size.height * 0.64,
child: ListView.builder(
shrinkWrap: true,
itemBuilder: (context, i) => ListTile(
leading: GestureDetector(
onTap: () async {
var icon = await FlutterIconPicker.showIconPicker(
context);
if (icon == null) return;
categories[i].icon = icon;
setState(() {});
},
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16),
color:
Theme.of(context).colorScheme.secondary),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Icon(
categories[i].icon,
color:
Theme.of(context).colorScheme.onSecondary,
),
),
),
),
trailing: IconButton(
icon: const Icon(Icons.cancel),
onPressed: () {
categories.removeAt(i);
setState(() {});
},
),
title: GestureDetector(
onTap: () {
var controller = TextEditingController(
text: categories[i].name);
showDialog(
context: context,
builder: (c) => PlatformDialog(
actions: [
TextButton(
onPressed: () {
if (controller.text.isEmpty) return;
categories[i].name = controller.text;
Navigator.of(context).pop();
},
2023-10-11 18:37:18 +02:00
child: Text(
AppLocalizations.of(context)!.ok),
2023-09-08 11:50:21 +02:00
),
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
2023-10-11 18:37:18 +02:00
child: Text(
AppLocalizations.of(context)!.cancel),
2023-09-08 11:50:21 +02:00
),
],
2023-10-11 18:37:18 +02:00
title: AppLocalizations.of(context)!
.setupCategoriesEditingName,
2023-09-08 11:50:21 +02:00
content: SizedBox(
width: 400,
child:
PlatformField(controller: controller),
),
),
);
},
child: Text(
categories[i].name,
style:
const TextStyle(fontWeight: FontWeight.bold),
),
),
),
itemCount: categories.length,
),
),
IconButton(
onPressed: () {
var id = 1;
while (categories
.where((element) => element.id == id)
.isNotEmpty) {
id++; // create unique ID
}
categories.add(
WalletCategory(
2023-10-11 18:37:18 +02:00
name: AppLocalizations.of(context)!
.setupWalletNamePlaceholder,
2023-09-08 11:50:21 +02:00
type: EntryType.expense,
id: id,
icon: IconData(Icons.question_mark.codePoint,
fontFamily: 'MaterialIcons'),
),
);
setState(() {});
},
icon: const Icon(Icons.add),
)
],
),
),
],
),
),
),
);
}
}