195 lines
5.4 KiB
JavaScript
Raw Normal View History

import { createAction, handleActions } from 'redux-actions';
import { createTypes, createAsyncTypes } from '../utils/createTypes';
import { createFetchUserSaga } from './fetch-user-saga';
import { createAcceptTermsSaga } from './accept-terms-saga';
2018-08-30 15:27:53 +01:00
import { createAppMountSaga } from './app-mount-saga';
import { createReportUserSaga } from './report-user-saga';
import { createShowCertSaga } from './show-cert-saga';
2018-08-30 15:27:53 +01:00
import { createUpdateMyEmailSaga } from './update-email-saga';
import { createNightModeSaga } from './night-mode-saga';
2018-09-13 18:28:23 +01:00
import { types as settingsTypes } from './settings';
const ns = 'app';
const defaultFetchState = {
pending: true,
complete: false,
errored: false,
error: null
};
const initialState = {
appUsername: '',
showCert: {},
showCertFetchState: {
...defaultFetchState
},
user: {},
userFetchState: {
...defaultFetchState
}
};
const types = createTypes(
2018-08-30 15:27:53 +01:00
[
'appMount',
...createAsyncTypes('fetchUser'),
...createAsyncTypes('acceptTerms'),
...createAsyncTypes('showCert'),
...createAsyncTypes('updateMyEmail'),
...createAsyncTypes('reportUser')
2018-08-30 15:27:53 +01:00
],
ns
);
export const sagas = [
2018-08-30 15:27:53 +01:00
...createAcceptTermsSaga(types),
...createAppMountSaga(types),
...createFetchUserSaga(types),
...createUpdateMyEmailSaga(types),
...createShowCertSaga(types),
...createReportUserSaga(types),
...createNightModeSaga({ ...types, ...settingsTypes })
];
2018-08-30 15:27:53 +01:00
export const appMount = createAction(types.appMount);
export const acceptTerms = createAction(types.acceptTerms);
export const acceptTermsComplete = createAction(types.acceptTermsComplete);
export const acceptTermsError = createAction(types.acceptTermsError);
2018-08-30 15:27:53 +01:00
export const fetchUser = createAction(types.fetchUser);
export const fetchUserComplete = createAction(types.fetchUserComplete);
export const fetchUserError = createAction(types.fetchUserError);
export const reportUser = createAction(types.reportUser);
export const reportUserComplete = createAction(types.reportUserComplete);
export const reportUserError = createAction(types.reportUserError);
export const showCert = createAction(types.showCert);
export const showCertComplete = createAction(types.showCertComplete);
export const showCertError = createAction(types.showCertError);
2018-08-30 15:27:53 +01:00
export const updateMyEmail = createAction(types.updateMyEmail);
export const updateMyEmailComplete = createAction(types.updateMyEmailComplete);
export const updateMyEmailError = createAction(types.updateMyEmailError);
export const isSignedInSelector = state => !!Object.keys(state[ns].user).length;
2018-09-13 18:28:23 +01:00
export const signInLoadingSelector = state =>
userFetchStateSelector(state).pending;
export const showCertSelector = state => state[ns].showCert;
export const showCertFetchStateSelector = state => state[ns].showCertFetchState;
export const userByNameSelector = username => state => {
const { user } = state[ns];
return username in user ? user[username] : {};
};
export const userFetchStateSelector = state => state[ns].userFetchState;
export const usernameSelector = state => state[ns].appUsername;
2018-09-13 18:28:23 +01:00
export const userSelector = state => {
const username = usernameSelector(state);
return state[ns].user[username] || {};
};
export const reducer = handleActions(
{
[types.fetchUser]: state => ({
...state,
userFetchState: { ...defaultFetchState }
}),
[types.fetchUserComplete]: (state, { payload: { user, username } }) => ({
...state,
2018-09-13 18:28:23 +01:00
user: {
...state.user,
[username]: user
},
appUsername: username,
userFetchState: {
pending: false,
complete: true,
errored: false,
error: null
}
}),
[types.fetchUserError]: (state, { payload }) => ({
...state,
userFetchState: {
pending: false,
complete: false,
errored: true,
error: payload
}
}),
[types.showCert]: state => ({
...state,
showCert: {},
showCertFetchState: { ...defaultFetchState }
}),
[types.showCertComplete]: (state, { payload }) => ({
...state,
showCert: payload,
showCertFetchState: {
pending: false,
complete: true,
errored: false,
error: null
}
}),
[types.showCertError]: (state, { payload }) => ({
...state,
showCert: {},
showCertFetchState: {
pending: false,
complete: false,
errored: true,
error: payload
}
2018-09-13 18:28:23 +01:00
}),
[settingsTypes.submitNewUsernameComplete]: (state, { payload }) =>
payload
? {
...state,
user: {
...state.user,
[state.appUsername]: {
...state.user[state.appUsername],
username: payload
}
}
}
: state,
[settingsTypes.submitNewAboutComplete]: (state, { payload }) =>
payload
? {
...state,
user: {
...state.user,
[state.appUsername]: {
...state.user[state.appUsername],
...payload
}
}
}
: state,
[settingsTypes.updateUserFlagComplete]: (state, { payload }) =>
payload
? {
...state,
user: {
...state.user,
[state.appUsername]: {
...state.user[state.appUsername],
...payload
}
}
}
: state
},
initialState
);