From 2257c32422966abbfcc3f345ca7e403a17520728 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 17 Jun 2018 07:50:46 -0700 Subject: [PATCH] Refactor --- .../repositories/persistence_repository.dart | 2 ++ lib/main.dart | 2 ++ lib/redux/product/product_actions.dart | 7 ++++--- lib/redux/product/product_middleware.dart | 19 +++++++++++++++---- lib/redux/product/product_reducer.dart | 4 ++-- lib/redux/ui/ui_actions.dart | 4 ++++ lib/ui/product/edit/product_edit_vm.dart | 1 + lib/ui/product/product_list_vm.dart | 5 +---- lib/ui/product/product_screen.dart | 12 +++++++----- 9 files changed, 38 insertions(+), 18 deletions(-) create mode 100644 lib/redux/ui/ui_actions.dart diff --git a/lib/data/repositories/persistence_repository.dart b/lib/data/repositories/persistence_repository.dart index 786fc9aea..0a73a0400 100644 --- a/lib/data/repositories/persistence_repository.dart +++ b/lib/data/repositories/persistence_repository.dart @@ -37,6 +37,8 @@ class PersistenceRepository { } } +/* AppState _deserialize(String data) { return serializers.deserializeWith(AppState.serializer, json.decode(data)); } +*/ \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index b834709f7..c4c944534 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja/redux/client/client_actions.dart'; import 'package:invoiceninja/redux/client/client_middleware.dart'; import 'package:invoiceninja/redux/invoice/invoice_actions.dart'; import 'package:invoiceninja/ui/client/client_screen.dart'; +import 'package:invoiceninja/ui/product/edit/product_edit_vm.dart'; import 'package:redux/redux.dart'; import 'package:invoiceninja/utils/localization.dart'; import 'package:invoiceninja/ui/auth/login_vm.dart'; @@ -95,6 +96,7 @@ class _InvoiceNinjaAppState extends State { widget.store.dispatch(LoadProductsAction()); return ProductScreen(); }, + ProductEditScreen.route: (context) => ProductEditScreen(), ClientScreen.route: (context) { widget.store.dispatch(LoadClientsAction()); return ClientScreen(); diff --git a/lib/redux/product/product_actions.dart b/lib/redux/product/product_actions.dart index 8d2b6876c..64921dadb 100644 --- a/lib/redux/product/product_actions.dart +++ b/lib/redux/product/product_actions.dart @@ -1,5 +1,5 @@ import 'dart:async'; - +import 'package:flutter/widgets.dart'; import 'package:invoiceninja/data/models/models.dart'; import 'package:built_collection/built_collection.dart'; @@ -32,9 +32,10 @@ class LoadProductsSuccess { } } -class SelectProductAction { +class EditProductAction { final ProductEntity product; - SelectProductAction(this.product); + final BuildContext context; + EditProductAction({this.product, this.context}); } class SaveProductRequest { diff --git a/lib/redux/product/product_middleware.dart b/lib/redux/product/product_middleware.dart index b37445cd2..c1ba18960 100644 --- a/lib/redux/product/product_middleware.dart +++ b/lib/redux/product/product_middleware.dart @@ -1,5 +1,8 @@ +import 'package:flutter/material.dart'; import 'package:invoiceninja/data/models/models.dart'; import 'package:invoiceninja/redux/client/client_actions.dart'; +import 'package:invoiceninja/redux/ui/ui_actions.dart'; +import 'package:invoiceninja/ui/product/edit/product_edit_vm.dart'; import 'package:redux/redux.dart'; import 'package:invoiceninja/redux/product/product_actions.dart'; import 'package:invoiceninja/redux/app/app_state.dart'; @@ -13,6 +16,7 @@ List> createStoreProductsMiddleware([ final archiveProduct = _archiveProduct(repository); final deleteProduct = _deleteProduct(repository); final restoreProduct = _restoreProduct(repository); + final editProduct = _editProduct(); return [ TypedMiddleware(loadProducts), @@ -20,9 +24,19 @@ List> createStoreProductsMiddleware([ TypedMiddleware(archiveProduct), TypedMiddleware(deleteProduct), TypedMiddleware(restoreProduct), + TypedMiddleware(editProduct), ]; } +Middleware _editProduct() { + return (Store store, action, NextDispatcher next) { + next(action); + + store.dispatch(UpdateCurrentRoute(ProductEditScreen.route)); + Navigator.of(action.context).pushReplacementNamed(ProductEditScreen.route); + }; +} + Middleware _archiveProduct(ProductRepository repository) { return (Store store, action, NextDispatcher next) { var origProduct = store.state.productState.map[action.productId]; @@ -106,7 +120,6 @@ Middleware _saveProduct(ProductRepository repository) { Middleware _loadProducts(ProductRepository repository) { return (Store store, action, NextDispatcher next) { - AppState state = store.state; if (!state.productState.isStale && !action.force) { @@ -120,9 +133,7 @@ Middleware _loadProducts(ProductRepository repository) { } store.dispatch(LoadProductsRequest()); - repository - .loadList(state.selectedCompany, state.authState) - .then((data) { + repository.loadList(state.selectedCompany, state.authState).then((data) { store.dispatch(LoadProductsSuccess(data)); if (action.completer != null) { action.completer.complete(null); diff --git a/lib/redux/product/product_reducer.dart b/lib/redux/product/product_reducer.dart index ac2d64b1c..a1ab84871 100644 --- a/lib/redux/product/product_reducer.dart +++ b/lib/redux/product/product_reducer.dart @@ -47,7 +47,7 @@ final productsReducer = combineReducers([ TypedReducer(_addProduct), TypedReducer(_setLoadedProducts), TypedReducer(_setNoProducts), - TypedReducer(_selectProduct), + TypedReducer(_selectProduct), TypedReducer(_archiveProductRequest), TypedReducer(_archiveProductSuccess), @@ -163,7 +163,7 @@ ProductState _setNoProducts( } ProductState _selectProduct( - ProductState productState, SelectProductAction action) { + ProductState productState, EditProductAction action) { return productState.rebuild((b) => b ..editing.replace(action.product)); } diff --git a/lib/redux/ui/ui_actions.dart b/lib/redux/ui/ui_actions.dart new file mode 100644 index 000000000..f9cd49029 --- /dev/null +++ b/lib/redux/ui/ui_actions.dart @@ -0,0 +1,4 @@ +class UpdateCurrentRoute { + final String route; + UpdateCurrentRoute(this.route); +} \ No newline at end of file diff --git a/lib/ui/product/edit/product_edit_vm.dart b/lib/ui/product/edit/product_edit_vm.dart index 46b865456..04c3603ef 100644 --- a/lib/ui/product/edit/product_edit_vm.dart +++ b/lib/ui/product/edit/product_edit_vm.dart @@ -11,6 +11,7 @@ import 'package:invoiceninja/redux/app/app_state.dart'; import 'package:invoiceninja/ui/app/snackbar_row.dart'; class ProductEditScreen extends StatelessWidget { + static final String route = '/products/edit'; ProductEditScreen({Key key}) : super(key: key); @override diff --git a/lib/ui/product/product_list_vm.dart b/lib/ui/product/product_list_vm.dart index 86d45ba01..4702cc64e 100644 --- a/lib/ui/product/product_list_vm.dart +++ b/lib/ui/product/product_list_vm.dart @@ -69,10 +69,7 @@ class ProductListVM { isLoading: store.state.isLoading, isLoaded: store.state.productState.isLoaded, onProductTap: (context, product) { - store.dispatch(SelectProductAction(product)); - Navigator - .of(context) - .push(MaterialPageRoute(builder: (_) => ProductEditScreen())); + store.dispatch(EditProductAction(product: product, context: context)); }, onRefreshed: (context) => _handleRefresh(context), onDismissed: (BuildContext context, ProductEntity product, diff --git a/lib/ui/product/product_screen.dart b/lib/ui/product/product_screen.dart index b14c5a2af..913fd992e 100644 --- a/lib/ui/product/product_screen.dart +++ b/lib/ui/product/product_screen.dart @@ -1,3 +1,4 @@ +import 'package:invoiceninja/redux/ui/ui_actions.dart'; import 'package:invoiceninja/ui/app/app_search.dart'; import 'package:invoiceninja/ui/app/app_search_button.dart'; import 'package:invoiceninja/ui/product/edit/product_edit_vm.dart'; @@ -55,12 +56,13 @@ class ProductScreen extends StatelessWidget { floatingActionButton: FloatingActionButton( backgroundColor: Theme.of(context).primaryColorDark, onPressed: () { - store.dispatch(SelectProductAction(ProductEntity())); - Navigator - .of(context) - .push(MaterialPageRoute(builder: (_) => ProductEditScreen())); + store.dispatch( + EditProductAction(product: ProductEntity(), context: context)); }, - child: Icon(Icons.add,color: Colors.white,), + child: Icon( + Icons.add, + color: Colors.white, + ), tooltip: localization.newProduct, ), );