aboutsummaryrefslogtreecommitdiff
path: root/src/background/usecases/CommandUseCase.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/background/usecases/CommandUseCase.ts')
-rw-r--r--src/background/usecases/CommandUseCase.ts136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/background/usecases/CommandUseCase.ts b/src/background/usecases/CommandUseCase.ts
new file mode 100644
index 0000000..2247d7b
--- /dev/null
+++ b/src/background/usecases/CommandUseCase.ts
@@ -0,0 +1,136 @@
+import * as parsers from './parsers';
+import * as urls from '../../shared/urls';
+import TabPresenter from '../presenters/TabPresenter';
+import WindowPresenter from '../presenters/WindowPresenter';
+import SettingRepository from '../repositories/SettingRepository';
+import BookmarkRepository from '../repositories/BookmarkRepository';
+import ConsoleClient from '../infrastructures/ConsoleClient';
+import ContentMessageClient from '../infrastructures/ContentMessageClient';
+
+export default class CommandIndicator {
+ private tabPresenter: TabPresenter;
+
+ private windowPresenter: WindowPresenter;
+
+ private settingRepository: SettingRepository;
+
+ private bookmarkRepository: BookmarkRepository;
+
+ private consoleClient: ConsoleClient;
+
+ private contentMessageClient: ContentMessageClient;
+
+ constructor() {
+ this.tabPresenter = new TabPresenter();
+ this.windowPresenter = new WindowPresenter();
+ this.settingRepository = new SettingRepository();
+ this.bookmarkRepository = new BookmarkRepository();
+ this.consoleClient = new ConsoleClient();
+
+ this.contentMessageClient = new ContentMessageClient();
+ }
+
+ async open(keywords: string): Promise<browser.tabs.Tab> {
+ let url = await this.urlOrSearch(keywords);
+ return this.tabPresenter.open(url);
+ }
+
+ async tabopen(keywords: string): Promise<browser.tabs.Tab> {
+ let url = await this.urlOrSearch(keywords);
+ return this.tabPresenter.create(url);
+ }
+
+ async winopen(keywords: string): Promise<browser.windows.Window> {
+ let url = await this.urlOrSearch(keywords);
+ return this.windowPresenter.create(url);
+ }
+
+ // eslint-disable-next-line max-statements
+ async buffer(keywords: string): Promise<any> {
+ if (keywords.length === 0) {
+ return;
+ }
+
+ if (!isNaN(Number(keywords))) {
+ let tabs = await this.tabPresenter.getAll();
+ let index = parseInt(keywords, 10) - 1;
+ if (index < 0 || tabs.length <= index) {
+ throw new RangeError(`tab ${index + 1} does not exist`);
+ }
+ return this.tabPresenter.select(tabs[index].id as number);
+ } else if (keywords.trim() === '%') {
+ // Select current window
+ return;
+ } else if (keywords.trim() === '#') {
+ // Select last selected window
+ let lastId = await this.tabPresenter.getLastSelectedId();
+ if (typeof lastId === 'undefined' || lastId === null) {
+ throw new Error('No last selected tab');
+ }
+ return this.tabPresenter.select(lastId);
+ }
+
+ let current = await this.tabPresenter.getCurrent();
+ let tabs = await this.tabPresenter.getByKeyword(keywords);
+ if (tabs.length === 0) {
+ throw new RangeError('No matching buffer for ' + keywords);
+ }
+ for (let tab of tabs) {
+ if (tab.index > current.index) {
+ return this.tabPresenter.select(tab.id as number);
+ }
+ }
+ return this.tabPresenter.select(tabs[0].id as number);
+ }
+
+ async bdelete(force: boolean, keywords: string): Promise<any> {
+ let excludePinned = !force;
+ let tabs = await this.tabPresenter.getByKeyword(keywords, excludePinned);
+ if (tabs.length === 0) {
+ throw new Error('No matching buffer for ' + keywords);
+ } else if (tabs.length > 1) {
+ throw new Error('More than one match for ' + keywords);
+ }
+ return this.tabPresenter.remove([tabs[0].id as number]);
+ }
+
+ async bdeletes(force: boolean, keywords: string): Promise<any> {
+ let excludePinned = !force;
+ let tabs = await this.tabPresenter.getByKeyword(keywords, excludePinned);
+ let ids = tabs.map(tab => tab.id as number);
+ return this.tabPresenter.remove(ids);
+ }
+
+ async quit(): Promise<any> {
+ let tab = await this.tabPresenter.getCurrent();
+ return this.tabPresenter.remove([tab.id as number]);
+ }
+
+ async quitAll(): Promise<any> {
+ let tabs = await this.tabPresenter.getAll();
+ let ids = tabs.map(tab => tab.id as number);
+ this.tabPresenter.remove(ids);
+ }
+
+ async addbookmark(title: string): Promise<any> {
+ let tab = await this.tabPresenter.getCurrent();
+ let item = await this.bookmarkRepository.create(title, tab.url as string);
+ let message = 'Saved current page: ' + item.url;
+ return this.consoleClient.showInfo(tab.id as number, message);
+ }
+
+ async set(keywords: string): Promise<any> {
+ if (keywords.length === 0) {
+ return;
+ }
+ let [name, value] = parsers.parseSetOption(keywords);
+ await this.settingRepository.setProperty(name, value);
+
+ return this.contentMessageClient.broadcastSettingsChanged();
+ }
+
+ async urlOrSearch(keywords: string): Promise<any> {
+ let settings = await this.settingRepository.get();
+ return urls.searchUrl(keywords, settings.search);
+ }
+}