invoice/lib/redux/design/design_reducer.dart

276 lines
9.8 KiB
Dart

import 'package:redux/redux.dart';
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/company/company_actions.dart';
import 'package:invoiceninja_flutter/redux/ui/entity_ui_state.dart';
import 'package:invoiceninja_flutter/redux/design/design_actions.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
import 'package:invoiceninja_flutter/redux/design/design_actions.dart';
import 'package:invoiceninja_flutter/redux/design/design_state.dart';
import 'package:invoiceninja_flutter/data/models/entities.dart';
EntityUIState designUIReducer(DesignUIState state, dynamic action) {
return state.rebuild((b) => b
..listUIState.replace(designListReducer(state.listUIState, action))
..editing.replace(editingReducer(state.editing, action))
..selectedId = selectedIdReducer(state.selectedId, action));
}
Reducer<String> selectedIdReducer = combineReducers([
TypedReducer<String, ViewDesign>(
(String selectedId, dynamic action) => action.designId),
TypedReducer<String, AddDesignSuccess>(
(String selectedId, dynamic action) => action.design.id),
TypedReducer<String, SelectCompany>((selectedId, action) => ''),
]);
final editingReducer = combineReducers<DesignEntity>([
TypedReducer<DesignEntity, SaveDesignSuccess>(_updateEditing),
TypedReducer<DesignEntity, AddDesignSuccess>(_updateEditing),
TypedReducer<DesignEntity, RestoreDesignSuccess>((designs, action) {
return action.designs[0];
}),
TypedReducer<DesignEntity, ArchiveDesignSuccess>((designs, action) {
return action.designs[0];
}),
TypedReducer<DesignEntity, DeleteDesignSuccess>((designs, action) {
return action.designs[0];
}),
TypedReducer<DesignEntity, EditDesign>(_updateEditing),
TypedReducer<DesignEntity, UpdateDesign>((design, action) {
return action.design.rebuild((b) => b..isChanged = true);
}),
TypedReducer<DesignEntity, SelectCompany>(_clearEditing),
TypedReducer<DesignEntity, DiscardChanges>(_clearEditing),
]);
DesignEntity _clearEditing(DesignEntity design, dynamic action) {
return DesignEntity();
}
DesignEntity _updateEditing(DesignEntity design, dynamic action) {
return action.design;
}
final designListReducer = combineReducers<ListUIState>([
TypedReducer<ListUIState, SortDesigns>(_sortDesigns),
TypedReducer<ListUIState, FilterDesignsByState>(_filterDesignsByState),
TypedReducer<ListUIState, FilterDesigns>(_filterDesigns),
TypedReducer<ListUIState, FilterDesignsByCustom1>(_filterDesignsByCustom1),
TypedReducer<ListUIState, FilterDesignsByCustom2>(_filterDesignsByCustom2),
TypedReducer<ListUIState, FilterDesignsByEntity>(_filterDesignsByClient),
TypedReducer<ListUIState, StartDesignMultiselect>(_startListMultiselect),
TypedReducer<ListUIState, AddToDesignMultiselect>(_addToListMultiselect),
TypedReducer<ListUIState, RemoveFromDesignMultiselect>(
_removeFromListMultiselect),
TypedReducer<ListUIState, ClearDesignMultiselect>(_clearListMultiselect),
]);
ListUIState _filterDesignsByClient(
ListUIState designListState, FilterDesignsByEntity action) {
return designListState.rebuild((b) => b
..filterEntityId = action.entityId
..filterEntityType = action.entityType);
}
ListUIState _filterDesignsByCustom1(
ListUIState designListState, FilterDesignsByCustom1 action) {
if (designListState.custom1Filters.contains(action.value)) {
return designListState
.rebuild((b) => b..custom1Filters.remove(action.value));
} else {
return designListState.rebuild((b) => b..custom1Filters.add(action.value));
}
}
ListUIState _filterDesignsByCustom2(
ListUIState designListState, FilterDesignsByCustom2 action) {
if (designListState.custom2Filters.contains(action.value)) {
return designListState
.rebuild((b) => b..custom2Filters.remove(action.value));
} else {
return designListState.rebuild((b) => b..custom2Filters.add(action.value));
}
}
ListUIState _filterDesignsByState(
ListUIState designListState, FilterDesignsByState action) {
if (designListState.stateFilters.contains(action.state)) {
return designListState.rebuild((b) => b..stateFilters.remove(action.state));
} else {
return designListState.rebuild((b) => b..stateFilters.add(action.state));
}
}
ListUIState _filterDesigns(ListUIState designListState, FilterDesigns action) {
return designListState.rebuild((b) => b
..filter = action.filter
..filterClearedAt = action.filter == null
? DateTime.now().millisecondsSinceEpoch
: designListState.filterClearedAt);
}
ListUIState _sortDesigns(ListUIState designListState, SortDesigns action) {
return designListState.rebuild((b) => b
..sortAscending = b.sortField != action.field || !b.sortAscending
..sortField = action.field);
}
ListUIState _startListMultiselect(
ListUIState productListState, StartDesignMultiselect action) {
return productListState.rebuild((b) => b..selectedIds = ListBuilder());
}
ListUIState _addToListMultiselect(
ListUIState productListState, AddToDesignMultiselect action) {
return productListState.rebuild((b) => b..selectedIds.add(action.entity.id));
}
ListUIState _removeFromListMultiselect(
ListUIState productListState, RemoveFromDesignMultiselect action) {
return productListState
.rebuild((b) => b..selectedIds.remove(action.entity.id));
}
ListUIState _clearListMultiselect(
ListUIState productListState, ClearDesignMultiselect action) {
return productListState.rebuild((b) => b..selectedIds = null);
}
final designsReducer = combineReducers<DesignState>([
TypedReducer<DesignState, SaveDesignSuccess>(_updateDesign),
TypedReducer<DesignState, AddDesignSuccess>(_addDesign),
TypedReducer<DesignState, LoadDesignsSuccess>(_setLoadedDesigns),
TypedReducer<DesignState, LoadDesignSuccess>(_setLoadedDesign),
TypedReducer<DesignState, ArchiveDesignRequest>(_archiveDesignRequest),
TypedReducer<DesignState, ArchiveDesignSuccess>(_archiveDesignSuccess),
TypedReducer<DesignState, ArchiveDesignFailure>(_archiveDesignFailure),
TypedReducer<DesignState, DeleteDesignRequest>(_deleteDesignRequest),
TypedReducer<DesignState, DeleteDesignSuccess>(_deleteDesignSuccess),
TypedReducer<DesignState, DeleteDesignFailure>(_deleteDesignFailure),
TypedReducer<DesignState, RestoreDesignRequest>(_restoreDesignRequest),
TypedReducer<DesignState, RestoreDesignSuccess>(_restoreDesignSuccess),
TypedReducer<DesignState, RestoreDesignFailure>(_restoreDesignFailure),
]);
DesignState _archiveDesignRequest(
DesignState designState, ArchiveDesignsRequest action) {
final designs = action.designIds.map((id) => designState.map[id]).toList();
for (int i = 0; i < designs.length; i++) {
designs[i] = designs[i]
.rebuild((b) => b..archivedAt = DateTime.now().millisecondsSinceEpoch);
}
return designState.rebuild((b) {
for (final design in designs) {
b.map[design.id] = design;
}
});
}
DesignState _archiveDesignSuccess(
DesignState designState, ArchiveDesignsSuccess action) {
return designState.rebuild((b) {
for (final design in action.designs) {
b.map[design.id] = design;
}
});
}
DesignState _archiveDesignFailure(
DesignState designState, ArchiveDesignsFailure action) {
return designState.rebuild((b) {
for (final design in action.designs) {
b.map[design.id] = design;
}
});
}
DesignState _deleteDesignRequest(
DesignState designState, DeleteDesignsRequest action) {
final designs = action.designIds.map((id) => designState.map[id]).toList();
for (int i = 0; i < designs.length; i++) {
designs[i] = designs[i].rebuild((b) => b
..archivedAt = DateTime.now().millisecondsSinceEpoch
..isDeleted = true);
}
return designState.rebuild((b) {
for (final design in designs) {
b.map[design.id] = design;
}
});
}
DesignState _deleteDesignSuccess(
DesignState designState, DeleteDesignsSuccess action) {
return designState.rebuild((b) {
for (final design in action.designs) {
b.map[design.id] = design;
}
});
}
DesignState _deleteDesignFailure(
DesignState designState, DeleteDesignsFailure action) {
return designState.rebuild((b) {
for (final design in action.designs) {
b.map[design.id] = design;
}
});
}
DesignState _restoreDesignRequest(
DesignState designState, RestoreDesignsRequest action) {
final designs = action.designIds.map((id) => designState.map[id]).toList();
for (int i = 0; i < designs.length; i++) {
designs[i] = designs[i].rebuild((b) => b
..archivedAt = null
..isDeleted = false);
}
return designState.rebuild((b) {
for (final design in designs) {
b.map[design.id] = design;
}
});
}
DesignState _restoreDesignSuccess(
DesignState designState, RestoreDesignsSuccess action) {
return designState.rebuild((b) {
for (final design in action.designs) {
b.map[design.id] = design;
}
});
}
DesignState _restoreDesignFailure(
DesignState designState, RestoreDesignsFailure action) {
return designState.rebuild((b) {
for (final design in action.designs) {
b.map[design.id] = design;
}
});
}
DesignState _addDesign(DesignState designState, AddDesignSuccess action) {
return designState.rebuild((b) => b
..map[action.design.id] = action.design
..list.add(action.design.id));
}
DesignState _updateDesign(DesignState designState, SaveDesignSuccess action) {
return designState.rebuild((b) => b..map[action.design.id] = action.design);
}
DesignState _setLoadedDesign(
DesignState designState, LoadDesignSuccess action) {
return designState.rebuild((b) => b..map[action.design.id] = action.design);
}
DesignState _setLoadedDesigns(
DesignState designState, LoadDesignsSuccess action) =>
designState.loadDesigns(action.designs);