src/app/ReduxStore.js (116 lines of code) (raw):
import {createStore} from 'redux';
import {createAction, createReducer} from 'redux-act';
import Selection from '@jetbrains/ring-ui/components/table/selection';
export const setHubURL = createAction();
export const selectUser = createAction();
export const setUserDetails = createAction();
export const requestUsers = createAction();
export const setUsers = createAction();
export const requestMoreUsers = createAction();
export const setMoreUsers = createAction();
export const selectGroups = createAction();
export const selectTeams = createAction();
export const selectRoles = createAction();
export const selectLogins = createAction();
export const startRevocation = createAction();
export const finishRevocation = createAction();
export const cancel = createAction();
const select = (data, filter) => new Selection({
data: data || [],
selected: data && new Set(data.filter(filter))
});
const exceptRegisterUsers = group => group.name !== 'Registered Users';
const all = () => true;
const none = () => false;
const reducer = createReducer(
{
[setHubURL]: (state, hubURL) => ({
...state,
hubURL
}),
[selectUser]: (state, selectedUser) => ({
...state,
selectedUser,
loadingUserDetails: true,
groupSelection: new Selection(),
teamSelection: new Selection(),
roleSelection: new Selection(),
loginSelection: new Selection()
}),
[setUserDetails]: (state, selectedUser) => ({
...state,
selectedUser,
loadingUserDetails: false,
groupSelection: select(selectedUser.groups, exceptRegisterUsers),
teamSelection: select(selectedUser.teams, all),
roleSelection: select(selectedUser.projectRoles, all),
loginSelection: select(selectedUser.details, none)
}),
[requestUsers]: (state, userQuery) => ({
...state,
loadingUsers: true,
userQuery,
users: []
}),
[setUsers]: (state, {users, canLoadMoreUsers}) => ({
...state,
loadingUsers: false,
users,
canLoadMoreUsers
}),
[requestMoreUsers]: state => ({
...state,
loadingUsers: true
}),
[setMoreUsers]: (state, {users, canLoadMoreUsers}) => ({
...state,
loadingUsers: false,
users: [...state.users, ...users],
canLoadMoreUsers
}),
[selectGroups]: (state, groupSelection) => ({
...state,
groupSelection
}),
[selectTeams]: (state, teamSelection) => ({
...state,
teamSelection
}),
[selectRoles]: (state, roleSelection) => ({
...state,
roleSelection
}),
[selectLogins]: (state, loginSelection) => ({
...state,
loginSelection
}),
[startRevocation]: state => ({
...state,
revokingAccess: true
}),
[finishRevocation]: state => ({
...state,
revokingAccess: false
}),
[cancel]: state => ({
...state,
selectedUser: null,
revokingAccess: false
})
},
{
hubURL: '',
selectedUser: null,
loadingUserDetails: false,
loadingUsers: false,
userQuery: '',
users: [],
canLoadMoreUsers: false,
groupSelection: new Selection(),
teamSelection: new Selection(),
roleSelection: new Selection(),
loginSelection: new Selection(),
revokingAccess: false
}
);
export default () => createStore(reducer);