diff options
author | Shin'ya Ueoka <ueokande@i-beam.org> | 2020-11-28 13:25:47 +0900 |
---|---|---|
committer | Shin'ya Ueoka <ueokande@i-beam.org> | 2020-12-09 23:08:59 +0900 |
commit | 809bdb11f3d213254c098411755631b1264c52f0 (patch) | |
tree | df55fac613441001f357a047a9a17472f8ec9ede /src/content/controllers | |
parent | fd2055e2702251c856f60214f150c78d558dcbf7 (diff) |
Make operators as a strategy pattern
Diffstat (limited to 'src/content/controllers')
-rw-r--r-- | src/content/controllers/KeymapController.ts | 88 |
1 files changed, 10 insertions, 78 deletions
diff --git a/src/content/controllers/KeymapController.ts b/src/content/controllers/KeymapController.ts index 092e55c..01ac8b5 100644 --- a/src/content/controllers/KeymapController.ts +++ b/src/content/controllers/KeymapController.ts @@ -1,32 +1,15 @@ import { injectable, inject } from "tsyringe"; -import * as operations from "../../shared/operations"; import KeymapUseCase from "../usecases/KeymapUseCase"; -import AddonEnabledUseCase from "../usecases/AddonEnabledUseCase"; -import FindSlaveUseCase from "../usecases/FindSlaveUseCase"; -import ScrollUseCase from "../usecases/ScrollUseCase"; -import FocusUseCase from "../usecases/FocusUseCase"; -import ClipboardUseCase from "../usecases/ClipboardUseCase"; -import OperationClient from "../client/OperationClient"; -import MarkKeyyUseCase from "../usecases/MarkKeyUseCase"; -import FollowMasterClient from "../client/FollowMasterClient"; import Key from "../../shared/settings/Key"; +import OperatorFactory from "../operators/OperatorFactory"; @injectable() export default class KeymapController { constructor( private keymapUseCase: KeymapUseCase, - private addonEnabledUseCase: AddonEnabledUseCase, - private findSlaveUseCase: FindSlaveUseCase, - private scrollUseCase: ScrollUseCase, - private focusUseCase: FocusUseCase, - private clipbaordUseCase: ClipboardUseCase, - private markKeyUseCase: MarkKeyyUseCase, - @inject("OperationClient") - private operationClient: OperationClient, - - @inject("FollowMasterClient") - private followMasterClient: FollowMasterClient + @inject("OperatorFactory") + private readonly operatorFactory: OperatorFactory ) {} // eslint-disable-next-line complexity, max-lines-per-function @@ -36,65 +19,14 @@ export default class KeymapController { return false; } - if (!operations.isNRepeatable(nextOp.op.type)) { - nextOp.repeat = 1; - } - - const doFunc = ((op: operations.Operation) => { - switch (op.type) { - case operations.ADDON_ENABLE: - return () => this.addonEnabledUseCase.enable(); - case operations.ADDON_DISABLE: - return () => this.addonEnabledUseCase.disable(); - case operations.ADDON_TOGGLE_ENABLED: - return () => this.addonEnabledUseCase.toggle(); - case operations.FIND_NEXT: - return () => this.findSlaveUseCase.findNext(); - case operations.FIND_PREV: - return () => this.findSlaveUseCase.findPrev(); - case operations.SCROLL_VERTICALLY: - return () => this.scrollUseCase.scrollVertically(op.count); - case operations.SCROLL_HORIZONALLY: - return () => this.scrollUseCase.scrollHorizonally(op.count); - case operations.SCROLL_PAGES: - return () => this.scrollUseCase.scrollPages(op.count); - case operations.SCROLL_TOP: - return () => this.scrollUseCase.scrollToTop(); - case operations.SCROLL_BOTTOM: - return () => this.scrollUseCase.scrollToBottom(); - case operations.SCROLL_HOME: - return () => this.scrollUseCase.scrollToHome(); - case operations.SCROLL_END: - return () => this.scrollUseCase.scrollToEnd(); - case operations.FOLLOW_START: - return () => - this.followMasterClient.startFollow(op.newTab, op.background); - case operations.MARK_SET_PREFIX: - return () => this.markKeyUseCase.enableSetMode(); - case operations.MARK_JUMP_PREFIX: - return () => this.markKeyUseCase.enableJumpMode(); - case operations.FOCUS_INPUT: - return () => this.focusUseCase.focusFirstInput(); - case operations.URLS_YANK: - return () => this.clipbaordUseCase.yankCurrentURL(); - case operations.URLS_PASTE: - return () => - this.clipbaordUseCase.openOrSearch(op.newTab ? op.newTab : false); - default: - return null; - } - })(nextOp.op); + // Do not await asynchronous methods to return a boolean immidiately. The + // caller requires the synchronous response from the callback to identify + // to continue of abandon the event propagation. + this.operatorFactory + .create(nextOp.op, nextOp.repeat) + .run() + .catch(console.error); - if (doFunc === null) { - // Do not await asynchronous methods to return a boolean immidiately. The - // caller requires the synchronous response from the callback to identify - // to continue of abandon the event propagations. - this.operationClient.execBackgroundOp(nextOp.repeat, nextOp.op); - } else { - for (let i = 0; i < nextOp.repeat; ++i) { - doFunc(); - } - } return true; } |