diff --git a/lib/data/models/static/currency_model.dart b/lib/data/models/static/currency_model.dart index a0e40500f..64160eaec 100644 --- a/lib/data/models/static/currency_model.dart +++ b/lib/data/models/static/currency_model.dart @@ -120,6 +120,8 @@ abstract class CurrencyEntity extends Object @override double get listDisplayAmount => null; + + static Serializer get serializer => _$currencyEntitySerializer; } diff --git a/lib/redux/app/app_state.dart b/lib/redux/app/app_state.dart index 4b50ec9fd..8eb10ab73 100644 --- a/lib/redux/app/app_state.dart +++ b/lib/redux/app/app_state.dart @@ -156,11 +156,15 @@ abstract class AppState implements Built { // STARTER: state getters - do not remove comment ExpenseState get expenseState => selectedCompanyState.expenseState; + ListUIState get expenseListState => uiState.expenseUIState.listUIState; + ExpenseUIState get expenseUIState => uiState.expenseUIState; VendorState get vendorState => selectedCompanyState.vendorState; + ListUIState get vendorListState => uiState.vendorUIState.listUIState; + VendorUIState get vendorUIState => uiState.vendorUIState; TaskState get taskState => selectedCompanyState.taskState; @@ -191,6 +195,7 @@ abstract class AppState implements Built { String toString() { //return 'Is Loading: ${this.isLoading}, Invoice: ${this.invoiceUIState.selected}'; //return 'Expense Categories: ${selectedCompany.expenseCategories}'; + return 'Expense: ${uiState.expenseUIState.editing.expenseCurrencyId} - Invoice: ${uiState.expenseUIState.editing.invoiceCurrencyId}'; return 'Route: ${uiState.currentRoute}'; } } diff --git a/lib/ui/expense/edit/expense_edit_settings.dart b/lib/ui/expense/edit/expense_edit_settings.dart index 78a2ca0e9..9022137c2 100644 --- a/lib/ui/expense/edit/expense_edit_settings.dart +++ b/lib/ui/expense/edit/expense_edit_settings.dart @@ -8,6 +8,7 @@ import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/redux/static/static_selectors.dart'; +import 'package:invoiceninja_flutter/utils/money.dart'; class ExpenseEditSettings extends StatefulWidget { const ExpenseEditSettings({ @@ -184,9 +185,17 @@ class ExpenseEditSettingsState extends State { initialValue: staticState .currencyMap[viewModel.expense.invoiceCurrencyId] ?.name, - onSelected: (SelectableEntity currency) => - viewModel.onChanged(viewModel.expense.rebuild( - (b) => b..invoiceCurrencyId = currency.id)), + onSelected: (SelectableEntity currency) { + final exchangeRate = getExchangeRate(context, + fromCurrencyId: expense.expenseCurrencyId, + toCurrencyId: currency.id); + viewModel.onChanged(expense.rebuild((b) => b + ..invoiceCurrencyId = currency.id + ..exchangeRate = exchangeRate)); + _exchangeRateController.text = formatNumber( + exchangeRate, context, + formatNumberType: FormatNumberType.input); + }, ), TextFormField( controller: _exchangeRateController, diff --git a/lib/utils/money.dart b/lib/utils/money.dart new file mode 100644 index 000000000..7c25b01d3 --- /dev/null +++ b/lib/utils/money.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_redux/flutter_redux.dart'; +import 'package:invoiceninja_flutter/constants.dart'; +import 'package:invoiceninja_flutter/redux/app/app_state.dart'; + +double getExchangeRate(BuildContext context, + {int fromCurrencyId, int toCurrencyId}) { + final state = StoreProvider.of(context).state; + final currencyMap = state.staticState.currencyMap; + final fromCurrency = currencyMap[fromCurrencyId]; + final toCurrency = currencyMap[toCurrencyId]; + // TODO replace with data from server + final baseCurrency = currencyMap[kCurrencyUSDollar]; + + if (fromCurrency == baseCurrency) { + return toCurrency.exchangeRate; + } + + if (toCurrency == baseCurrency) { + return 1 / fromCurrency.exchangeRate; + } + + return toCurrency.exchangeRate * (1 / fromCurrency.exchangeRate); +}