aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/react/actions/search.js39
-rw-r--r--src/client/react/actions/view.js51
-rw-r--r--src/client/react/components/container/Results.js3
-rw-r--r--src/client/react/components/container/Search.js15
-rw-r--r--src/client/react/components/container/View.js24
-rw-r--r--src/client/react/index.js3
-rw-r--r--src/client/react/reducers/search.test.js35
7 files changed, 46 insertions, 124 deletions
diff --git a/src/client/react/actions/search.js b/src/client/react/actions/search.js
deleted file mode 100644
index e894e84..0000000
--- a/src/client/react/actions/search.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * Copyright (C) 2018 Noah Loomans
- *
- * This file is part of rooster.hetmml.nl.
- *
- * rooster.hetmml.nl is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * rooster.hetmml.nl is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with rooster.hetmml.nl. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-export const setUser = user => ({
- type: 'SEARCH/SET_USER',
- user,
-});
-
-export const inputChange = searchText => ({
- type: 'SEARCH/INPUT_CHANGE',
- searchText,
-});
-
-/**
- * Change the selected result.
- * @param {+1/-1} relativeChange usually +1 or -1, the change relative to the
- * current result.
- */
-export const changeSelectedResult = relativeChange => ({
- type: 'SEARCH/CHANGE_SELECTED_RESULT',
- relativeChange,
-});
diff --git a/src/client/react/actions/view.js b/src/client/react/actions/view.js
deleted file mode 100644
index 986d8f2..0000000
--- a/src/client/react/actions/view.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Copyright (C) 2018 Noah Loomans
- *
- * This file is part of rooster.hetmml.nl.
- *
- * rooster.hetmml.nl is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * rooster.hetmml.nl is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with rooster.hetmml.nl. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-// eslint-disable-next-line import/prefer-default-export
-export const fetchSchedule = (user, week) => (dispatch) => {
- dispatch({
- type: 'VIEW/FETCH_SCHEDULE_REQUEST',
- user,
- week,
- });
-
- fetch(`/get/${user}?week=${week}`).then(
- // success
- (r) => {
- r.text().then((htmlStr) => {
- dispatch({
- type: 'VIEW/FETCH_SCHEDULE_SUCCESS',
- user,
- week,
- htmlStr,
- });
- });
- },
-
- // error
- () => {
- dispatch({
- type: 'VIEW/FETCH_SCHEDULE_FAILURE',
- week,
- user,
- });
- },
- );
-};
diff --git a/src/client/react/components/container/Results.js b/src/client/react/components/container/Results.js
index b36abb2..0f08d7a 100644
--- a/src/client/react/components/container/Results.js
+++ b/src/client/react/components/container/Results.js
@@ -25,7 +25,6 @@ import { connect } from 'react-redux';
import { withRouter } from 'react-router-dom';
import users from '../../users';
-import { setUser } from '../../actions/search';
import { userFromMatch } from '../../lib/url';
import Result from '../presentational/Result';
@@ -73,7 +72,7 @@ class Results extends React.Component {
// EDGE CASE: The user is set if the user changes, but it doesn't
// change if the result is already the one we are viewing.
// Therefor, we need to dispatch the SET_USER command manually.
- this.props.dispatch(setUser(user));
+ this.props.dispatch({ type: 'SEARCH/SET_USER', user });
} else {
this.props.history.push(`/${userId}`);
}
diff --git a/src/client/react/components/container/Search.js b/src/client/react/components/container/Search.js
index b84502c..1c4ca4f 100644
--- a/src/client/react/components/container/Search.js
+++ b/src/client/react/components/container/Search.js
@@ -27,7 +27,6 @@ import { withRouter } from 'react-router-dom';
import SearchIcon from 'react-icons/lib/md/search';
import { userFromMatch } from '../../lib/url';
-import { setUser, inputChange, changeSelectedResult } from '../../actions/search';
import users from '../../users';
import Results from './Results';
@@ -65,13 +64,13 @@ class Search extends React.Component {
componentDidMount() {
const urlUser = userFromMatch(this.props.match);
- this.props.dispatch(setUser(urlUser));
+ this.props.dispatch({ type: 'SEARCH/SET_USERS', urlUser });
}
componentWillReceiveProps(nextProps) {
if (nextProps.match !== this.props.match) {
const urlUser = userFromMatch(nextProps.match);
- this.props.dispatch(setUser(urlUser));
+ this.props.dispatch({ type: 'SEARCH/SET_USERS', urlUser });
}
}
@@ -94,17 +93,17 @@ class Search extends React.Component {
switch (event.key) {
case 'ArrowUp':
event.preventDefault();
- this.props.dispatch(changeSelectedResult(-1));
+ this.props.dispatch({ type: 'SEARCH/CHANGE_SELECTED_RESULT', relativeChange: -1 });
break;
case 'ArrowDown':
event.preventDefault();
- this.props.dispatch(changeSelectedResult(+1));
+ this.props.dispatch({ type: 'SEARCH/CHANGE_SELECTED_RESULT', relativeChange: +1 });
break;
case 'Escape':
event.preventDefault();
- this.props.dispatch(setUser(urlUser));
+ this.props.dispatch({ type: 'SEARCH/SET_USERS', urlUser });
break;
case 'Enter':
@@ -113,7 +112,7 @@ class Search extends React.Component {
// EDGE CASE: The user is set if the user changes, but it doesn't
// change if the result is already the one we are viewing.
// Therefor, we need to dispatch the SET_USER command manually.
- this.props.dispatch(setUser(urlUser));
+ this.props.dispatch({ type: 'SEARCH/SET_USERS', urlUser });
} else if (result) {
this.props.history.push(`/${result}`);
}
@@ -153,7 +152,7 @@ class Search extends React.Component {
</div>
<input
id="search__input"
- onChange={event => dispatch(inputChange(event.target.value))}
+ onChange={event => dispatch({ type: 'SEARCH/INPUT_CHANGE', searchText: event.target.value })}
onKeyDown={this.onKeyDown}
value={searchText}
placeholder="Zoeken"
diff --git a/src/client/react/components/container/View.js b/src/client/react/components/container/View.js
index 938614e..28aaad3 100644
--- a/src/client/react/components/container/View.js
+++ b/src/client/react/components/container/View.js
@@ -24,7 +24,6 @@ import { connect } from 'react-redux';
import { withRouter } from 'react-router-dom';
import { userFromMatch, weekFromLocation } from '../../lib/url';
-import { fetchSchedule } from '../../actions/view';
import extractSchedule from '../../lib/extractSchedule';
import Schedule from '../presentational/Schedule';
@@ -66,7 +65,28 @@ class View extends React.Component {
const schedule = extractSchedule(schedules, user, week);
if (schedule.state === 'NOT_REQUESTED') {
- dispatch(fetchSchedule(user, week));
+ fetch(`/get/${user}?week=${week}`).then(
+ // success
+ (r) => {
+ r.text().then((htmlStr) => {
+ dispatch({
+ type: 'VIEW/FETCH_SCHEDULE_SUCCESS',
+ user,
+ week,
+ htmlStr,
+ });
+ });
+ },
+
+ // error
+ () => {
+ dispatch({
+ type: 'VIEW/FETCH_SCHEDULE_FAILURE',
+ week,
+ user,
+ });
+ },
+ );
}
}
diff --git a/src/client/react/index.js b/src/client/react/index.js
index 2ce7b6c..566c847 100644
--- a/src/client/react/index.js
+++ b/src/client/react/index.js
@@ -25,7 +25,6 @@ import moment from 'moment';
import { createStore, applyMiddleware, compose } from 'redux';
import { Provider } from 'react-redux';
import logger from 'redux-logger';
-import thunk from 'redux-thunk';
import {
BrowserRouter as Router,
@@ -44,7 +43,7 @@ moment.locale('nl');
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(
reducer,
- composeEnhancers(applyMiddleware(thunk, logger)),
+ composeEnhancers(applyMiddleware(logger)),
);
ReactDOM.render(
diff --git a/src/client/react/reducers/search.test.js b/src/client/react/reducers/search.test.js
index bb1ad8a..48ca05a 100644
--- a/src/client/react/reducers/search.test.js
+++ b/src/client/react/reducers/search.test.js
@@ -33,21 +33,16 @@ window.USERS = [
const deepFreeze = require('deep-freeze');
const search = require('./search').default;
const { _test } = require('./search');
-const {
- setUser,
- inputChange,
- changeSelectedResult,
-} = require('../actions/search');
describe('reducers', () => {
describe('search', () => {
describe('SEARCH/SET_USER', () => {
it('Resets to the default state if the user is null', () => {
- expect(search({ foo: 'bar' }, setUser(null))).toEqual(_test.DEFAULT_STATE);
+ expect(search({ foo: 'bar' }, { type: 'SEARCH/SET_USER', user: null })).toEqual(_test.DEFAULT_STATE);
});
it('Sets all the values of that user properly', () => {
- expect(search(undefined, setUser('s/18561'))).toEqual({
+ expect(search(undefined, { type: 'SEARCH/SET_USER', user: 's/18561' })).toEqual({
results: [],
searchText: '18561',
selectedResult: 's/18561',
@@ -57,7 +52,7 @@ describe('reducers', () => {
describe('SEARCH/INPUT_CHANGE', () => {
it('Returns no results when nothing is typed in', () => {
- expect(search(undefined, inputChange(''))).toEqual({
+ expect(search(undefined, { type: 'SEARCH/INPUT_CHANGE', searchText: '' })).toEqual({
results: [],
searchText: '',
selectedResult: null,
@@ -65,7 +60,7 @@ describe('reducers', () => {
});
it('Returns no results when a space is typed in', () => {
- expect(search(undefined, inputChange(' '))).toEqual({
+ expect(search(undefined, { type: 'SEARCH/INPUT_CHANGE', searchText: ' ' })).toEqual({
results: [],
searchText: ' ',
selectedResult: null,
@@ -73,7 +68,7 @@ describe('reducers', () => {
});
it('Preforms a basic search, only returning four results', () => {
- expect(search(undefined, inputChange('18'))).toEqual({
+ expect(search(undefined, { type: 'SEARCH/INPUT_CHANGE', searchText: '18' })).toEqual({
results: [
's/18561',
's/18562',
@@ -94,8 +89,8 @@ describe('reducers', () => {
selectedResult: null,
};
- const actionPlus = changeSelectedResult(+1);
- const actionMin = changeSelectedResult(-1);
+ const actionPlus = { type: 'SEARCH/CHANGE_SELECTED_RESULT', relativeChange: +1 };
+ const actionMin = { type: 'SEARCH/CHANGE_SELECTED_RESULT', relativeChange: -1 };
deepFreeze([prevState, actionPlus, actionMin]);
@@ -112,8 +107,8 @@ describe('reducers', () => {
selectedResult: null,
};
- const actionPlus = changeSelectedResult(+1);
- const actionMin = changeSelectedResult(-1);
+ const actionPlus = { type: 'SEARCH/CHANGE_SELECTED_RESULT', relativeChange: +1 };
+ const actionMin = { type: 'SEARCH/CHANGE_SELECTED_RESULT', relativeChange: -1 };
deepFreeze([prevState, actionPlus, actionMin]);
@@ -137,8 +132,8 @@ describe('reducers', () => {
selectedResult: 's/18562',
};
- const actionPlus = changeSelectedResult(+1);
- const actionMin = changeSelectedResult(-1);
+ const actionPlus = { type: 'SEARCH/CHANGE_SELECTED_RESULT', relativeChange: +1 };
+ const actionMin = { type: 'SEARCH/CHANGE_SELECTED_RESULT', relativeChange: -1 };
deepFreeze([prevState, actionPlus, actionMin]);
@@ -160,7 +155,7 @@ describe('reducers', () => {
results: ['s/18561', 's/18562', 's/18563'],
searchText: '1856',
selectedResult: 's/18563',
- }, changeSelectedResult(+1))).toEqual({
+ }, { type: 'SEARCH/CHANGE_SELECTED_RESULT', relativeChange: +1 })).toEqual({
results: ['s/18561', 's/18562', 's/18563'],
searchText: '1856',
selectedResult: null,
@@ -170,7 +165,7 @@ describe('reducers', () => {
results: ['s/18561', 's/18562', 's/18563'],
searchText: '1856',
selectedResult: null,
- }, changeSelectedResult(+1))).toEqual({
+ }, { type: 'SEARCH/CHANGE_SELECTED_RESULT', relativeChange: +1 })).toEqual({
results: ['s/18561', 's/18562', 's/18563'],
searchText: '1856',
selectedResult: 's/18561',
@@ -182,7 +177,7 @@ describe('reducers', () => {
results: ['s/18561', 's/18562', 's/18563'],
searchText: '1856',
selectedResult: 's/18561',
- }, changeSelectedResult(-1))).toEqual({
+ }, { type: 'SEARCH/CHANGE_SELECTED_RESULT', relativeChange: -1 })).toEqual({
results: ['s/18561', 's/18562', 's/18563'],
searchText: '1856',
selectedResult: null,
@@ -192,7 +187,7 @@ describe('reducers', () => {
results: ['s/18561', 's/18562', 's/18563'],
searchText: '1856',
selectedResult: null,
- }, changeSelectedResult(-1))).toEqual({
+ }, { type: 'SEARCH/CHANGE_SELECTED_RESULT', relativeChange: -1 })).toEqual({
results: ['s/18561', 's/18562', 's/18563'],
searchText: '1856',
selectedResult: 's/18563',