import 'package:drift/drift.dart' show Value; import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:okane/database/sqlite.dart'; import 'package:okane/i18n/strings.g.dart'; import 'package:okane/ui/utils.dart'; import 'package:okane/ui/widgets/add_expense_category.dart'; class AddBudgetItemPopup extends StatefulWidget { final VoidCallback onDone; final BudgetsDto budget; final List items; const AddBudgetItemPopup({ super.key, required this.onDone, required this.budget, required this.items, }); @override AddBudgetItemState createState() => AddBudgetItemState(); } class AddBudgetItemState extends State { final _budgetItemAmountEditController = TextEditingController(); ExpenseCategory? _expenseCategory; @override Widget build(BuildContext context) { return Column( mainAxisSize: MainAxisSize.min, children: [ Row( children: [ Text(t.common.expenseCategory.name), OutlinedButton( onPressed: () async { final category = await showDialogOrModal( context: context, builder: (_) => AddExpenseCategory(), ); if (category == null) { return; } setState(() => _expenseCategory = category); }, child: Text( _expenseCategory?.name ?? t.common.expenseCategory.none, ), ), ], ), TextField( decoration: InputDecoration( hintText: t.pages.budgets.addBudgetItem.amountHint, ), controller: _budgetItemAmountEditController, keyboardType: TextInputType.numberWithOptions( signed: false, decimal: true, ), ), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ OutlinedButton( onPressed: () async { if (_budgetItemAmountEditController.text.isEmpty || _expenseCategory == null) { return; } if (widget.items .where( (i) => i.expenseCategory.name == _expenseCategory!.name, ) .firstOrNull != null) { return; } await GetIt.I.get().budgetsDao.upsertBudgetItem( BudgetItemsCompanion( amount: Value( double.parse(_budgetItemAmountEditController.text), ), expenseCategoryId: Value(_expenseCategory!.id), budgetId: Value(widget.budget.budget.id), ), ); widget.onDone(); }, child: Text(t.modals.add), ), ], ), ], ); } }