2018-08-23 16:29:26 +01:00
|
|
|
import { createAction, handleActions } from 'redux-actions';
|
|
|
|
|
|
|
|
import { createTypes, createAsyncTypes } from '../utils/createTypes';
|
|
|
|
import { createFetchUserSaga } from './fetch-user-saga';
|
2018-08-25 00:24:19 +01:00
|
|
|
import { createAcceptTermsSaga } from './accept-terms-saga';
|
2018-08-30 15:27:53 +01:00
|
|
|
import { createAppMountSaga } from './app-mount-saga';
|
|
|
|
import { createUpdateMyEmailSaga } from './update-email-saga';
|
2018-08-23 16:29:26 +01:00
|
|
|
|
|
|
|
const ns = 'app';
|
|
|
|
|
|
|
|
const initialState = {
|
|
|
|
appUsername: '',
|
|
|
|
fetchState: {
|
|
|
|
pending: true,
|
|
|
|
complete: false,
|
|
|
|
errored: false,
|
|
|
|
error: null
|
|
|
|
},
|
|
|
|
user: {}
|
|
|
|
};
|
|
|
|
|
2018-08-25 00:24:19 +01:00
|
|
|
const types = createTypes(
|
2018-08-30 15:27:53 +01:00
|
|
|
[
|
|
|
|
'appMount',
|
|
|
|
...createAsyncTypes('fetchUser'),
|
|
|
|
...createAsyncTypes('acceptTerms'),
|
|
|
|
...createAsyncTypes('updateMyEmail')
|
|
|
|
],
|
2018-08-25 00:24:19 +01:00
|
|
|
ns
|
|
|
|
);
|
2018-08-23 16:29:26 +01:00
|
|
|
|
2018-08-25 00:24:19 +01:00
|
|
|
export const sagas = [
|
2018-08-30 15:27:53 +01:00
|
|
|
...createAcceptTermsSaga(types),
|
|
|
|
...createAppMountSaga(types),
|
2018-08-25 00:24:19 +01:00
|
|
|
...createFetchUserSaga(types),
|
2018-08-30 15:27:53 +01:00
|
|
|
...createUpdateMyEmailSaga(types)
|
2018-08-25 00:24:19 +01:00
|
|
|
];
|
2018-08-23 16:29:26 +01:00
|
|
|
|
2018-08-30 15:27:53 +01:00
|
|
|
export const appMount = createAction(types.appMount);
|
2018-08-23 16:29:26 +01:00
|
|
|
|
2018-08-25 00:24:19 +01:00
|
|
|
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 updateMyEmail = createAction(types.updateMyEmail);
|
|
|
|
export const updateMyEmailComplete = createAction(types.updateMyEmailComplete);
|
|
|
|
export const updateMyEmailError = createAction(types.updateMyEmailError);
|
|
|
|
|
2018-08-23 16:29:26 +01:00
|
|
|
export const isSignedInSelector = state => !!Object.keys(state[ns].user).length;
|
|
|
|
export const userFetchStateSelector = state => state[ns].fetchState;
|
|
|
|
export const usernameSelector = state => state[ns].appUsername;
|
|
|
|
export const userSelector = state => state[ns].user;
|
|
|
|
|
|
|
|
export const reducer = handleActions(
|
|
|
|
{
|
|
|
|
[types.fetchUser]: state => ({
|
|
|
|
...state,
|
|
|
|
fetchState: {
|
|
|
|
pending: true,
|
|
|
|
complete: false,
|
|
|
|
errored: false,
|
|
|
|
error: null
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
[types.fetchUserComplete]: (state, { payload: { user, username } }) => ({
|
|
|
|
...state,
|
|
|
|
user,
|
|
|
|
appUsername: username,
|
|
|
|
fetchState: {
|
|
|
|
pending: false,
|
|
|
|
complete: true,
|
|
|
|
errored: false,
|
|
|
|
error: null
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
[types.fetchUserError]: (state, { payload }) => ({
|
|
|
|
...state,
|
|
|
|
fetchState: {
|
|
|
|
pending: false,
|
|
|
|
complete: false,
|
|
|
|
errored: true,
|
|
|
|
error: payload
|
|
|
|
}
|
|
|
|
})
|
|
|
|
},
|
|
|
|
initialState
|
|
|
|
);
|