add error notification if user deletion is unsuccessful and add DELETE_USER_SUCCESS

This commit is contained in:
Maren Süwer
2018-07-19 11:23:20 +02:00
parent 2689a20ee8
commit 9593a18a55
3 changed files with 101 additions and 19 deletions

View File

@@ -51,9 +51,13 @@ class Users extends React.Component<Props, User> {
const mapStateToProps = state => { const mapStateToProps = state => {
const userEntries = getUsersFromState(state); const userEntries = getUsersFromState(state);
let error = null;
if (state.users && state.users.users) {
error = state.users.users.error
}
return { return {
userEntries, userEntries,
error: state.users.error error
}; };
}; };

View File

@@ -1,8 +1,17 @@
// @flow // @flow
import { apiClient, NOT_FOUND_ERROR } from "../../apiclient"; import {
import type { User } from "../types/User"; apiClient,
import type { UserEntry } from "../types/UserEntry"; NOT_FOUND_ERROR
import { Dispatch } from "redux"; } from "../../apiclient";
import type {
User
} from "../types/User";
import type {
UserEntry
} from "../types/UserEntry";
import {
Dispatch
} from "redux";
export const FETCH_USERS = "scm/users/FETCH"; export const FETCH_USERS = "scm/users/FETCH";
export const FETCH_USERS_SUCCESS = "scm/users/FETCH_SUCCESS"; export const FETCH_USERS_SUCCESS = "scm/users/FETCH_SUCCESS";
@@ -203,7 +212,7 @@ export function requestDeleteUser(user: User) {
}; };
} }
function deleteUserSuccess(user: User) { export function deleteUserSuccess(user: User) {
return { return {
type: DELETE_USER_SUCCESS, type: DELETE_USER_SUCCESS,
payload: user payload: user
@@ -229,7 +238,10 @@ export function deleteUser(user: User) {
dispatch(deleteUserSuccess(user)); dispatch(deleteUserSuccess(user));
dispatch(fetchUsers()); dispatch(fetchUsers());
}) })
.catch(err => dispatch(deleteUserFailure(user, err))); .catch(cause => {
const error = new Error(`could not delete user ${user.name}: ${cause.message}`);
dispatch(deleteUserFailure(user, error));
});
}; };
} }
@@ -276,6 +288,24 @@ export function editUser(user: User) {
}; };
} }
function deleteUserInUsersByNames(users:{}, userName: any){
let newUsers = {};
for(let username in users){
if(username != userName)
newUsers[username] = users[username];
}
return newUsers;
}
function deleteUserInEntries(users:[], userName: any){
let newUsers = [];
for(let user of users){
if(user != userName)
newUsers.push(user);
}
return newUsers;
}
const reduceUsersByNames = ( const reduceUsersByNames = (
state: any, state: any,
username: string, username: string,
@@ -332,8 +362,7 @@ export default function reducer(state: any = {}, action: any = {}) {
}; };
case FETCH_USER_SUCCESS: case FETCH_USER_SUCCESS:
const ubn = extractUsersByNames( const ubn = extractUsersByNames(
[action.payload], [action.payload], [action.payload.name],
[action.payload.name],
state.usersByNames state.usersByNames
); );
return { return {
@@ -345,7 +374,17 @@ export default function reducer(state: any = {}, action: any = {}) {
}, },
usersByNames: ubn usersByNames: ubn
}; };
case DELETE_USER_SUCCESS:
const newUserByNames = deleteUserInUsersByNames(state.usersByNames, [action.payload.name]);
const newUserEntries = deleteUserInEntries(state.users.entries, [action.payload.name]);
return {
...state,
users: {
...state.users,
entries: newUserEntries
},
usersByNames: newUserByNames
}
case FETCH_USERS_FAILURE: case FETCH_USERS_FAILURE:
case DELETE_USER_FAILURE: case DELETE_USER_FAILURE:
const newState = reduceUsersByNames(state, action.payload.user.name, { const newState = reduceUsersByNames(state, action.payload.user.name, {

View File

@@ -23,7 +23,8 @@ import {
DELETE_USER_SUCCESS, DELETE_USER_SUCCESS,
DELETE_USER_FAILURE, DELETE_USER_FAILURE,
deleteUser, deleteUser,
updateUserFailure updateUserFailure,
deleteUserSuccess
} from "./users"; } from "./users";
import reducer from "./users"; import reducer from "./users";
@@ -365,6 +366,44 @@ describe("users reducer", () => {
expect(ford.loading).toBeFalsy(); expect(ford.loading).toBeFalsy();
}); });
it("should delete deleted user in users in state if delete user action is successful", () => {
const state = {
users: {
entries: [
"zaphod",
"ford"
]
}
};
const newState = reducer(state, deleteUserSuccess(userZaphod));
expect(newState.users.entries).toContain("ford");
expect(newState.users.entries).not.toContain("zaphod");
});
it("should delete deleted user in usersByNames in state if delete user action is successful", () => {
const state = {
users: {
entries: [
"zaphod",
"ford"
]
},
usersByNames: {
zaphod: {
entry: userZaphod
},
ford: {
entry: userFord
}
}
};
const newState = reducer(state, deleteUserSuccess(userZaphod));
const ford = newState.usersByNames["ford"];
const zaphod = newState.usersByNames["zaphod"];
expect(zaphod).toBeUndefined();
expect(ford.entry).toBe(userFord);
});
it("should set global error state if one user could not be deleted", () => { it("should set global error state if one user could not be deleted", () => {
const state = { const state = {
users: { users: {