Skip to content

Commit

Permalink
Merge pull request #753 from outoftime/log-out-saga
Browse files Browse the repository at this point in the history
Logout handled by reducers
  • Loading branch information
outoftime committed Apr 3, 2017
2 parents 8b3c3b3 + ccf73a8 commit 87e02fa
Show file tree
Hide file tree
Showing 12 changed files with 105 additions and 108 deletions.
1 change: 1 addition & 0 deletions package.json
Expand Up @@ -84,6 +84,7 @@
"react-dom": "^15.4.1",
"react-ga": "^2.1.2",
"react-redux": "^5.0.3",
"reduce-reducers": "^0.1.2",
"redux": "^3.6.0",
"redux-actions": "^1.2.1",
"redux-immutable": "^3.0.11",
Expand Down
56 changes: 0 additions & 56 deletions spec/examples/actions/user.spec.js

This file was deleted.

4 changes: 2 additions & 2 deletions src/actions/index.js
Expand Up @@ -29,7 +29,7 @@ import {

import {
userAuthenticated,
logOut,
userLoggedOut,
} from './user';

function getCurrentPersistor(state) {
Expand Down Expand Up @@ -173,7 +173,7 @@ export {
updateProjectSource,
toggleLibrary,
userAuthenticated,
logOut,
userLoggedOut,
addRuntimeError,
clearRuntimeErrors,
minimizeComponent,
Expand Down
18 changes: 2 additions & 16 deletions src/actions/user.js
@@ -1,20 +1,6 @@
import {createAction} from 'redux-actions';
import identity from 'lodash/identity';

export const userAuthenticated = createAction(
'USER_AUTHENTICATED',
identity,
);
export const userAuthenticated = createAction('USER_AUTHENTICATED', identity);

const resetWorkspace = createAction('RESET_WORKSPACE', identity);

const userLoggedOut = createAction('USER_LOGGED_OUT');

export function logOut() {
return (dispatch, getState) => {
const currentProjectKey =
getState().getIn(['currentProject', 'projectKey']);
dispatch(resetWorkspace({currentProjectKey}));
dispatch(userLoggedOut());
};
}
export const userLoggedOut = createAction('USER_LOGGED_OUT');
4 changes: 2 additions & 2 deletions src/components/Workspace.jsx
Expand Up @@ -34,7 +34,7 @@ import {
createProject,
updateProjectSource,
userAuthenticated,
logOut,
userLoggedOut,
toggleLibrary,
minimizeComponent,
maximizeComponent,
Expand Down Expand Up @@ -291,7 +291,7 @@ class Workspace extends React.Component {
onSignedIn(userCredential =>
this.props.dispatch(userAuthenticated(userCredential)),
);
onSignedOut(() => this.props.dispatch(logOut()));
onSignedOut(() => this.props.dispatch(userLoggedOut()));
}

_handleStartLogIn() {
Expand Down
10 changes: 7 additions & 3 deletions src/reducers/index.js
@@ -1,13 +1,14 @@
import {combineReducers} from 'redux-immutable';
import reduceReducers from 'reduce-reducers';
import user from './user';
import projects from './projects';
import projects, {reduceRoot as reduceRootForProjects} from './projects';
import currentProject from './currentProject';
import errors from './errors';
import runtimeErrors from './runtimeErrors';
import ui from './ui';
import clients from './clients';

const reducers = combineReducers({
const reduceRoot = combineReducers({
user,
projects,
currentProject,
Expand All @@ -17,4 +18,7 @@ const reducers = combineReducers({
clients,
});

export default reducers;
export default reduceReducers(
reduceRoot,
reduceRootForProjects,
);
34 changes: 23 additions & 11 deletions src/reducers/projects.js
Expand Up @@ -64,7 +64,29 @@ function importGist(state, projectKey, gistData) {
);
}

export default function projects(stateIn, action) {
export function reduceRoot(stateIn, action) {
return stateIn.update('projects', (projects) => {
switch (action.type) {
case 'USER_LOGGED_OUT':
{
const currentProjectKey =
stateIn.getIn(['currentProject', 'projectKey']);

if (isNil(currentProjectKey)) {
return new Immutable.Map();
}

return new Immutable.Map().set(
currentProjectKey,
projects.get(currentProjectKey),
);
}
}
return projects;
});
}

export default function reduceProjects(stateIn, action) {
let state;

if (stateIn === undefined) {
Expand Down Expand Up @@ -95,16 +117,6 @@ export default function projects(stateIn, action) {
case 'CHANGE_CURRENT_PROJECT':
return removePristineExcept(state, action.payload.projectKey);

case 'RESET_WORKSPACE':
if (isNil(action.payload.currentProjectKey)) {
return emptyMap;
}

return new Immutable.Map().set(
action.payload.currentProjectKey,
state.get(action.payload.currentProjectKey),
);

case 'GIST_IMPORTED':
return importGist(
state,
Expand Down
13 changes: 8 additions & 5 deletions src/reducers/ui.js
Expand Up @@ -108,11 +108,14 @@ function ui(stateIn, action) {
),
);

case 'RESET_WORKSPACE':
return state.setIn(
['dashboard', 'activeSubmenu'],
null,
);
case 'USER_LOGGED_OUT':
if (state.getIn(['dashboard', 'activeSubmenu']) === 'projectList') {
return state.setIn(
['dashboard', 'activeSubmenu'],
null,
);
}
return state;

default:
return state;
Expand Down
17 changes: 16 additions & 1 deletion test/unit/reducers/projects.js
Expand Up @@ -7,14 +7,17 @@ import Immutable from 'immutable';
import reducerTest from '../../helpers/reducerTest';
import {projects as states} from '../../helpers/referenceStates';
import {gistData, project} from '../../helpers/factory';
import reducer from '../../../src/reducers/projects';
import reducer, {
reduceRoot as rootReducer,
} from '../../../src/reducers/projects';
import {
changeCurrentProject,
gistImported,
projectCreated,
projectLoaded,
projectSourceEdited,
} from '../../../src/actions/projects';
import {userLoggedOut} from '../../../src/actions/user';

const now = Date.now();
const projectKey = '12345';
Expand Down Expand Up @@ -136,6 +139,18 @@ tap(project(), projectIn =>
)),
);

tap(initProjects({1: true, 2: true}), projects =>
test('userLoggedOut', reducerTest(
rootReducer,
Immutable.fromJS({currentProject: {projectKey: '1'}, projects}),
userLoggedOut,
Immutable.fromJS({
currentProject: {projectKey: '1'},
projects: projects.take(1),
}),
)),
);

function initProjects(map = {}) {
return reduce(map, (projectsIn, modified, key) => {
const projects = reducer(projectsIn, projectCreated(key));
Expand Down
25 changes: 24 additions & 1 deletion test/unit/reducers/ui.js
Expand Up @@ -7,7 +7,7 @@ import {
gistNotFound,
gistImportError,
} from '../../../src/actions/projects';

import {userLoggedOut} from '../../../src/actions/user';

const initialState = Immutable.fromJS({
editors: {typing: false},
Expand Down Expand Up @@ -49,3 +49,26 @@ test('gistImportError', reducerTest(
})),
),
));

test('userLoggedOut', (t) => {
const libraryPickerOpen = initialState.setIn(
['dashboard', 'activeSubmenu'],
'libraryPicker',
);
t.test('with active submenu that is not projects', reducerTest(
reducer,
libraryPickerOpen,
userLoggedOut,
libraryPickerOpen,
));

t.test('with projectList active submenu', reducerTest(
reducer,
initialState.setIn(
['dashboard', 'activeSubmenu'],
'projectList',
),
userLoggedOut,
initialState,
));
});
29 changes: 19 additions & 10 deletions test/unit/reducers/user.js
Expand Up @@ -5,21 +5,30 @@ import reducerTest from '../../helpers/reducerTest';
import {user as states} from '../../helpers/referenceStates';
import {userCredential} from '../../helpers/factory';
import reducer from '../../../src/reducers/user';
import {userAuthenticated} from '../../../src/actions/user';
import {userAuthenticated, userLoggedOut} from '../../../src/actions/user';

const userCredentialIn = userCredential();

const loggedInState = Immutable.fromJS({
authenticated: true,
id: userCredentialIn.user.uid,
displayName: userCredentialIn.user.providerData[0].displayName,
avatarUrl: userCredentialIn.user.providerData[0].photoURL,
accessTokens: {
'github.com': userCredentialIn.credential.accessToken,
},
});

test('userAuthenticated', reducerTest(
reducer,
states.initial,
partial(userAuthenticated, userCredentialIn),
Immutable.fromJS({
authenticated: true,
id: userCredentialIn.user.uid,
displayName: userCredentialIn.user.providerData[0].displayName,
avatarUrl: userCredentialIn.user.providerData[0].photoURL,
accessTokens: {
'github.com': userCredentialIn.credential.accessToken,
},
}),
loggedInState,
));

test('userLoggedOut', reducerTest(
reducer,
loggedInState,
userLoggedOut,
states.initial,
));
2 changes: 1 addition & 1 deletion yarn.lock
Expand Up @@ -6515,7 +6515,7 @@ reduce-function-call@^1.0.1:
dependencies:
balanced-match "^0.4.2"

reduce-reducers@^0.1.0:
reduce-reducers@^0.1.0, reduce-reducers@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/reduce-reducers/-/reduce-reducers-0.1.2.tgz#fa1b4718bc5292a71ddd1e5d839c9bea9770f14b"

Expand Down

0 comments on commit 87e02fa

Please sign in to comment.