// Package imports: import 'package:built_collection/built_collection.dart'; import 'package:redux/redux.dart'; // Project imports: import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; import 'package:invoiceninja_flutter/redux/settings/settings_actions.dart'; import 'package:invoiceninja_flutter/redux/ui/entity_ui_state.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; import 'package:invoiceninja_flutter/redux/user/user_actions.dart'; import 'package:invoiceninja_flutter/redux/user/user_state.dart'; EntityUIState userUIReducer(UserUIState state, dynamic action) { return state.rebuild((b) => b ..listUIState.replace(userListReducer(state.listUIState, action)) ..editing.replace(editingReducer(state.editing, action)!) ..selectedId = selectedIdReducer(state.selectedId, action) ..forceSelected = forceSelectedReducer(state.forceSelected, action)); } final forceSelectedReducer = combineReducers([ TypedReducer((completer, action) => true), TypedReducer((completer, action) => false), TypedReducer((completer, action) => false), TypedReducer((completer, action) => false), TypedReducer((completer, action) => false), TypedReducer((completer, action) => false), TypedReducer((completer, action) => false), TypedReducer((completer, action) => false), ]); Reducer selectedIdReducer = combineReducers([ TypedReducer((completer, action) => ''), TypedReducer((completer, action) => ''), TypedReducer((selectedId, action) => action.entityType == EntityType.user ? action.entityId : selectedId), TypedReducer( (String? selectedId, action) => action.userId), TypedReducer( (String? selectedId, action) => action.user.id), TypedReducer( (selectedId, action) => action.clearSelection ? '' : selectedId), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => action.entityType == EntityType.user ? '' : selectedId), TypedReducer( (selectedId, action) => action.clearSelection ? '' : action.entityType == EntityType.user ? action.entityId : selectedId), ]); final editingReducer = combineReducers([ TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer((users, action) { return action.users[0]; }), TypedReducer((users, action) { return action.users[0]; }), TypedReducer((users, action) { return action.users[0]; }), TypedReducer(_updateEditing), TypedReducer((user, action) { return action.user.rebuild((b) => b..isChanged = true); }), TypedReducer(_clearEditing), ]); UserEntity _clearEditing(UserEntity? user, dynamic action) { return UserEntity(); } UserEntity? _updateEditing(UserEntity? user, dynamic action) { return action.user; } final userListReducer = combineReducers([ TypedReducer(_sortUsers), TypedReducer(_filterUsersByState), TypedReducer(_filterUsers), TypedReducer(_filterUsersByCustom1), TypedReducer(_filterUsersByCustom2), TypedReducer(_filterUsersByCustom3), TypedReducer(_filterUsersByCustom4), TypedReducer(_startListMultiselect), TypedReducer(_addToListMultiselect), TypedReducer( _removeFromListMultiselect), TypedReducer(_clearListMultiselect), TypedReducer(_viewUserList), TypedReducer( (state, action) => state.rebuild((b) => b ..filter = null ..filterClearedAt = DateTime.now().millisecondsSinceEpoch)), ]); ListUIState _viewUserList(ListUIState userListState, ViewUserList action) { return userListState.rebuild((b) => b ..selectedIds = null ..filter = null ..filterClearedAt = DateTime.now().millisecondsSinceEpoch); } ListUIState _filterUsersByCustom1( ListUIState userListState, FilterUsersByCustom1 action) { if (userListState.custom1Filters.contains(action.value)) { return userListState.rebuild((b) => b..custom1Filters.remove(action.value)); } else { return userListState.rebuild((b) => b..custom1Filters.add(action.value)); } } ListUIState _filterUsersByCustom2( ListUIState userListState, FilterUsersByCustom2 action) { if (userListState.custom2Filters.contains(action.value)) { return userListState.rebuild((b) => b..custom2Filters.remove(action.value)); } else { return userListState.rebuild((b) => b..custom2Filters.add(action.value)); } } ListUIState _filterUsersByCustom3( ListUIState userListState, FilterUsersByCustom3 action) { if (userListState.custom3Filters.contains(action.value)) { return userListState.rebuild((b) => b..custom3Filters.remove(action.value)); } else { return userListState.rebuild((b) => b..custom3Filters.add(action.value)); } } ListUIState _filterUsersByCustom4( ListUIState userListState, FilterUsersByCustom4 action) { if (userListState.custom4Filters.contains(action.value)) { return userListState.rebuild((b) => b..custom4Filters.remove(action.value)); } else { return userListState.rebuild((b) => b..custom4Filters.add(action.value)); } } ListUIState _filterUsersByState( ListUIState userListState, FilterUsersByState action) { if (userListState.stateFilters.contains(action.state)) { return userListState.rebuild((b) => b..stateFilters.remove(action.state)); } else { return userListState.rebuild((b) => b..stateFilters.add(action.state)); } } ListUIState _filterUsers(ListUIState userListState, FilterUsers action) { return userListState.rebuild((b) => b ..filter = action.filter ..filterClearedAt = action.filter == null ? DateTime.now().millisecondsSinceEpoch : userListState.filterClearedAt); } ListUIState _sortUsers(ListUIState userListState, SortUsers action) { return userListState.rebuild((b) => b ..sortAscending = b.sortField != action.field || !b.sortAscending! ..sortField = action.field); } ListUIState _startListMultiselect( ListUIState userListState, StartUserMultiselect action) { return userListState.rebuild((b) => b..selectedIds = ListBuilder()); } ListUIState _addToListMultiselect( ListUIState userListState, AddToUserMultiselect action) { return userListState.rebuild((b) => b..selectedIds.add(action.entity!.id)); } ListUIState _removeFromListMultiselect( ListUIState userListState, RemoveFromUserMultiselect action) { return userListState.rebuild((b) => b..selectedIds.remove(action.entity!.id)); } ListUIState _clearListMultiselect( ListUIState userListState, ClearUserMultiselect action) { return userListState.rebuild((b) => b..selectedIds = null); } final usersReducer = combineReducers([ TypedReducer(_updateUser), TypedReducer(_updateAuthUser), TypedReducer(_connectOAuthUser), TypedReducer(_disconnectOAuthUser), TypedReducer(_connectGmailUser), TypedReducer(_disconnectOAuthMailer), TypedReducer(_addUser), TypedReducer(_setLoadedUsers), TypedReducer(_setLoadedUser), TypedReducer(_setLoadedCompany), TypedReducer(_archiveUserSuccess), TypedReducer(_deleteUserSuccess), TypedReducer(_restoreUserSuccess), TypedReducer(_removeUserSuccess), ]); UserState _archiveUserSuccess(UserState userState, ArchiveUserSuccess action) { return userState.rebuild((b) { for (final user in action.users) { b.map[user.id] = user; } }); } UserState _deleteUserSuccess(UserState userState, DeleteUserSuccess action) { return userState.rebuild((b) { for (final user in action.users) { b.map[user.id] = user; } }); } UserState _restoreUserSuccess(UserState userState, RestoreUserSuccess action) { return userState.rebuild((b) { for (final user in action.users) { b.map[user.id] = user; } }); } UserState _removeUserSuccess(UserState userState, RemoveUserSuccess action) { return userState.rebuild((b) => b ..map.remove(action.userId) ..list.remove(action.userId)); } UserState _addUser(UserState userState, AddUserSuccess action) { return userState.rebuild((b) => b ..map[action.user.id] = action.user ..list.add(action.user.id)); } UserState _updateUser(UserState userState, SaveUserSuccess action) { return userState.rebuild((b) => b..map[action.user.id] = action.user); } UserState _updateAuthUser(UserState userState, SaveAuthUserSuccess action) { return userState.rebuild((b) => b..map[action.user.id] = action.user); } UserState _connectOAuthUser( UserState userState, ConnectOAuthUserSuccess action) { return userState.rebuild((b) => b..map[action.user.id] = action.user); } UserState _disconnectOAuthUser( UserState userState, DisconnectOAuthUserSuccess action) { return userState.rebuild((b) => b..map[action.user.id] = action.user); } UserState _disconnectOAuthMailer( UserState userState, DisconnectOAuthMailerSuccess action) { return userState.rebuild((b) => b..map[action.user.id] = action.user); } UserState _connectGmailUser( UserState userState, ConnecGmailUserSuccess action) { return userState.rebuild((b) => b..map[action.user.id] = action.user); } UserState _setLoadedUser(UserState userState, LoadUserSuccess action) { return userState.rebuild((b) => b..map[action.user.id] = action.user); } UserState _setLoadedUsers(UserState userState, LoadUsersSuccess action) { final state = userState.rebuild((b) => b ..map.addAll(Map.fromIterable( action.users, key: (dynamic item) => item.id, value: (dynamic item) => item, ))); return state.rebuild((b) => b..list.replace(state.map.keys)); } UserState _setLoadedCompany(UserState userState, LoadCompanySuccess action) { final state = userState.rebuild((b) => b ..map.addAll(Map.fromIterable( action.userCompany.company.users, key: (dynamic item) => item.id, value: (dynamic item) => item, ))); return state.rebuild((b) => b..list.replace(state.map.keys)); }