diff --git a/lib/data/repositories/payment_repository.dart b/lib/data/repositories/payment_repository.dart index 96638f2c1..6d69612f0 100644 --- a/lib/data/repositories/payment_repository.dart +++ b/lib/data/repositories/payment_repository.dart @@ -24,8 +24,7 @@ class PaymentRepository { url += '&updated_at=${updatedAt - kUpdatedAtBufferSeconds}'; } - final dynamic response = - await webClient.get(url, company.token); + final dynamic response = await webClient.get(url, company.token); final PaymentListResponse paymentResponse = serializers.deserializeWith(PaymentListResponse.serializer, response); @@ -33,14 +32,18 @@ class PaymentRepository { return paymentResponse.data; } - Future saveData(CompanyEntity company, AuthState auth, PaymentEntity payment, - [EntityAction action]) async { + Future saveData( + CompanyEntity company, AuthState auth, PaymentEntity payment, + {EntityAction action, bool sendEmail}) async { final data = serializers.serializeWith(PaymentEntity.serializer, payment); dynamic response; if (payment.isNew) { - response = await webClient.post( - auth.url + '/payments', company.token, json.encode(data)); + var url = auth.url + '/payments'; + if (sendEmail) { + url += '?email_receipt=true'; + } + response = await webClient.post(url, company.token, json.encode(data)); } else { var url = auth.url + '/payments/' + payment.id.toString(); if (action != null) { diff --git a/lib/redux/payment/payment_middleware.dart b/lib/redux/payment/payment_middleware.dart index 39a483ec0..96190230d 100644 --- a/lib/redux/payment/payment_middleware.dart +++ b/lib/redux/payment/payment_middleware.dart @@ -78,7 +78,7 @@ Middleware _archivePayment(PaymentRepository repository) { final origPayment = store.state.paymentState.map[action.paymentId]; repository .saveData(store.state.selectedCompany, store.state.authState, - origPayment, EntityAction.archive) + origPayment, action: EntityAction.archive) .then((PaymentEntity payment) { store.dispatch(ArchivePaymentSuccess(payment)); if (action.completer != null) { @@ -101,7 +101,7 @@ Middleware _deletePayment(PaymentRepository repository) { final origPayment = store.state.paymentState.map[action.paymentId]; repository .saveData(store.state.selectedCompany, store.state.authState, - origPayment, EntityAction.delete) + origPayment, action: EntityAction.delete) .then((PaymentEntity payment) { store.dispatch(DeletePaymentSuccess(payment)); store.dispatch(LoadInvoice(invoiceId: payment.invoiceId)); @@ -125,7 +125,7 @@ Middleware _restorePayment(PaymentRepository repository) { final origPayment = store.state.paymentState.map[action.paymentId]; repository .saveData(store.state.selectedCompany, store.state.authState, - origPayment, EntityAction.restore) + origPayment, action: EntityAction.restore) .then((PaymentEntity payment) { store.dispatch(RestorePaymentSuccess(payment)); store.dispatch(LoadInvoice(invoiceId: payment.invoiceId)); @@ -146,9 +146,11 @@ Middleware _restorePayment(PaymentRepository repository) { Middleware _savePayment(PaymentRepository repository) { return (Store store, dynamic action, NextDispatcher next) { + final PaymentEntity payment = action.payment; + final bool sendEmail = payment.isNew ? store.state.uiState.emailPayment : false; repository .saveData( - store.state.selectedCompany, store.state.authState, action.payment) + store.state.selectedCompany, store.state.authState, action.payment, sendEmail: sendEmail) .then((PaymentEntity payment) { if (action.payment.isNew) { store.dispatch(AddPaymentSuccess(payment)); diff --git a/lib/ui/payment/edit/payment_edit.dart b/lib/ui/payment/edit/payment_edit.dart index ebc3995c4..f468d7d3a 100644 --- a/lib/ui/payment/edit/payment_edit.dart +++ b/lib/ui/payment/edit/payment_edit.dart @@ -238,17 +238,15 @@ class _PaymentEditState extends State { ), ], ), - FormCard(children: [ + payment.isNew ? FormCard(children: [ SwitchListTile( activeColor: Theme.of(context).accentColor, title: Text(localization.sendEmail), - value: true, + value: viewModel.uiState.emailPayment, subtitle: Text(localization.sendReceiptToClient), - //value: client.showTasksInPortal, - //onChanged: (value) => viewModel - //.onChanged(client.rebuild((b) => b..showTasksInPortal = value)), + onChanged: (value) => viewModel.onEmailChanged(value), ), - ]), + ]) : Container(), ], ), ), diff --git a/lib/ui/payment/edit/payment_edit_vm.dart b/lib/ui/payment/edit/payment_edit_vm.dart index 56ff0d1d7..d6d3328d0 100644 --- a/lib/ui/payment/edit/payment_edit_vm.dart +++ b/lib/ui/payment/edit/payment_edit_vm.dart @@ -4,10 +4,13 @@ import 'package:built_collection/built_collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; +import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/client_model.dart'; import 'package:invoiceninja_flutter/data/models/invoice_model.dart'; +import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/static/static_state.dart'; import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; +import 'package:invoiceninja_flutter/redux/ui/ui_state.dart'; import 'package:invoiceninja_flutter/ui/payment/payment_screen.dart'; import 'package:invoiceninja_flutter/ui/payment/view/payment_view_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -16,6 +19,7 @@ import 'package:invoiceninja_flutter/redux/payment/payment_actions.dart'; import 'package:invoiceninja_flutter/data/models/payment_model.dart'; import 'package:invoiceninja_flutter/ui/payment/edit/payment_edit.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class PaymentEditScreen extends StatelessWidget { static const String route = '/payment/edit'; @@ -42,7 +46,9 @@ class PaymentEditVM { final PaymentEntity origPayment; final Function(PaymentEntity) onChanged; final Function(BuildContext) onSavePressed; + final Function(bool) onEmailChanged; final BuiltMap invoiceMap; + final UIState uiState; final BuiltList invoiceList; final BuiltMap clientMap; final BuiltList clientList; @@ -56,6 +62,8 @@ class PaymentEditVM { @required this.origPayment, @required this.onChanged, @required this.onSavePressed, + @required this.onEmailChanged, + @required this.uiState, @required this.invoiceMap, @required this.invoiceList, @required this.clientMap, @@ -75,6 +83,7 @@ class PaymentEditVM { isDirty: payment.isNew, origPayment: state.paymentState.map[payment.id], payment: payment, + uiState: state.uiState, staticState: state.staticState, invoiceMap: state.invoiceState.map, invoiceList: state.invoiceState.list, @@ -83,6 +92,11 @@ class PaymentEditVM { onChanged: (PaymentEntity payment) { store.dispatch(UpdatePayment(payment)); }, + onEmailChanged: (value) async { + final SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setBool(kSharedPrefEmailPayment, value); + store.dispatch(UserSettingsChanged(emailPayment: value)); + }, onBackPressed: () { store.dispatch(UpdateCurrentRoute(PaymentScreen.route)); }, diff --git a/lib/ui/payment/view/payment_view.dart b/lib/ui/payment/view/payment_view.dart index 73fff6dc2..d81ea7cbf 100644 --- a/lib/ui/payment/view/payment_view.dart +++ b/lib/ui/payment/view/payment_view.dart @@ -123,12 +123,16 @@ class _PaymentViewState extends State { height: 12.0, ), payment.privateNotes != null && payment.privateNotes.isNotEmpty - ? IconMessage(payment.privateNotes) + ? Column( + children: [ + IconMessage(payment.privateNotes), + Container( + color: Theme.of(context).backgroundColor, + height: 12.0, + ), + ], + ) : Container(), - Container( - color: Theme.of(context).backgroundColor, - height: 12.0, - ), FieldGrid(fields), ], ));