Skip to content
This repository has been archived by the owner on Jun 28, 2021. It is now read-only.

Feature/refactor redux #414

Merged
merged 10 commits into from
Aug 6, 2016
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions server.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ import debug from './src/helpers/debug';

import Html from './src/helpers/Html';

import { setUserAgent } from './src/redux/modules/audioplayer';
import { setOption } from './src/redux/modules/options';
import { setUserAgent } from './src/redux/actions/audioPlayerActions.js';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thoughts about the file names just /actions/audioplayer Also, audioplayer has not been cased like audioPlayer throughout

import { setOption } from './src/redux/actions/optionsActions.js';

// Use varnish for the static routes, which will cache too
server.use(raven.middleware.express.requestHandler(config.sentryServer));
Expand Down
2 changes: 1 addition & 1 deletion src/components/Audioplayer/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { connect } from 'react-redux';
import { camelize } from 'humps';

// Redux
import * as AudioActions from '../../redux/modules/audioplayer';
import * as AudioActions from '../../redux/actions/audioPlayerActions';

// Components
import Track from './Track';
Expand Down
2 changes: 1 addition & 1 deletion src/components/FontStyles/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { Component, PropTypes } from 'react';
import { connect } from 'react-redux';
import { fontFaceStyle, fontFaceStyleLoaded } from '../../helpers/buildFontFaces';
import { load } from 'redux/modules/fontFaces';
import { load } from 'redux/actions/fontFaceActions.js';

import debug from 'helpers/debug';
import selector from './selector';
Expand Down
2 changes: 1 addition & 1 deletion src/containers/Home/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { connect } from 'react-redux';

import debug from '../../helpers/debug';

import { isAllLoaded, loadAll } from '../../redux/modules/surahs';
import { isAllLoaded, loadAll } from '../../redux/actions/surahsActions.js';

const styles = require('./style.scss');

Expand Down
2 changes: 1 addition & 1 deletion src/containers/Search/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import Header from './Header';
import Ayah from '../../components/Ayah';
import CoreLoader from '../../components/Loader';

import { search } from '../../redux/modules/searchResults';
import { search } from '../../redux/actions/searchActions.js';

const style = require('./style.scss');

Expand Down
13 changes: 11 additions & 2 deletions src/containers/Surah/connect.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
import { isAllLoaded, loadAll, setCurrent as setCurrentSurah } from '../../redux/modules/surahs';
import { clearCurrent, isLoaded, load as loadAyahs } from '../../redux/modules/ayahs';
import {
isAllLoaded,
loadAll,
setCurrent as setCurrentSurah
} from '../../redux/actions/surahsActions.js';

import {
clearCurrent,
isLoaded,
load as loadAyahs
} from '../../redux/actions/ayahsActions.js';

import debug from 'helpers/debug';

Expand Down
6 changes: 3 additions & 3 deletions src/containers/Surah/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,9 @@ import descriptions from './descriptions';

import { surahsConnect, ayahsConnect } from './connect';

import * as AudioActions from '../../redux/modules/audioplayer';
import * as AyahActions from '../../redux/modules/ayahs';
import * as OptionsActions from '../../redux/modules/options';
import * as AudioActions from '../../redux/actions/audioPlayerActions.js';
import * as AyahActions from '../../redux/actions/ayahsActions.js';
import * as OptionsActions from '../../redux/actions/optionsActions.js';

const style = require('./style.scss');

Expand Down
95 changes: 95 additions & 0 deletions src/redux/actions/AudioPlayerActions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import {
SET_USER_AGENT,
SET_CURRENT_FILE,
SET_CURRENT_WORD,
PLAY,
PAUSE,
NEXT,
SET_AYAH,
PREVIOUS,
SET_REPEAT,
TOGGLE_SCROLL,
BUILD_ON_CLIENT,
UPDATE
} from '../constants/AudioPlayerActionTypes.js';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AudioPlayerActionTypes Why camel cased?


export function setUserAgent(userAgent) {
return {
type: SET_USER_AGENT,
userAgent
};
}

export function setCurrentFile(file) {
return {
type: SET_CURRENT_FILE,
file
};
}

export function setCurrentWord(word) {
return {
type: SET_CURRENT_WORD,
word
};
}

export function play() {
return {
type: PLAY
};
}

export function pause() {
return {
type: PAUSE
};
}

export function next(currentAyah) {
return {
type: NEXT,
currentAyah
};
}

export function setAyah(currentAyah) {
return {
type: SET_AYAH,
currentAyah
};
}

export function previous(currentAyah) {
return {
type: PREVIOUS,
currentAyah
};
}

export function setRepeat(repeat) {
return {
type: SET_REPEAT,
repeat
};
}

export function toggleScroll() {
return {
type: TOGGLE_SCROLL
};
}

