317 lines
9.8 KiB
Dart
317 lines
9.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
|
|
import 'package:invoiceninja_flutter/redux/auth/auth_actions.dart';
|
|
import 'package:redux/redux.dart';
|
|
import 'package:invoiceninja_flutter/utils/platforms.dart';
|
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
|
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
|
|
import 'package:invoiceninja_flutter/ui/user/user_screen.dart';
|
|
import 'package:invoiceninja_flutter/ui/user/edit/user_edit_vm.dart';
|
|
import 'package:invoiceninja_flutter/ui/user/view/user_view_vm.dart';
|
|
import 'package:invoiceninja_flutter/redux/user/user_actions.dart';
|
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
|
import 'package:invoiceninja_flutter/data/repositories/user_repository.dart';
|
|
|
|
import 'package:invoiceninja_flutter/main_app.dart';
|
|
|
|
List<Middleware<AppState>> createStoreUsersMiddleware([
|
|
UserRepository repository = const UserRepository(),
|
|
]) {
|
|
final viewUserList = _viewUserList();
|
|
final viewUser = _viewUser();
|
|
final editUser = _editUser();
|
|
final loadUsers = _loadUsers(repository);
|
|
final loadUser = _loadUser(repository);
|
|
final saveUser = _saveUser(repository);
|
|
final archiveUser = _archiveUser(repository);
|
|
final deleteUser = _deleteUser(repository);
|
|
final restoreUser = _restoreUser(repository);
|
|
final removeUser = _removeUser(repository);
|
|
final resendInvite = _resendInvite(repository);
|
|
|
|
return [
|
|
TypedMiddleware<AppState, ViewUserList>(viewUserList),
|
|
TypedMiddleware<AppState, ViewUser>(viewUser),
|
|
TypedMiddleware<AppState, EditUser>(editUser),
|
|
TypedMiddleware<AppState, LoadUsers>(loadUsers),
|
|
TypedMiddleware<AppState, LoadUser>(loadUser),
|
|
TypedMiddleware<AppState, SaveUserRequest>(saveUser),
|
|
TypedMiddleware<AppState, ArchiveUserRequest>(archiveUser),
|
|
TypedMiddleware<AppState, DeleteUserRequest>(deleteUser),
|
|
TypedMiddleware<AppState, RestoreUserRequest>(restoreUser),
|
|
TypedMiddleware<AppState, RemoveUserRequest>(removeUser),
|
|
TypedMiddleware<AppState, ResendInviteRequest>(resendInvite),
|
|
];
|
|
}
|
|
|
|
Middleware<AppState> _editUser() {
|
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
|
final action = dynamicAction as EditUser;
|
|
|
|
next(action);
|
|
|
|
store.dispatch(UpdateCurrentRoute(UserEditScreen.route));
|
|
|
|
if (store.state.prefState.isMobile) {
|
|
navigatorKey.currentState.pushNamed(UserEditScreen.route);
|
|
}
|
|
};
|
|
}
|
|
|
|
Middleware<AppState> _viewUser() {
|
|
return (Store<AppState> store, dynamic dynamicAction,
|
|
NextDispatcher next) async {
|
|
final action = dynamicAction as ViewUser;
|
|
|
|
next(action);
|
|
|
|
store.dispatch(UpdateCurrentRoute(UserViewScreen.route));
|
|
|
|
if (store.state.prefState.isMobile) {
|
|
navigatorKey.currentState.pushNamed(UserViewScreen.route);
|
|
}
|
|
};
|
|
}
|
|
|
|
Middleware<AppState> _viewUserList() {
|
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
|
final action = dynamicAction as ViewUserList;
|
|
|
|
next(action);
|
|
|
|
if (store.state.isStale) {
|
|
store.dispatch(RefreshData());
|
|
}
|
|
|
|
store.dispatch(UpdateCurrentRoute(UserScreen.route));
|
|
|
|
if (store.state.prefState.isMobile) {
|
|
navigatorKey.currentState.pushNamedAndRemoveUntil(
|
|
UserScreen.route, (Route<dynamic> route) => false);
|
|
}
|
|
};
|
|
}
|
|
|
|
Middleware<AppState> _archiveUser(UserRepository repository) {
|
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
|
final action = dynamicAction as ArchiveUserRequest;
|
|
final prevUsers =
|
|
action.userIds.map((id) => store.state.userState.map[id]).toList();
|
|
|
|
repository
|
|
.bulkAction(store.state.credentials, action.userIds,
|
|
EntityAction.archive, action.password, action.idToken)
|
|
.then((List<UserEntity> users) {
|
|
store.dispatch(ArchiveUserSuccess(users));
|
|
if (action.completer != null) {
|
|
action.completer.complete(null);
|
|
}
|
|
}).catchError((Object error) {
|
|
print(error);
|
|
store.dispatch(ArchiveUserFailure(prevUsers));
|
|
if ('$error'.contains('412')) {
|
|
store.dispatch(UserUnverifiedPassword());
|
|
}
|
|
if (action.completer != null) {
|
|
action.completer.completeError(error);
|
|
}
|
|
});
|
|
|
|
next(action);
|
|
};
|
|
}
|
|
|
|
Middleware<AppState> _deleteUser(UserRepository repository) {
|
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
|
final action = dynamicAction as DeleteUserRequest;
|
|
final prevUsers =
|
|
action.userIds.map((id) => store.state.userState.map[id]).toList();
|
|
|
|
repository
|
|
.bulkAction(store.state.credentials, action.userIds,
|
|
EntityAction.delete, action.password, action.idToken)
|
|
.then((List<UserEntity> users) {
|
|
store.dispatch(DeleteUserSuccess(users));
|
|
if (action.completer != null) {
|
|
action.completer.complete(null);
|
|
}
|
|
}).catchError((Object error) {
|
|
print(error);
|
|
store.dispatch(DeleteUserFailure(prevUsers));
|
|
if ('$error'.contains('412')) {
|
|
store.dispatch(UserUnverifiedPassword());
|
|
}
|
|
if (action.completer != null) {
|
|
action.completer.completeError(error);
|
|
}
|
|
});
|
|
|
|
next(action);
|
|
};
|
|
}
|
|
|
|
Middleware<AppState> _restoreUser(UserRepository repository) {
|
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
|
final action = dynamicAction as RestoreUserRequest;
|
|
final prevUsers =
|
|
action.userIds.map((id) => store.state.userState.map[id]).toList();
|
|
|
|
repository
|
|
.bulkAction(store.state.credentials, action.userIds,
|
|
EntityAction.restore, action.password, action.idToken)
|
|
.then((List<UserEntity> users) {
|
|
store.dispatch(RestoreUserSuccess(users));
|
|
if (action.completer != null) {
|
|
action.completer.complete(null);
|
|
}
|
|
}).catchError((Object error) {
|
|
print(error);
|
|
store.dispatch(RestoreUserFailure(prevUsers));
|
|
if ('$error'.contains('412')) {
|
|
store.dispatch(UserUnverifiedPassword());
|
|
}
|
|
if (action.completer != null) {
|
|
action.completer.completeError(error);
|
|
}
|
|
});
|
|
|
|
next(action);
|
|
};
|
|
}
|
|
|
|
Middleware<AppState> _removeUser(UserRepository repository) {
|
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
|
final action = dynamicAction as RemoveUserRequest;
|
|
|
|
repository
|
|
.detachFromCompany(
|
|
store.state.credentials,
|
|
action.userId,
|
|
action.password,
|
|
action.idToken,
|
|
)
|
|
.then((_) {
|
|
store.dispatch(RemoveUserSuccess(action.userId));
|
|
if (action.completer != null) {
|
|
action.completer.complete(null);
|
|
}
|
|
}).catchError((Object error) {
|
|
print(error);
|
|
store.dispatch(RemoveUserFailure(error));
|
|
if (action.completer != null) {
|
|
action.completer.completeError(error);
|
|
}
|
|
});
|
|
|
|
next(action);
|
|
};
|
|
}
|
|
|
|
Middleware<AppState> _resendInvite(UserRepository repository) {
|
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
|
final action = dynamicAction as ResendInviteRequest;
|
|
|
|
repository
|
|
.resendInvite(
|
|
store.state.credentials,
|
|
action.userId,
|
|
action.password,
|
|
action.idToken,
|
|
)
|
|
.then((_) {
|
|
store.dispatch(ResendInviteSuccess(action.userId));
|
|
if (action.completer != null) {
|
|
action.completer.complete(null);
|
|
}
|
|
}).catchError((Object error) {
|
|
print(error);
|
|
store.dispatch(ResendInviteFailure(error));
|
|
if (action.completer != null) {
|
|
action.completer.completeError(error);
|
|
}
|
|
});
|
|
|
|
next(action);
|
|
};
|
|
}
|
|
|
|
Middleware<AppState> _saveUser(UserRepository repository) {
|
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
|
final action = dynamicAction as SaveUserRequest;
|
|
repository
|
|
.saveData(store.state.credentials, action.user, action.password,
|
|
action.idToken)
|
|
.then((UserEntity user) {
|
|
if (action.user.isNew) {
|
|
store.dispatch(AddUserSuccess(user));
|
|
} else {
|
|
store.dispatch(SaveUserSuccess(user));
|
|
}
|
|
action.completer.complete(user);
|
|
}).catchError((Object error) {
|
|
print(error);
|
|
store.dispatch(SaveUserFailure(error));
|
|
if ('$error'.contains('412')) {
|
|
store.dispatch(UserUnverifiedPassword());
|
|
}
|
|
action.completer.completeError(error);
|
|
});
|
|
|
|
next(action);
|
|
};
|
|
}
|
|
|
|
Middleware<AppState> _loadUser(UserRepository repository) {
|
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
|
final action = dynamicAction as LoadUser;
|
|
final AppState state = store.state;
|
|
|
|
store.dispatch(LoadUserRequest());
|
|
repository.loadItem(state.credentials, action.userId).then((user) {
|
|
store.dispatch(LoadUserSuccess(user));
|
|
|
|
if (action.completer != null) {
|
|
action.completer.complete(null);
|
|
}
|
|
}).catchError((Object error) {
|
|
print(error);
|
|
store.dispatch(LoadUserFailure(error));
|
|
if (action.completer != null) {
|
|
action.completer.completeError(error);
|
|
}
|
|
});
|
|
|
|
next(action);
|
|
};
|
|
}
|
|
|
|
Middleware<AppState> _loadUsers(UserRepository repository) {
|
|
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
|
|
final action = dynamicAction as LoadUsers;
|
|
final AppState state = store.state;
|
|
|
|
store.dispatch(LoadUsersRequest());
|
|
repository.loadList(state.credentials).then((data) {
|
|
store.dispatch(LoadUsersSuccess(data));
|
|
|
|
if (action.completer != null) {
|
|
action.completer.complete(null);
|
|
}
|
|
/*
|
|
if (state.userState.isStale) {
|
|
store.dispatch(LoadUsers());
|
|
}
|
|
*/
|
|
}).catchError((Object error) {
|
|
print(error);
|
|
store.dispatch(LoadUsersFailure(error));
|
|
if (action.completer != null) {
|
|
action.completer.completeError(error);
|
|
}
|
|
});
|
|
|
|
next(action);
|
|
};
|
|
}
|