Skip to content

Commit

Permalink
Merge a1bb557 into c252e9d
Browse files Browse the repository at this point in the history
  • Loading branch information
pedro-victor committed May 25, 2020
2 parents c252e9d + a1bb557 commit e43fee1
Show file tree
Hide file tree
Showing 18 changed files with 79 additions and 111 deletions.
8 changes: 5 additions & 3 deletions app/containers/App/selectors.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ import { createSelector } from '@reduxjs/toolkit';

const selectRouter = state => state.router;

const makeSelectLocation = () =>
createSelector(selectRouter, routerState => routerState.location);
const selectLocation = createSelector(
[selectRouter],
routerState => routerState.location,
);

export { makeSelectLocation };
export { selectLocation };
7 changes: 3 additions & 4 deletions app/containers/App/tests/selectors.test.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
import { makeSelectLocation } from '../selectors';
import { selectLocation } from '../selectors';

describe('makeSelectLocation', () => {
describe('selectLocation', () => {
it('should select the location', () => {
const locationStateSelector = makeSelectLocation();
const router = {
location: { pathname: '/foo' },
};
const mockedState = {
router,
};
expect(locationStateSelector(mockedState)).toEqual(router.location);
expect(selectLocation(mockedState)).toEqual(router.location);
});
});
21 changes: 8 additions & 13 deletions app/containers/HomePage/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,13 @@
import React, { useEffect } from 'react';
import { Helmet } from 'react-helmet-async';
import { FormattedMessage } from 'react-intl';
import { createStructuredSelector } from 'reselect';
import { useSelector, useDispatch } from 'react-redux';
import { useInjectReducer } from 'redux-injectors';

import {
makeSelectRepos,
makeSelectLoading,
makeSelectError,
selectRepos,
selectLoading,
selectError,
} from 'containers/ReposManager/selectors';
import { loadRepos } from 'containers/ReposManager/slice';

Expand All @@ -29,20 +28,16 @@ import Section from './components/Section';

import messages from './messages';
import { reducer, changeUsername } from './slice';
import { makeSelectUsername } from './selectors';

const stateSelector = createStructuredSelector({
username: makeSelectUsername(),
repos: makeSelectRepos(),
loading: makeSelectLoading(),
error: makeSelectError(),
});
import { selectUsername } from './selectors';

export default function HomePage() {
useInjectReducer({ key: 'home', reducer });

const dispatch = useDispatch();
const { repos, username, loading, error } = useSelector(stateSelector);
const username = useSelector(selectUsername);
const repos = useSelector(selectRepos);
const loading = useSelector(selectLoading);
const error = useSelector(selectError);

const onChangeUsername = evt =>
dispatch(changeUsername({ username: evt.target.value }));
Expand Down
8 changes: 5 additions & 3 deletions app/containers/HomePage/selectors.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ import { initialState } from './slice';

const selectHome = state => state.home || initialState;

const makeSelectUsername = () =>
createSelector(selectHome, homeState => homeState.username);
const selectUsername = createSelector(
[selectHome],
homeState => homeState.username,
);

export { selectHome, makeSelectUsername };
export { selectHome, selectUsername };
7 changes: 3 additions & 4 deletions app/containers/HomePage/tests/selectors.test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { selectHome, makeSelectUsername } from '../selectors';
import { selectHome, selectUsername } from '../selectors';
import { initialState } from '../slice';

describe('selectHome', () => {
Expand All @@ -17,15 +17,14 @@ describe('selectHome', () => {
});
});

describe('makeSelectUsername', () => {
const usernameSelector = makeSelectUsername();
describe('selectUsername', () => {
it('should select the username', () => {
const username = 'mxstbr';
const mockedState = {
home: {
username,
},
};
expect(usernameSelector(mockedState)).toEqual(username);
expect(selectUsername(mockedState)).toEqual(username);
});
});
9 changes: 2 additions & 7 deletions app/containers/LanguageProvider/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,12 @@
import React from 'react';
import PropTypes from 'prop-types';
import { useSelector } from 'react-redux';
import { createSelector } from '@reduxjs/toolkit';
import { IntlProvider } from 'react-intl';

import { makeSelectLocale } from './selectors';

const stateSelector = createSelector(makeSelectLocale(), locale => ({
locale,
}));
import { selectLocale } from './selectors';

export default function LanguageProvider(props) {
const { locale } = useSelector(stateSelector);
const locale = useSelector(selectLocale);
return (
<IntlProvider locale={locale} messages={props.messages[locale]}>
{React.Children.only(props.children)}
Expand Down
8 changes: 5 additions & 3 deletions app/containers/LanguageProvider/selectors.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ const selectLanguage = state => state.language || initialState;
* Select the language locale
*/

const makeSelectLocale = () =>
createSelector(selectLanguage, languageState => languageState.locale);
const selectLocale = createSelector(
[selectLanguage],
languageState => languageState.locale,
);

export { selectLanguage, makeSelectLocale };
export { selectLanguage, selectLocale };
9 changes: 2 additions & 7 deletions app/containers/LocaleToggle/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,17 @@
*/

import React from 'react';
import { createSelector } from '@reduxjs/toolkit';
import { useSelector, useDispatch } from 'react-redux';

import Toggle from 'components/Toggle';
import Wrapper from './Wrapper';
import messages from './messages';
import { appLocales } from '../../locales';
import { changeLocale } from '../LanguageProvider/slice';
import { makeSelectLocale } from '../LanguageProvider/selectors';

const stateSelector = createSelector(makeSelectLocale(), locale => ({
locale,
}));
import { selectLocale } from '../LanguageProvider/selectors';

export default function LocaleToggle() {
const { locale } = useSelector(stateSelector);
const locale = useSelector(selectLocale);
const dispatch = useDispatch();

const onLocaleToggle = evt =>
Expand Down
4 changes: 2 additions & 2 deletions app/containers/ReposManager/saga.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import { call, put, select, takeLatest } from 'redux-saga/effects';
import request from 'utils/request';
import { makeSelectUsername } from 'containers/HomePage/selectors';
import { selectUsername } from 'containers/HomePage/selectors';
import { loadRepos, reposLoaded, repoLoadingError } from './slice';

// If the repository is owned by a different user then the submitted
Expand All @@ -20,7 +20,7 @@ export const addRepoOwnershipKey = ({ username, repos }) =>
*/
export function* getRepos() {
// Select username from store
const username = yield select(makeSelectUsername());
const username = yield select(selectUsername);
const requestURL = `https://api.github.com/users/${username}/repos?type=all&sort=updated`;

try {
Expand Down
36 changes: 14 additions & 22 deletions app/containers/ReposManager/selectors.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createSelector } from 'reselect';
import { createSelector } from '@reduxjs/toolkit';
import { initialState } from './slice';

/**
Expand All @@ -11,27 +11,19 @@ const selectReposManagerDomain = state => state.reposManager || initialState;
* Other specific selectors
*/

const makeSelectLoading = () =>
createSelector(
selectReposManagerDomain,
reposManagerState => reposManagerState.loading,
);
const selectLoading = createSelector(
[selectReposManagerDomain],
reposManagerState => reposManagerState.loading,
);

const makeSelectError = () =>
createSelector(
selectReposManagerDomain,
reposManagerState => reposManagerState.error,
);
const selectError = createSelector(
[selectReposManagerDomain],
reposManagerState => reposManagerState.error,
);

const makeSelectRepos = () =>
createSelector(
selectReposManagerDomain,
reposManagerState => reposManagerState.repositories,
);
const selectRepos = createSelector(
[selectReposManagerDomain],
reposManagerState => reposManagerState.repositories,
);

export {
selectReposManagerDomain,
makeSelectLoading,
makeSelectError,
makeSelectRepos,
};
export { selectReposManagerDomain, selectLoading, selectError, selectRepos };
21 changes: 9 additions & 12 deletions app/containers/ReposManager/tests/selectors.test.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import {
selectReposManagerDomain,
makeSelectLoading,
makeSelectError,
makeSelectRepos,
selectLoading,
selectError,
selectRepos,
} from '../selectors';
import { initialState } from '../slice';

Expand All @@ -24,41 +24,38 @@ describe('selectReposManagerDomain', () => {
});
});

describe('makeSelectLoading', () => {
describe('selectLoading', () => {
it('should select the loading', () => {
const loadingSelector = makeSelectLoading();
const loading = false;
const mockedState = {
reposManager: {
loading,
},
};
expect(loadingSelector(mockedState)).toEqual(loading);
expect(selectLoading(mockedState)).toEqual(loading);
});
});

describe('makeSelectError', () => {
describe('selectError', () => {
it('should select the error', () => {
const errorSelector = makeSelectError();
const error = true;
const mockedState = {
reposManager: {
error,
},
};
expect(errorSelector(mockedState)).toEqual(error);
expect(selectError(mockedState)).toEqual(error);
});
});

describe('makeSelectRepos', () => {
describe('selectRepos', () => {
it('should select the repos', () => {
const reposSelector = makeSelectRepos();
const repositories = [];
const mockedState = {
reposManager: {
repositories,
},
};
expect(reposSelector(mockedState)).toEqual(repositories);
expect(selectRepos(mockedState)).toEqual(repositories);
});
});
11 changes: 2 additions & 9 deletions internals/generators/container/index.js.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import { FormattedMessage } from 'react-intl';
{{/if}}
{{#if wantActionsAndReducer}}
import { useSelector, useDispatch } from 'react-redux';
import { createStructuredSelector } from 'reselect';
{{/if}}

{{#if wantActionsAndReducer}}
Expand All @@ -33,7 +32,7 @@ import { useInjectSaga } from 'redux-injectors';
{{/if}}
{{/if}}
{{#if wantActionsAndReducer}}
import makeSelect{{properCase name}} from './selectors';
import select{{properCase name}} from './selectors';
import { reducer } from './slice';
{{/if}}
{{#if wantSaga}}
Expand All @@ -43,12 +42,6 @@ import saga from './saga';
import messages from './messages';
{{/if}}

{{#if wantActionsAndReducer}}
const stateSelector = createStructuredSelector({
{{camelCase name}}: makeSelect{{properCase name}}(),
});
{{/if}}

function {{ properCase name }}() {
{{#if wantActionsAndReducer}}
useInjectReducer({ key: '{{ camelCase name }}', reducer });
Expand All @@ -59,7 +52,7 @@ function {{ properCase name }}() {
{{#if wantActionsAndReducer}}

/* eslint-disable no-unused-vars */
const { {{camelCase name}} } = useSelector(stateSelector);
const {{camelCase name}} = useSelector(select{{properCase name}});
const dispatch = useDispatch();
/* eslint-enable no-unused-vars */
{{/if}}
Expand Down
10 changes: 6 additions & 4 deletions internals/generators/container/selectors.js.hbs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createSelector } from 'reselect';
import { createSelector } from '@reduxjs/toolkit';
import { initialState } from './slice';

/**
Expand All @@ -15,8 +15,10 @@ const select{{ properCase name }}Domain = state => state.{{ camelCase name }} ||
* Default selector used by {{ properCase name }}
*/

const makeSelect{{ properCase name }} = () =>
createSelector(select{{ properCase name }}Domain, substate => substate);
const select{{ properCase name }} = createSelector(
[select{{ properCase name }}Domain],
substate => substate
);

export default makeSelect{{ properCase name }};
export default select{{ properCase name }};
export { select{{ properCase name }}Domain };
8 changes: 5 additions & 3 deletions internals/templates/containers/App/selectors.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ import { createSelector } from '@reduxjs/toolkit';

const selectRouter = state => state.router;

const makeSelectLocation = () =>
createSelector(selectRouter, routerState => routerState.location);
const selectLocation = createSelector(
[selectRouter],
routerState => routerState.location,
);

export { makeSelectLocation };
export { selectLocation };
7 changes: 3 additions & 4 deletions internals/templates/containers/App/tests/selectors.test.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
import { makeSelectLocation } from 'containers/App/selectors';
import { selectLocation } from 'containers/App/selectors';

describe('makeSelectLocation', () => {
describe('selectLocation', () => {
it('should select the location', () => {
const locationStateSelector = makeSelectLocation();
const router = {
location: { pathname: '/foo' },
};
const mockedState = {
router,
};
expect(locationStateSelector(mockedState)).toEqual(router.location);
expect(selectLocation(mockedState)).toEqual(router.location);
});
});
Loading

0 comments on commit e43fee1

Please sign in to comment.