add find action and reducer

jh-changes
Shin'ya Ueoka 7 years ago
parent be37c42d28
commit e1c70769ea
  1. 36
      src/content/actions/find.js
  2. 5
      src/content/actions/index.js
  3. 25
      src/content/reducers/find.js
  4. 3
      src/content/reducers/index.js
  5. 19
      test/content/actions/find.test.js
  6. 36
      test/content/reducers/find.test.js

@ -0,0 +1,36 @@
//
// window.find(aString, aCaseSensitive, aBackwards, aWrapAround,
// aWholeWord, aSearchInFrames, aShowDialog);
//
// NOTE: window.find is not standard API
// https://developer.mozilla.org/en-US/docs/Web/API/Window/find
import actions from 'content/actions';
const show = () => {
return { type: actions.FIND_SHOW };
};
const hide = () => {
return { type: actions.FIND_HIDE };
};
const next = (keyword) => {
// TODO Error on no matched
window.find(keyword, false, false, true, false, true, false);
return {
type: actions.FIND_SET_KEYWORD,
keyword,
};
};
const prev = (keyword) => {
// TODO Error on no matched
window.find(keyword, false, true, true, false, true, false);
return {
type: actions.FIND_SET_KEYWORD,
keyword,
};
};
export { show, hide, next, prev };

@ -21,4 +21,9 @@ export default {
FOLLOW_CONTROLLER_DISABLE: 'follow.controller.disable', FOLLOW_CONTROLLER_DISABLE: 'follow.controller.disable',
FOLLOW_CONTROLLER_KEY_PRESS: 'follow.controller.key.press', FOLLOW_CONTROLLER_KEY_PRESS: 'follow.controller.key.press',
FOLLOW_CONTROLLER_BACKSPACE: 'follow.controller.backspace', FOLLOW_CONTROLLER_BACKSPACE: 'follow.controller.backspace',
// Find
FIND_SHOW: 'find.show',
FIND_HIDE: 'find.hide',
FIND_SET_KEYWORD: 'find.set.keyword',
}; };

@ -0,0 +1,25 @@
import actions from 'content/actions';
const defaultState = {
enabled: false,
keyword: '',
};
export default function reducer(state = defaultState, action = {}) {
switch (action.type) {
case actions.FIND_SHOW:
return Object.assign({}, state, {
enabled: true,
});
case actions.FIND_HIDE:
return Object.assign({}, state, {
enabled: false,
});
case actions.FIND_SET_KEYWORD:
return Object.assign({}, state, {
keyword: action.keyword,
});
default:
return state;
}
}

@ -1,4 +1,5 @@
import addonReducer from './addon'; import addonReducer from './addon';
import findReducer from './find';
import settingReducer from './setting'; import settingReducer from './setting';
import inputReducer from './input'; import inputReducer from './input';
import followControllerReducer from './follow-controller'; import followControllerReducer from './follow-controller';
@ -6,6 +7,7 @@ import followControllerReducer from './follow-controller';
// Make setting reducer instead of re-use // Make setting reducer instead of re-use
const defaultState = { const defaultState = {
addon: addonReducer(undefined, {}), addon: addonReducer(undefined, {}),
find: findReducer(undefined, {}),
setting: settingReducer(undefined, {}), setting: settingReducer(undefined, {}),
input: inputReducer(undefined, {}), input: inputReducer(undefined, {}),
followController: followControllerReducer(undefined, {}), followController: followControllerReducer(undefined, {}),
@ -14,6 +16,7 @@ const defaultState = {
export default function reducer(state = defaultState, action = {}) { export default function reducer(state = defaultState, action = {}) {
return Object.assign({}, state, { return Object.assign({}, state, {
addon: addonReducer(state.addon, action), addon: addonReducer(state.addon, action),
find: findReducer(state.find, action),
setting: settingReducer(state.setting, action), setting: settingReducer(state.setting, action),
input: inputReducer(state.input, action), input: inputReducer(state.input, action),
followController: followControllerReducer(state.followController, action), followController: followControllerReducer(state.followController, action),

@ -0,0 +1,19 @@
import { expect } from "chai";
import actions from 'content/actions';
import * as findActions from 'content/actions/find';
describe("find actions", () => {
describe("show", () => {
it('create FIND_SHOW action', () => {
let action = findActions.show();
expect(action.type).to.equal(actions.FIND_SHOW);
});
});
describe("hide", () => {
it('create FIND_HIDE action', () => {
let action = findActions.hide();
expect(action.type).to.equal(actions.FIND_HIDE);
});
});
});

@ -0,0 +1,36 @@
import { expect } from "chai";
import actions from 'content/actions';
import findReducer from 'content/reducers/find';
describe("find reducer", () => {
it('return the initial state', () => {
let state = findReducer(undefined, {});
expect(state).to.have.property('enabled', false);
expect(state).to.have.property('keyword', '');
});
it('return next state for FIND_SHOW', () => {
let action = { type: actions.FIND_SHOW };
let prev = { enabled: false };
let state = findReducer(prev, action);
expect(state.enabled).is.equal(true);
});
it('return next state for FIND_HIDE', () => {
let action = { type: actions.FIND_HIDE };
let prev = { enabled: true };
let state = findReducer(prev, action);
expect(state.enabled).is.equal(false);
});
it('return next state for FIND_SET_KEYWORD', () => {
let action = { type: actions.FIND_SET_KEYWORD, keyword: 'my-search' };
let state = { enabled: true, keyword: '' };
state = findReducer(state, action);
expect(state.keyword).is.equal('my-search');
});
});