PromucFlow_constructor/app/client/src/reducers/uiReducers/usersReducer.ts
2020-10-19 19:04:55 +05:30

111 lines
2.6 KiB
TypeScript

import _ from "lodash";
import { createReducer } from "utils/AppsmithUtils";
import {
ReduxAction,
ReduxActionTypes,
ReduxActionErrorTypes,
} from "constants/ReduxActionConstants";
import { DefaultCurrentUserDetails, User } from "constants/userConstants";
const initialState: UsersReduxState = {
loadingStates: {
fetchingUsers: false,
fetchingUser: false,
},
list: [],
users: [],
error: "",
current: undefined,
currentUser: undefined,
};
const usersReducer = createReducer(initialState, {
[ReduxActionTypes.FETCH_USER_INIT]: (state: UsersReduxState) => ({
...state,
loadingStates: {
...state.loadingStates,
fetchingUser: true,
},
}),
[ReduxActionTypes.FETCH_USER_DETAILS_SUCCESS]: (
state: UsersReduxState,
action: ReduxAction<User>,
) => {
const users = [...state.users];
const userIndex = _.findIndex(users, { username: action.payload.username });
if (userIndex > -1) {
users[userIndex] = action.payload;
} else {
users.push(action.payload);
}
return {
...state,
loadingStates: {
...state.loadingStates,
fetchingUser: false,
},
users,
currentUser: action.payload,
};
},
[ReduxActionTypes.FETCH_USER_SUCCESS]: (
state: UsersReduxState,
action: ReduxAction<User>,
) => {
const users = [...state.list];
const userIndex = _.findIndex(users, { username: action.payload.username });
if (userIndex > -1) {
users[userIndex] = action.payload;
} else {
users.push(action.payload);
}
return {
...state,
loadingStates: {
...state.loadingStates,
fetchingUser: false,
},
list: users,
};
},
[ReduxActionErrorTypes.FETCH_USER_DETAILS_ERROR]: (
state: UsersReduxState,
action: ReduxAction<{ error: string }>,
) => ({
...initialState,
error: action.payload.error,
}),
[ReduxActionErrorTypes.FETCH_USER_ERROR]: (state: UsersReduxState) => ({
...state,
loadingStates: { ...state.loadingStates, fetchingUser: false },
}),
[ReduxActionTypes.SET_CURRENT_USER_SUCCESS]: (
state: UsersReduxState,
action: ReduxAction<User>,
) => ({
...state,
current: action.payload,
}),
[ReduxActionTypes.LOGOUT_USER_SUCCESS]: (state: UsersReduxState) => ({
...state,
current: undefined,
currentUser: DefaultCurrentUserDetails,
users: [DefaultCurrentUserDetails],
}),
});
export interface UsersReduxState {
current?: User;
list: User[];
loadingStates: {
fetchingUser: boolean;
fetchingUsers: boolean;
};
users: User[];
currentUser?: User;
error: string;
}
export default usersReducer;