stitch-ui
Version:
297 lines (294 loc) • 10.6 kB
JavaScript
import { combineReducers } from "redux";
import { is, Map, fromJS } from "immutable";
import { createReducer } from "redux-act";
import * as actions from "./actions";
import { makeUserReducer } from "../users/users";
import { makeAPIKeyReducer } from "./apikeys";
import { AllowedRequestOriginsEdit } from "./models/AllowedRequestOrigins";
import {
randomAlphaNumericString,
EDIT_TYPE_LOCAL,
EDIT_TYPE_REMOTE,
EDIT_TYPE_STATUS
} from "../util";
export default combineReducers({
apiKeys: makeAPIKeyReducer(actions.apiKeyActions),
auth: createReducer(
{
[actions.loadProvidersActions.req]: state => ({
...state,
loadingProviders: true
}),
[actions.loadProvidersActions.rcv]: (state, { payload }) => ({
...state,
providers: payload,
prevProvidersInput: fromJS(payload).merge(state.providersInput),
providersInput: fromJS(payload).merge(state.providersInput),
loadingProviders: false
}),
[actions.loadProvidersActions.fail]: (state, payload) => ({
...state,
error: payload.error,
loadingProviders: false
}),
[actions.disableProviderActions.req]: state => ({
...state,
togglingProvider: true
}),
[actions.disableProviderActions.rcv]: (state, payload) => ({
...state,
providersInput: state.providersInput.remove(
[payload.reqArgs[2], payload.reqArgs[3]].join("/")
),
togglingProvider: false
}),
[actions.disableProviderActions.fail]: (state, payload) => ({
...state,
togglingProvider: false,
error: payload.error
}),
[actions.openProvider]: (state, { provider }) => {
let newProviders = state.providersInput
.set(provider, fromJS({}))
.setIn([provider, "dirty"], true);
if (provider === "custom/token") {
newProviders = newProviders.setIn(
[provider, "signingKey"],
randomAlphaNumericString(64)
);
}
return { ...state, providersInput: newProviders };
},
[actions.enableProviderActions.req]: state => ({
...state,
togglingProvider: true
}),
[actions.enableProviderActions.rcv]: (state, payload) => {
const provider = [payload.reqArgs[2], payload.reqArgs[3]].join("/");
return {
...state,
providersInput: state.providersInput
.setIn([provider, "error"], null)
.setIn([provider, "dirty"], false),
prevProvidersInput: state.providersInput
.setIn([provider, "error"], null)
.setIn([provider, "dirty"], false),
togglingProvider: false
};
},
[actions.enableProviderActions.fail]: (state, payload) => {
const provider = [payload.reqArgs[2], payload.reqArgs[3]].join("/");
return {
...state,
providersInput: state.providersInput
.setIn([provider, "error"], payload.error)
.setIn([provider, "dirty"], true),
togglingProvider: false
};
},
[actions.discardProviderUpdates]: state => ({
...state,
providersInput: state.prevProvidersInput,
togglingProvider: false
}),
[actions.setProviderClientIdInput]: (state, { provider, input }) => ({
...state,
providersInput: state.providersInput
.setIn([provider, "clientId"], input)
.setIn([provider, "dirty"], true)
}),
[actions.setProviderClientSecretInput]: (state, { provider, input }) => ({
...state,
providersInput: state.providersInput
.setIn([provider, "clientSecret"], input)
.setIn([provider, "dirty"], true)
}),
[actions.setRedirectURIInput]: (state, { provider, index, input }) => ({
...state,
providersInput: state.providersInput
.setIn([provider, "redirectURIs", index], input)
.setIn([provider, "dirty"], true)
}),
[actions.removeRedirectURI]: (state, { provider, index }) => ({
...state,
providersInput: state.providersInput.updateIn(
[provider, "redirectURIs"],
r => r.remove(index)
)
}),
[actions.addRedirectURI]: (state, { provider }) => ({
...state,
providersInput: state.providersInput
.updateIn([provider, "redirectURIs"], r => (r || fromJS([])).push(""))
.setIn([provider, "dirty"], true)
}),
[actions.addDomainRestriction]: (state, { provider }) => ({
...state,
providersInput: state.providersInput
.updateIn([provider, "domainRestrictions"], r =>
(r || fromJS([])).push("")
)
.updateIn([provider, "metadataFields"], f =>
(f || fromJS([])).toSet().add("email").toList()
)
.setIn([provider, "dirty"], true)
}),
[actions.removeDomainRestriction]: (state, { provider, index }) => ({
...state,
providersInput: state.providersInput
.updateIn([provider, "domainRestrictions"], r => r.remove(index))
.setIn([provider, "dirty"], true)
}),
[actions.setDomainRestrictionInput]: (
state,
{ provider, index, input }
) => ({
...state,
providersInput: state.providersInput
.setIn([provider, "domainRestrictions", index], input)
.setIn([provider, "dirty"], true)
}),
[actions.setMetadataField]: (state, { provider, field, enabled }) => ({
...state,
providersInput: state.providersInput
.updateIn(
[provider, "metadataFields"],
f =>
enabled
? (f || fromJS([])).toSet().add(field).toList()
: (f || fromJS([])).toSet().remove(field).toList()
)
.setIn([provider, "dirty"], true)
}),
[actions.setSigningKey]: (state, { provider, input }) => ({
...state,
providersInput: state.providersInput
.setIn([provider, "signingKey"], input)
.setIn([provider, "dirty"], true)
}),
[actions.setResetPasswordURL]: (state, { provider, input }) => ({
...state,
providersInput: state.providersInput
.setIn([provider, "resetPasswordUrl"], input)
.setIn([provider, "dirty"], true)
}),
[actions.setEmailConfirmationURL]: (state, { provider, input }) => ({
...state,
providersInput: state.providersInput
.setIn([provider, "emailConfirmationUrl"], input)
.setIn([provider, "dirty"], true)
}),
[actions.setEmailConfirmationSubject]: (state, { provider, input }) => ({
...state,
providersInput: state.providersInput
.setIn([provider, "emailConfirmationSubject"], input)
.setIn([provider, "dirty"], true)
}),
[actions.setResetPasswordSubject]: (state, { provider, input }) => ({
...state,
providersInput: state.providersInput
.setIn([provider, "resetPasswordSubject"], input)
.setIn([provider, "dirty"], true)
})
},
{
togglingProvider: false,
error: null,
providers: {},
providersInput: new Map(),
prevProvidersInput: new Map()
}
),
users: makeUserReducer(
actions.loadUsersActions,
actions.resetUsersAction,
actions.addUserAction
),
security: createReducer(
{
[actions.addAllowedRequestOrigin]: state => ({
...state,
allowedRequestOrigins: state.allowedRequestOrigins
.set(EDIT_TYPE_LOCAL, state.allowedRequestOrigins.local.push(""))
.setIn([EDIT_TYPE_STATUS, "dirty"], true)
}),
[actions.removeAllowedRequestOrigin]: (state, { index }) => {
const newState = state.allowedRequestOrigins.set(
EDIT_TYPE_LOCAL,
state.allowedRequestOrigins.local.remove(index)
);
let isDirty = true;
if (is(newState.local, newState.remote)) {
isDirty = false;
}
return {
...state,
allowedRequestOrigins: state.allowedRequestOrigins
.set(
EDIT_TYPE_LOCAL,
state.allowedRequestOrigins.local.remove(index)
)
.setIn([EDIT_TYPE_STATUS, "dirty"], isDirty)
};
},
[actions.setAllowedRequestOriginInput]: (state, { index, input }) => ({
...state,
allowedRequestOrigins: state.allowedRequestOrigins
.set(
EDIT_TYPE_LOCAL,
state.allowedRequestOrigins.local.set(index, input)
)
.setIn([EDIT_TYPE_STATUS, "dirty"], true)
}),
[actions.cancelEditingAllowedRequestOrigins]: state => ({
...state,
allowedRequestOrigins: state.allowedRequestOrigins
.set(EDIT_TYPE_LOCAL, state.allowedRequestOrigins.remote)
.setIn([EDIT_TYPE_STATUS, "dirty"], false)
}),
[actions.loadAllowedRequestOriginsActions.req]: state => ({
...state
}),
[actions.loadAllowedRequestOriginsActions.rcv]: (state, { payload }) => {
const newRemote = fromJS(payload);
return {
...state,
allowedRequestOrigins: state.allowedRequestOrigins
.set(EDIT_TYPE_REMOTE, newRemote)
.set(
EDIT_TYPE_LOCAL,
state.allowedRequestOrigins.local.merge(newRemote)
)
.deleteIn([EDIT_TYPE_STATUS, "loadError"])
};
},
[actions.loadAllowedRequestOriginsActions.fail]: (state, payload) => ({
...state,
allowedRequestOrigins: state.allowedRequestOrigins.setIn(
[EDIT_TYPE_STATUS, "loadError"],
payload.error
)
}),
[actions.saveAllowedRequestOriginsActions.req]: state => ({
...state
}),
[actions.saveAllowedRequestOriginsActions.rcv]: state => ({
...state,
allowedRequestOrigins: state.allowedRequestOrigins
.set(EDIT_TYPE_REMOTE, state.allowedRequestOrigins.local)
.deleteIn([EDIT_TYPE_STATUS, "saveError"])
.deleteIn([EDIT_TYPE_STATUS, "dirty"])
}),
[actions.saveAllowedRequestOriginsActions.fail]: (state, payload) => ({
...state,
allowedRequestOrigins: state.allowedRequestOrigins.setIn(
[EDIT_TYPE_STATUS, "saveError"],
payload.error
)
})
},
{
allowedRequestOrigins: new AllowedRequestOriginsEdit()
}
)
});