PromucFlow_constructor/app/client/src/reducers/uiReducers/usersReducer.ts
balajisoundar 95c729d7d1
feat: Introduce a Welcome screen and a form to create a super user, on a fresh installation (#6806)
This commit introduces a super user signup form, that appears only on an empty instance, to create a super user.

fixes: #6934
2021-09-12 22:06:43 +05:30

175 lines
4.1 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,
featureFlagFetched: false,
};
const usersReducer = createReducer(initialState, {
[ReduxActionTypes.FETCH_USER_INIT]: (state: UsersReduxState) => ({
...state,
loadingStates: {
...state.loadingStates,
fetchingUser: true,
},
}),
[ReduxActionTypes.PROP_PANE_MOVED]: (
state: UsersReduxState,
action: ReduxAction<PropertyPanePositionConfig>,
) => ({
...state,
propPanePreferences: {
isMoved: true,
position: {
...action.payload.position,
},
},
}),
[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.UPDATE_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,
action: ReduxAction<boolean>,
) => ({
...state,
current: undefined,
currentUser: {
...DefaultCurrentUserDetails,
emptyInstance: action.payload,
},
users: [
{
...DefaultCurrentUserDetails,
emptyInstance: action.payload,
},
],
}),
[ReduxActionTypes.FETCH_FEATURE_FLAGS_SUCCESS]: (state: UsersReduxState) => ({
...state,
featureFlagFetched: true,
}),
[ReduxActionErrorTypes.FETCH_FEATURE_FLAGS_ERROR]: (
state: UsersReduxState,
) => ({
...state,
featureFlagFetched: true,
}),
});
export interface PropertyPanePositionConfig {
isMoved: boolean;
position: {
left: number;
top: number;
};
}
export interface UsersReduxState {
current?: User;
list: User[];
loadingStates: {
fetchingUser: boolean;
fetchingUsers: boolean;
};
users: User[];
currentUser?: User;
error: string;
propPanePreferences?: PropertyPanePositionConfig;
featureFlagFetched: boolean;
}
export default usersReducer;