From e1c70769ea235a78da463ab21de40582381bec78 Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Mon, 6 Nov 2017 22:03:53 +0900 Subject: [PATCH] add find action and reducer --- src/content/actions/find.js | 36 ++++++++++++++++++++++++++++++ src/content/actions/index.js | 5 +++++ src/content/reducers/find.js | 25 +++++++++++++++++++++ src/content/reducers/index.js | 3 +++ test/content/actions/find.test.js | 19 ++++++++++++++++ test/content/reducers/find.test.js | 36 ++++++++++++++++++++++++++++++ 6 files changed, 124 insertions(+) create mode 100644 src/content/actions/find.js create mode 100644 src/content/reducers/find.js create mode 100644 test/content/actions/find.test.js create mode 100644 test/content/reducers/find.test.js diff --git a/src/content/actions/find.js b/src/content/actions/find.js new file mode 100644 index 0000000..90c9de9 --- /dev/null +++ b/src/content/actions/find.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 }; diff --git a/src/content/actions/index.js b/src/content/actions/index.js index 8cc2303..a727e13 100644 --- a/src/content/actions/index.js +++ b/src/content/actions/index.js @@ -21,4 +21,9 @@ export default { FOLLOW_CONTROLLER_DISABLE: 'follow.controller.disable', FOLLOW_CONTROLLER_KEY_PRESS: 'follow.controller.key.press', FOLLOW_CONTROLLER_BACKSPACE: 'follow.controller.backspace', + + // Find + FIND_SHOW: 'find.show', + FIND_HIDE: 'find.hide', + FIND_SET_KEYWORD: 'find.set.keyword', }; diff --git a/src/content/reducers/find.js b/src/content/reducers/find.js new file mode 100644 index 0000000..6042f50 --- /dev/null +++ b/src/content/reducers/find.js @@ -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; + } +} diff --git a/src/content/reducers/index.js b/src/content/reducers/index.js index 17c0429..2487d85 100644 --- a/src/content/reducers/index.js +++ b/src/content/reducers/index.js @@ -1,4 +1,5 @@ import addonReducer from './addon'; +import findReducer from './find'; import settingReducer from './setting'; import inputReducer from './input'; import followControllerReducer from './follow-controller'; @@ -6,6 +7,7 @@ import followControllerReducer from './follow-controller'; // Make setting reducer instead of re-use const defaultState = { addon: addonReducer(undefined, {}), + find: findReducer(undefined, {}), setting: settingReducer(undefined, {}), input: inputReducer(undefined, {}), followController: followControllerReducer(undefined, {}), @@ -14,6 +16,7 @@ const defaultState = { export default function reducer(state = defaultState, action = {}) { return Object.assign({}, state, { addon: addonReducer(state.addon, action), + find: findReducer(state.find, action), setting: settingReducer(state.setting, action), input: inputReducer(state.input, action), followController: followControllerReducer(state.followController, action), diff --git a/test/content/actions/find.test.js b/test/content/actions/find.test.js new file mode 100644 index 0000000..676e105 --- /dev/null +++ b/test/content/actions/find.test.js @@ -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); + }); + }); +}); diff --git a/test/content/reducers/find.test.js b/test/content/reducers/find.test.js new file mode 100644 index 0000000..3aacbd9 --- /dev/null +++ b/test/content/reducers/find.test.js @@ -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'); + }); +});