feat(profile): Add Profile and components

This commit is contained in:
Bouncey
2018-11-07 18:15:27 +00:00
committed by mrugesh mohapatra
parent 491912448b
commit 987da19254
24 changed files with 1358 additions and 83 deletions

View File

@@ -1,7 +1,12 @@
import { call, put, takeEvery } from 'redux-saga/effects';
import { fetchUserComplete, fetchUserError } from './';
import { getSessionUser } from '../utils/ajax';
import {
fetchUserComplete,
fetchUserError,
fetchProfileForUserError,
fetchProfileForUserComplete
} from './';
import { getSessionUser, getUserProfile } from '../utils/ajax';
import { jwt } from './cookieValues';
function* fetchSessionUser() {
@@ -13,13 +18,30 @@ function* fetchSessionUser() {
const {
data: { user = {}, result = '' }
} = yield call(getSessionUser);
const appUser = user[result];
const appUser = user[result] || {};
yield put(fetchUserComplete({ user: appUser, username: result }));
} catch (e) {
yield put(fetchUserError(e));
}
}
export function createFetchUserSaga(types) {
return [takeEvery(types.fetchUser, fetchSessionUser)];
function* fetchOtherUser({ payload: maybeUser }) {
try {
const { data } = yield call(getUserProfile, maybeUser);
const { entities: { user = {} } = {}, result = '' } = data;
const otherUser = user[result] || {};
yield put(
fetchProfileForUserComplete({ user: otherUser, username: result })
);
} catch (e) {
yield put(fetchProfileForUserError(e));
}
}
export function createFetchUserSaga(types) {
return [
takeEvery(types.fetchUser, fetchSessionUser),
takeEvery(types.fetchProfileForUser, fetchOtherUser)
];
}

View File

@@ -39,6 +39,9 @@ const initialState = {
userFetchState: {
...defaultFetchState
},
userProfileFetchState: {
...defaultFetchState
},
showDonationModal: false,
isOnline: true
};
@@ -53,6 +56,7 @@ export const types = createTypes(
'updateComplete',
'updateFailed',
...createAsyncTypes('fetchUser'),
...createAsyncTypes('fetchProfileForUser'),
...createAsyncTypes('acceptTerms'),
...createAsyncTypes('showCert'),
...createAsyncTypes('reportUser')
@@ -60,11 +64,7 @@ export const types = createTypes(
ns
);
export const epics = [
hardGoToEpic,
failedUpdatesEpic,
updateCompleteEpic
];
export const epics = [hardGoToEpic, failedUpdatesEpic, updateCompleteEpic];
export const sagas = [
...createAcceptTermsSaga(types),
@@ -98,6 +98,14 @@ export const fetchUser = createAction(types.fetchUser);
export const fetchUserComplete = createAction(types.fetchUserComplete);
export const fetchUserError = createAction(types.fetchUserError);
export const fetchProfileForUser = createAction(types.fetchProfileForUser);
export const fetchProfileForUserComplete = createAction(
types.fetchProfileForUserComplete
);
export const fetchProfileForUserError = createAction(
types.fetchProfileForUserError
);
export const reportUser = createAction(types.reportUser);
export const reportUserComplete = createAction(types.reportUserComplete);
export const reportUserError = createAction(types.reportUserError);
@@ -144,6 +152,8 @@ export const userByNameSelector = username => state => {
return username in user ? user[username] : {};
};
export const userFetchStateSelector = state => state[ns].userFetchState;
export const userProfileFetchStateSelector = state =>
state[ns].userProfileFetchState;
export const usernameSelector = state => state[ns].appUsername;
export const userSelector = state => {
const username = usernameSelector(state);
@@ -170,11 +180,15 @@ export const reducer = handleActions(
...state,
userFetchState: { ...defaultFetchState }
}),
[types.fetchProfileForUser]: state => ({
...state,
userProfileFetchState: { ...defaultFetchState }
}),
[types.fetchUserComplete]: (state, { payload: { user, username } }) => ({
...state,
user: {
...state.user,
[username]: user
[username]: { ...user, sessionUser: true }
},
appUsername: username,
userFetchState: {
@@ -193,6 +207,35 @@ export const reducer = handleActions(
error: payload
}
}),
[types.fetchProfileForUserComplete]: (
state,
{ payload: { user, username } }
) => {
const previousUserObject =
username in state.user ? state.user[username] : {};
return {
...state,
user: {
...state.user,
[username]: { ...previousUserObject, ...user }
},
userProfileFetchState: {
pending: false,
complete: true,
errored: false,
error: null
}
};
},
[types.fetchProfileForUserError]: (state, { payload }) => ({
...state,
userFetchState: {
pending: false,
complete: false,
errored: true,
error: payload
}
}),
[types.onlineStatusChange]: (state, { payload: isOnline }) => ({
...state,
isOnline

View File

@@ -2,7 +2,8 @@ import { all } from 'redux-saga/effects';
import { sagas as appSagas } from './';
import { sagas as settingsSagas } from './settings';
import { sagas as challengeSagas } from '../templates/Challenges/redux';
export default function* rootSaga() {
yield all([...appSagas, ...settingsSagas]);
yield all([...appSagas, ...challengeSagas, ...settingsSagas]);
}