export function buildOnClient(surahId) {
return {
type: BUILD_ON_CLIENT,
surahId
};
}

export function update(payload) {
return {
type: UPDATE,
payload
};
}
75 changes: 75 additions & 0 deletions src/redux/actions/AyahsActions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import { ayahsSchema } from '../schemas';

import { arrayOf } from 'normalizr';

import {
LOAD,
LOAD_SUCCESS,
LOAD_FAIL,
CLEAR_CURRENT,
SET_CURRENT_AYAH,
SET_CURRENT_WORD,
CLEAR_CURRENT_WORD

} from '../constants/AyahsActionTypes.js';

// For safe measure
const defaultOptions = {
audio: 8,
quran: 1,
content: [19]
};

export function load(id, from, to, options = defaultOptions) {
const { audio, quran, content } = options;

return {
types: [LOAD, LOAD_SUCCESS, LOAD_FAIL],
schema: arrayOf(ayahsSchema),
promise: (client) => client.get(`/v2/surahs/${id}/ayahs`, {
params: {
from,
to,
audio,
quran,
content
}
}),
surahId: id
};
}

export function clearCurrent(id) {
return {
type: CLEAR_CURRENT,
id
};
}

export function clearCurrentWord() {
return {
type: CLEAR_CURRENT_WORD
};
}

export function setCurrentAyah(id) {
return {
type: SET_CURRENT_AYAH,
id
};
}

export function setCurrentWord(id) {
return {
type: SET_CURRENT_WORD,
id
};
}

export function isLoaded(globalState, surahId, from, to) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we use store checks in action files too? Since they don't actually dispatch an action

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this one is an odd case, I am not sure where to put it. It only gets used inside surah/connect.js, possibly a helper function?

return (
globalState.ayahs.entities[surahId] &&
globalState.ayahs.entities[surahId][`${surahId}:${from}`] &&
globalState.ayahs.entities[surahId][`${surahId}:${to}`]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

indentation :)

);
}
8 changes: 8 additions & 0 deletions src/redux/actions/FontFaceActions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { LOAD } from '../constants/FontFaceActionTypes.js';

export function load(className) {
return {
type: LOAD,
className
};
}
23 changes: 23 additions & 0 deletions src/redux/actions/OptionsActions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import cookie from 'react-cookie';
import { TOGGLE_READING_MODE, SET_OPTION } from '../constants/OptionsActionTypes.js'

export function isReadingMode(globalState) {
return globalState.options.isReadingMode;
}

export function setOption(payload) {
const options = cookie.load('options') || {}; // protect against first timers.
Object.keys(payload).forEach(option => { options[option] = payload[option]; });
cookie.save('options', JSON.stringify(options));

return {
type: SET_OPTION,
payload
};
}

export function toggleReadingMode() {
return {
type: TOGGLE_READING_MODE
};
}
21 changes: 21 additions & 0 deletions src/redux/actions/SearchActions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { ayahsSchema } from '../schemas';
import { arrayOf } from 'normalizr';

import {
SEARCH,
SEARCH_SUCCESS,
SEARCH_FAIL
} from '../constants/SearchActionTypes.js';

export function search(params) {
return {
types: [SEARCH, SEARCH_SUCCESS, SEARCH_FAIL],
schema: {results: arrayOf({ayah: ayahsSchema})},
promise: (client) => client.get('/v2/search', { params }),
params
};
}

export function isQueried() {
return false;
}
49 changes: 49 additions & 0 deletions src/redux/actions/SurahsActions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { surahsSchema } from '../schemas';
import { arrayOf } from 'normalizr';
import {
LOAD,
LOAD_SUCCESS,
LOAD_FAIL,
LOAD_INFO,
LOAD_INFO_SUCCESS,
LOAD_INFO_FAIL,
SET_CURRENT
} from '../constants/SurahsActionTypes.js'
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

indent


export function loadAll() {
return {
types: [LOAD, LOAD_SUCCESS, LOAD_FAIL],
schema: arrayOf(surahsSchema),
promise: (client) => client.get('/v2/surahs')
};
}

export function load(id) {
return {
types: [LOAD, LOAD_SUCCESS, LOAD_FAIL],
schema: arrayOf(surahsSchema),
promise: (client) => client.get(`/v2/surahs/${id}`)
};
}

export function loadInfo(link) {
return {
types: [LOAD_INFO, LOAD_INFO_SUCCESS, LOAD_INFO_FAIL],
promise: (client) => client.get(`http://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&titles=${link}&redirects=true`) // eslint-disable-line max-len
};
}

export function setCurrent(id) {
return {
type: SET_CURRENT,
current: id
};
}

export function isSingleLoaded(globalState, id) {
return !!globalState.surahs.entities[id];
}

export function isAllLoaded(globalState) {
return Object.keys(globalState.surahs.entities).length === 114;
}
Loading