invoice/lib/redux/product/product_reducer.dart

185 lines
6.0 KiB
Dart

import 'package:invoiceninja/redux/ui/entity_ui_state.dart';
import 'package:invoiceninja/redux/ui/list_ui_state.dart';
import 'package:redux/redux.dart';
import 'package:invoiceninja/redux/product/product_actions.dart';
import 'package:invoiceninja/redux/product/product_state.dart';
EntityUIState productUIReducer(EntityUIState state, action) {
return state.rebuild((b) => b
..listUIState.replace(productListReducer(state.listUIState, action))
);
}
final productListReducer = combineReducers<ListUIState>([
TypedReducer<ListUIState, SortProducts>(_sortProducts),
TypedReducer<ListUIState, FilterProductsByState>(_filterProductsByState),
TypedReducer<ListUIState, SearchProducts>(_searchProducts),
]);
ListUIState _filterProductsByState(ListUIState productListState, FilterProductsByState action) {
if (productListState.stateFilters.contains(action.state)) {
return productListState.rebuild((b) => b
..stateFilters.remove(action.state)
);
} else {
return productListState.rebuild((b) => b
..stateFilters.add(action.state)
);
}
}
ListUIState _searchProducts(ListUIState productListState, SearchProducts action) {
return productListState.rebuild((b) => b
..search = action.search
);
}
ListUIState _sortProducts(ListUIState productListState, SortProducts action) {
return productListState.rebuild((b) => b
..sortAscending = b.sortField != action.field || ! b.sortAscending
..sortField = action.field
);
}
final productsReducer = combineReducers<ProductState>([
TypedReducer<ProductState, SaveProductSuccess>(_updateProduct),
TypedReducer<ProductState, AddProductSuccess>(_addProduct),
TypedReducer<ProductState, LoadProductsSuccess>(_setLoadedProducts),
TypedReducer<ProductState, LoadProductsFailure>(_setNoProducts),
TypedReducer<ProductState, EditProductAction>(_selectProduct),
TypedReducer<ProductState, ArchiveProductRequest>(_archiveProductRequest),
TypedReducer<ProductState, ArchiveProductSuccess>(_archiveProductSuccess),
TypedReducer<ProductState, ArchiveProductFailure>(_archiveProductFailure),
TypedReducer<ProductState, DeleteProductRequest>(_deleteProductRequest),
TypedReducer<ProductState, DeleteProductSuccess>(_deleteProductSuccess),
TypedReducer<ProductState, DeleteProductFailure>(_deleteProductFailure),
TypedReducer<ProductState, RestoreProductRequest>(_restoreProductRequest),
TypedReducer<ProductState, RestoreProductSuccess>(_restoreProductSuccess),
TypedReducer<ProductState, RestoreProductFailure>(_restoreProductFailure),
]);
ProductState _archiveProductRequest(ProductState productState, ArchiveProductRequest action) {
var product = productState.map[action.productId].rebuild((b) => b
..archivedAt = DateTime.now().millisecondsSinceEpoch
);
return productState.rebuild((b) => b
..map[action.productId] = product
..editing.replace(product)
);
}
ProductState _archiveProductSuccess(ProductState productState, ArchiveProductSuccess action) {
return productState.rebuild((b) => b
..map[action.product.id] = action.product
..editing.replace(action.product)
);
}
ProductState _archiveProductFailure(ProductState productState, ArchiveProductFailure action) {
return productState.rebuild((b) => b
..map[action.product.id] = action.product
..editing.replace(action.product)
);
}
ProductState _deleteProductRequest(ProductState productState, DeleteProductRequest action) {
var product = productState.map[action.productId].rebuild((b) => b
..archivedAt = DateTime.now().millisecondsSinceEpoch
..isDeleted = true
);
return productState.rebuild((b) => b
..map[action.productId] = product
..editing.replace(product)
);
}
ProductState _deleteProductSuccess(ProductState productState, DeleteProductSuccess action) {
return productState.rebuild((b) => b
..map[action.product.id] = action.product
..editing.replace(action.product)
);
}
ProductState _deleteProductFailure(ProductState productState, DeleteProductFailure action) {
return productState.rebuild((b) => b
..map[action.product.id] = action.product
..editing.replace(action.product)
);
}
ProductState _restoreProductRequest(ProductState productState, RestoreProductRequest action) {
var product = productState.map[action.productId].rebuild((b) => b
..archivedAt = null
..isDeleted = false
);
return productState.rebuild((b) => b
..map[action.productId] = product
..editing.replace(product)
);
}
ProductState _restoreProductSuccess(ProductState productState, RestoreProductSuccess action) {
return productState.rebuild((b) => b
..map[action.product.id] = action.product
..editing.replace(action.product)
);
}
ProductState _restoreProductFailure(ProductState productState, RestoreProductFailure action) {
return productState.rebuild((b) => b
..map[action.product.id] = action.product
..editing.replace(action.product)
);
}
ProductState _addProduct(
ProductState productState, AddProductSuccess action) {
return productState.rebuild((b) => b
..map[action.product.id] = action.product
..list.add(action.product.id)
..editing.replace(action.product)
);
}
ProductState _updateProduct(
ProductState productState, SaveProductSuccess action) {
return productState.rebuild((b) => b
..map[action.product.id] = action.product
..editing.replace(action.product)
);
}
ProductState _setNoProducts(
ProductState productState, LoadProductsFailure action) {
return productState;
}
ProductState _selectProduct(
ProductState productState, EditProductAction action) {
return productState.rebuild((b) => b
..editing.replace(action.product));
}
ProductState _setLoadedProducts(
ProductState productState, LoadProductsSuccess action) {
return productState.rebuild(
(b) => b
..lastUpdated = DateTime.now().millisecondsSinceEpoch
..map.addAll(Map.fromIterable(
action.products,
key: (item) => item.id,
value: (item) => item,
))
..list.replace(action.products.map(
(product) => product.id).toList())
);
}