diff options
Diffstat (limited to 'src/background')
| -rw-r--r-- | src/background/controllers/OperationController.ts | 19 | ||||
| -rw-r--r-- | src/background/repositories/RepeatRepository.ts | 22 | ||||
| -rw-r--r-- | src/background/usecases/RepeatUseCase.ts | 49 | 
3 files changed, 89 insertions, 1 deletions
| diff --git a/src/background/controllers/OperationController.ts b/src/background/controllers/OperationController.ts index 1e80f54..7233c0e 100644 --- a/src/background/controllers/OperationController.ts +++ b/src/background/controllers/OperationController.ts @@ -6,6 +6,7 @@ import TabUseCase from '../usecases/TabUseCase';  import TabSelectUseCase from '../usecases/TabSelectUseCase';  import ZoomUseCase from '../usecases/ZoomUseCase';  import NavigateUseCase from '../usecases/NavigateUseCase'; +import RepeatUseCase from '../usecases/RepeatUseCase';  @injectable()  export default class OperationController { @@ -16,11 +17,19 @@ export default class OperationController {      private tabSelectUseCase: TabSelectUseCase,      private zoomUseCase: ZoomUseCase,      private navigateUseCase: NavigateUseCase, +    private repeatUseCase: RepeatUseCase,    ) {    } +  async exec(op: operations.Operation): Promise<any> { +    await this.doOperation(op); +    if (this.repeatUseCase.isRepeatable(op)) { +      this.repeatUseCase.storeLastOperation(op); +    } +  } +    // eslint-disable-next-line complexity, max-lines-per-function -  exec(operation: operations.Operation): Promise<any> { +  doOperation(operation: operations.Operation): Promise<any> {      switch (operation.type) {      case operations.TAB_CLOSE:        return this.tabUseCase.close(false); @@ -88,6 +97,14 @@ export default class OperationController {        return this.navigateUseCase.openParent();      case operations.NAVIGATE_ROOT:        return this.navigateUseCase.openRoot(); +    case operations.REPEAT_LAST: +    { +      let last = this.repeatUseCase.getLastOperation(); +      if (typeof last !== 'undefined') { +        return this.doOperation(last); +      } +      return Promise.resolve(); +    }      }      throw new Error('unknown operation: ' + operation.type);    } diff --git a/src/background/repositories/RepeatRepository.ts b/src/background/repositories/RepeatRepository.ts new file mode 100644 index 0000000..c7f7a71 --- /dev/null +++ b/src/background/repositories/RepeatRepository.ts @@ -0,0 +1,22 @@ +import { injectable } from 'tsyringe'; +import { Operation } from '../../shared/operations'; +import MemoryStorage from '../infrastructures/MemoryStorage'; + +const REPEAT_KEY = 'repeat'; + +@injectable() +export default class RepeatRepository { +  private cache: MemoryStorage; + +  constructor() { +    this.cache = new MemoryStorage(); +  } + +  getLastOperation(): Operation | undefined { +    return this.cache.get(REPEAT_KEY); +  } + +  setLastOperation(op: Operation): void { +    this.cache.set(REPEAT_KEY, op); +  } +} diff --git a/src/background/usecases/RepeatUseCase.ts b/src/background/usecases/RepeatUseCase.ts new file mode 100644 index 0000000..a005682 --- /dev/null +++ b/src/background/usecases/RepeatUseCase.ts @@ -0,0 +1,49 @@ +import { injectable } from 'tsyringe'; +import * as operations from '../../shared/operations'; +import RepeatRepository from '../repositories/RepeatRepository'; + +type Operation = operations.Operation; + +@injectable() +export default class RepeatUseCase { +  constructor( +    private repeatRepository: RepeatRepository, +  ) { +  } + +  storeLastOperation(op: Operation): void { +    this.repeatRepository.setLastOperation(op); +  } + +  getLastOperation(): operations.Operation | undefined { +    return this.repeatRepository.getLastOperation(); +  } + +  // eslint-disable-next-line complexity +  isRepeatable(op: Operation): boolean { +    switch (op.type) { +    case operations.NAVIGATE_HISTORY_PREV: +    case operations.NAVIGATE_HISTORY_NEXT: +    case operations.NAVIGATE_LINK_PREV: +    case operations.NAVIGATE_LINK_NEXT: +    case operations.NAVIGATE_PARENT: +    case operations.NAVIGATE_ROOT: +    case operations.PAGE_SOURCE: +    case operations.PAGE_HOME: +    case operations.TAB_CLOSE: +    case operations.TAB_CLOSE_FORCE: +    case operations.TAB_CLOSE_RIGHT: +    case operations.TAB_REOPEN: +    case operations.TAB_RELOAD: +    case operations.TAB_PIN: +    case operations.TAB_UNPIN: +    case operations.TAB_TOGGLE_PINNED: +    case operations.TAB_DUPLICATE: +    case operations.ZOOM_IN: +    case operations.ZOOM_OUT: +    case operations.ZOOM_NEUTRAL: +      return true; +    } +    return false; +  } +} | 
