import { ADMIN_APPEND_OAUTH_CLIENTS, ADMIN_APPEND_USERS, ADMIN_RECEIVE_OAUTH_ACCESS_TOKENS, ADMIN_RECEIVE_OAUTH_CLIENT, ADMIN_RECEIVE_OAUTH_CLIENT_DETAILS, ADMIN_RECEIVE_OAUTH_REFRESH_TOKENS, ADMIN_RECEIVE_USER, ADMIN_REMOVE_OAUTH_ACCESS_TOKEN, ADMIN_REMOVE_OAUTH_CLIENT, ADMIN_REMOVE_OAUTH_REFRESH_TOKEN, ADMIN_TOGGLE_USER_MODAL, } from 'user/constants'; import update from 'immutability-helper'; import FilteredPage from 'model/FilteredPage'; import { IReducerAction } from 'model/common.model'; import { User } from 'model/user/User'; import OAuthClient from 'model/oauth/OAuthClient'; import ClientDetails from 'model/oauth/ClientDetails'; import ApiCall from 'model/ApiCall'; const INITIAL_STATE: { user: ApiCall; paged: ApiCall>; oAuthClient: ApiCall; oAuthPaged: ApiCall>; modalIsOpen: boolean; } = { user: null, paged: null, oAuthClient: null, oAuthPaged: null, modalIsOpen: false, }; export default function user(state = INITIAL_STATE, action: IReducerAction) { switch (action.type) { case ADMIN_RECEIVE_USER: { const {apiCall} = action.payload; const receivedIndex = state.paged && state.paged.data && apiCall.data ? state.paged.data.content.findIndex((item) => item.uuid === apiCall.data.uuid) : -1; if (receivedIndex !== -1) { return update(state, { user: {$set: apiCall}, paged: { data: { content: { [receivedIndex]: {$set: apiCall.data}, }, }, }, }); } else { return update(state, { user: {$set: apiCall}, }); } } case ADMIN_APPEND_USERS: { const {apiCall: {loading, error, timestamp, data}} = action.payload; return update(state, { paged: { $set: { loading, error, timestamp, data: FilteredPage.merge(state.paged && state.paged.data, data), }, }, }); } case ADMIN_APPEND_OAUTH_CLIENTS: { const {apiCall: {loading, error, timestamp, data}} = action.payload; return update(state, { oAuthPaged: { $set: { loading, error, timestamp, data: FilteredPage.merge(state.oAuthPaged && state.oAuthPaged.data, data), }, }, }); } case ADMIN_RECEIVE_OAUTH_CLIENT_DETAILS: { const { apiCall } = action.payload; return update(state, { oAuthClient: {$set: apiCall}, }); } case ADMIN_RECEIVE_OAUTH_CLIENT: { const { apiCall } = action.payload; return state.oAuthClient ? update(state, { oAuthClient: { data: { clientDetails: {$set: apiCall.data}, }, }, }) : update(state, { oAuthClient: { $set: { ...apiCall, data: { clientDetails: apiCall.data, }, }, }, }); } case ADMIN_REMOVE_OAUTH_CLIENT: { const { apiCall } = action.payload; const removeIndex = state.oAuthPaged && state.oAuthPaged.data && apiCall.data && state.oAuthPaged.data.content ? state.oAuthPaged.data.content.findIndex((client) => client.clientId === apiCall.data) : -1; return removeIndex !== -1 ? update(state, { oAuthClient: { $set: null }, oAuthPaged: { data: { content: {$splice: [[removeIndex, 1]]}, }, }, }) : update(state, { oAuthClient: { $set: null }, }); } case ADMIN_REMOVE_OAUTH_ACCESS_TOKEN: { const { apiCall } = action.payload; const removeIndex = apiCall.data && state.oAuthClient && state.oAuthClient.data && state.oAuthClient.data.accessTokens ? state.oAuthClient.data.accessTokens.findIndex((token) => token.tokenId === apiCall.data) : -1; return removeIndex !== -1 ? update(state, { oAuthClient: { data: { accessTokens: { $splice: [[removeIndex, 1]] }, }, }, }) : state; } case ADMIN_RECEIVE_OAUTH_ACCESS_TOKENS: { const { apiCall } = action.payload; return update(state, { oAuthClient: { data: { accessTokens: { $set: apiCall.data }, }, }, }); } case ADMIN_REMOVE_OAUTH_REFRESH_TOKEN: { const { apiCall } = action.payload; const removeIndex = state.oAuthClient && state.oAuthClient.data && state.oAuthClient.data.refreshTokens ? state.oAuthClient.data.refreshTokens.findIndex((token) => token.tokenId === apiCall.data) : -1; return removeIndex !== -1 ? update(state, { oAuthClient: { data: { refreshTokens: { $splice: [[removeIndex, 1]] }, }, }, }) : state; } case ADMIN_RECEIVE_OAUTH_REFRESH_TOKENS: { const { apiCall } = action.payload; return update(state, { oAuthClient: { data: { refreshTokens: { $set: apiCall.data }, }, }, }); } case ADMIN_TOGGLE_USER_MODAL: { return update(state, { modalIsOpen: { $set: action.payload }, }); } default: return state; } }