aboutsummaryrefslogtreecommitdiff
path: root/src/content/components
diff options
context:
space:
mode:
Diffstat (limited to 'src/content/components')
-rw-r--r--src/content/components/common/index.ts36
-rw-r--r--src/content/components/common/keymapper.ts39
-rw-r--r--src/content/components/common/mark.ts8
-rw-r--r--src/content/components/top-content/follow-controller.ts8
4 files changed, 53 insertions, 38 deletions
diff --git a/src/content/components/common/index.ts b/src/content/components/common/index.ts
index be77812..899953d 100644
--- a/src/content/components/common/index.ts
+++ b/src/content/components/common/index.ts
@@ -2,22 +2,18 @@ import InputComponent from './input';
import FollowComponent from './follow';
import MarkComponent from './mark';
import KeymapperComponent from './keymapper';
-import * as settingActions from '../../actions/setting';
import * as messages from '../../../shared/messages';
import MessageListener from '../../MessageListener';
import * as blacklists from '../../../shared/blacklists';
import * as keys from '../../../shared/utils/keys';
-import * as actions from '../../actions';
import AddonEnabledUseCase from '../../usecases/AddonEnabledUseCase';
+import SettingUseCase from '../../usecases/SettingUseCase';
let addonEnabledUseCase = new AddonEnabledUseCase();
+let settingUseCase = new SettingUseCase();
export default class Common {
- private win: Window;
-
- private store: any;
-
constructor(win: Window, store: any) {
const input = new InputComponent(win.document.body);
const follow = new FollowComponent(win);
@@ -28,9 +24,6 @@ export default class Common {
input.onKey((key: keys.Key) => mark.key(key));
input.onKey((key: keys.Key) => keymapper.key(key));
- this.win = win;
- this.store = store;
-
this.reloadSettings();
new MessageListener().onBackgroundMessage(this.onMessage.bind(this));
@@ -41,23 +34,22 @@ export default class Common {
case messages.SETTINGS_CHANGED:
return this.reloadSettings();
case messages.ADDON_TOGGLE_ENABLED:
- addonEnabledUseCase.toggle();
+ return addonEnabledUseCase.toggle();
}
+ return undefined;
}
- reloadSettings() {
+ async reloadSettings() {
try {
- this.store.dispatch(settingActions.load())
- .then((action: actions.SettingAction) => {
- let enabled = !blacklists.includes(
- action.settings.blacklist, this.win.location.href
- );
- if (enabled) {
- addonEnabledUseCase.enable();
- } else {
- addonEnabledUseCase.disable();
- }
- });
+ let current = await settingUseCase.reload();
+ let disabled = blacklists.includes(
+ current.blacklist, window.location.href,
+ );
+ if (disabled) {
+ addonEnabledUseCase.disable();
+ } else {
+ addonEnabledUseCase.enable();
+ }
} catch (e) {
// Sometime sendMessage fails when background script is not ready.
console.warn(e);
diff --git a/src/content/components/common/keymapper.ts b/src/content/components/common/keymapper.ts
index 02579ec..c901ffe 100644
--- a/src/content/components/common/keymapper.ts
+++ b/src/content/components/common/keymapper.ts
@@ -4,8 +4,18 @@ import * as operations from '../../../shared/operations';
import * as keyUtils from '../../../shared/utils/keys';
import AddonEnabledUseCase from '../../usecases/AddonEnabledUseCase';
+import { SettingRepositoryImpl } from '../../repositories/SettingRepository';
+import { Keymaps } from '../../../shared/Settings';
+
+type KeymapEntityMap = Map<keyUtils.Key[], operations.Operation>;
let addonEnabledUseCase = new AddonEnabledUseCase();
+let settingRepository = new SettingRepositoryImpl();
+
+const reservedKeymaps: Keymaps = {
+ '<Esc>': { type: operations.CANCEL },
+ '<C-[>': { type: operations.CANCEL },
+};
const mapStartsWith = (
mapping: keyUtils.Key[],
@@ -29,18 +39,11 @@ export default class KeymapperComponent {
this.store = store;
}
- // eslint-disable-next-line max-statements
key(key: keyUtils.Key): boolean {
this.store.dispatch(inputActions.keyPress(key));
- let state = this.store.getState();
- let input = state.input;
- let keymaps = new Map<keyUtils.Key[], operations.Operation>(
- state.setting.keymaps.map(
- (e: {key: keyUtils.Key[], op: operations.Operation}) => [e.key, e.op],
- )
- );
-
+ let input = this.store.getState().input;
+ let keymaps = this.keymapEntityMap();
let matched = Array.from(keymaps.keys()).filter(
(mapping: keyUtils.Key[]) => {
return mapStartsWith(mapping, input.keys);
@@ -62,11 +65,23 @@ export default class KeymapperComponent {
return true;
}
let operation = keymaps.get(matched[0]) as operations.Operation;
- let act = operationActions.exec(
- operation, state.setting,
- );
+ let act = operationActions.exec(operation);
this.store.dispatch(act);
this.store.dispatch(inputActions.clearKeys());
return true;
}
+
+ private keymapEntityMap(): KeymapEntityMap {
+ let keymaps = {
+ ...settingRepository.get().keymaps,
+ ...reservedKeymaps,
+ };
+ let entries = Object.entries(keymaps).map((entry) => {
+ return [
+ keyUtils.fromMapKeys(entry[0]),
+ entry[1],
+ ];
+ }) as [keyUtils.Key[], operations.Operation][];
+ return new Map<keyUtils.Key[], operations.Operation>(entries);
+ }
}
diff --git a/src/content/components/common/mark.ts b/src/content/components/common/mark.ts
index 1237385..77aa15d 100644
--- a/src/content/components/common/mark.ts
+++ b/src/content/components/common/mark.ts
@@ -4,6 +4,10 @@ import * as consoleFrames from '../..//console-frames';
import * as keyUtils from '../../../shared/utils/keys';
import Mark from '../../Mark';
+import { SettingRepositoryImpl } from '../../repositories/SettingRepository';
+
+let settingRepository = new SettingRepositoryImpl();
+
const cancelKey = (key: keyUtils.Key): boolean => {
return key.key === 'Esc' || key.key === '[' && Boolean(key.ctrlKey);
};
@@ -21,8 +25,8 @@ export default class MarkComponent {
// eslint-disable-next-line max-statements
key(key: keyUtils.Key) {
- let { mark: markState, setting } = this.store.getState();
- let smoothscroll = setting.properties.smoothscroll;
+ let smoothscroll = settingRepository.get().properties.smoothscroll;
+ let { mark: markState } = this.store.getState();
if (!markState.setMode && !markState.jumpMode) {
return false;
diff --git a/src/content/components/top-content/follow-controller.ts b/src/content/components/top-content/follow-controller.ts
index d49b22a..2fcf365 100644
--- a/src/content/components/top-content/follow-controller.ts
+++ b/src/content/components/top-content/follow-controller.ts
@@ -3,6 +3,10 @@ import * as messages from '../../../shared/messages';
import MessageListener, { WebMessageSender } from '../../MessageListener';
import HintKeyProducer from '../../hint-key-producer';
+import { SettingRepositoryImpl } from '../../repositories/SettingRepository';
+
+let settingRepository = new SettingRepositoryImpl();
+
const broadcastMessage = (win: Window, message: messages.Message): void => {
let json = JSON.stringify(message);
let frames = [win.self].concat(Array.from(win.frames as any));
@@ -160,7 +164,7 @@ export default class FollowController {
});
}
- hintchars() {
- return this.store.getState().setting.properties.hintchars;
+ private hintchars() {
+ return settingRepository.get().properties.hintchars;
}
}