This repository has been archived on 2020-04-04. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
Vim-Vixen/src/background/usecases/TabUseCase.ts
chocolateboy 6605d3ea99 Add an option to close the current tab and select the tab to the left
Add an option to tabs.close to close the current tab
and select the tab to the left.

Bound to `D` by default, which replaces the tabs.close.right
command, which is rarely-used. [1]

The old `D` behavior has been moved to `gd`.

+ update the README and fix some lint errors

[1] https://tinyurl.com/y4mj7hjy
2019-07-28 20:34:53 +01:00

99 lines
3 KiB
TypeScript

import { injectable } from 'tsyringe';
import TabPresenter from '../presenters/TabPresenter';
import WindowPresenter from '../presenters/WindowPresenter';
import BrowserSettingRepository from '../repositories/BrowserSettingRepository';
@injectable()
export default class TabUseCase {
constructor(
private tabPresenter: TabPresenter,
private windowPresenter: WindowPresenter,
private browserSettingRepository: BrowserSettingRepository,
) {
}
async close(force: boolean, selectLeft = false): Promise<any> {
let tab = await this.tabPresenter.getCurrent();
if (!force && tab.pinned) {
return Promise.resolve();
}
if (selectLeft && tab.index > 0) {
let tabs = await this.tabPresenter.getAll();
await this.tabPresenter.select(tabs[tab.index - 1].id as number);
}
return this.tabPresenter.remove([tab.id as number]);
}
async closeRight(): Promise<any> {
let tabs = await this.tabPresenter.getAll();
tabs.sort((t1, t2) => t1.index - t2.index);
let index = tabs.findIndex(t => t.active);
if (index < 0) {
return;
}
for (let i = index + 1; i < tabs.length; ++i) {
let tab = tabs[i];
if (!tab.pinned) {
this.tabPresenter.remove([tab.id as number]);
}
}
}
reopen(): Promise<any> {
return this.tabPresenter.reopen();
}
async reload(cache: boolean): Promise<any> {
let tab = await this.tabPresenter.getCurrent();
return this.tabPresenter.reload(tab.id as number, cache);
}
async setPinned(pinned: boolean): Promise<any> {
let tab = await this.tabPresenter.getCurrent();
return this.tabPresenter.setPinned(tab.id as number, pinned);
}
async togglePinned(): Promise<any> {
let tab = await this.tabPresenter.getCurrent();
return this.tabPresenter.setPinned(tab.id as number, !tab.pinned);
}
async duplicate(): Promise<any> {
let tab = await this.tabPresenter.getCurrent();
return this.tabPresenter.duplicate(tab.id as number);
}
async openPageSource(): Promise<any> {
let tab = await this.tabPresenter.getCurrent();
let url = 'view-source:' + tab.url;
return this.tabPresenter.create(url);
}
async openHome(newTab: boolean): Promise<any> {
let tab = await this.tabPresenter.getCurrent();
let urls = await this.browserSettingRepository.getHomepageUrls();
if (urls.length === 1 && urls[0] === 'about:home') {
// eslint-disable-next-line max-len
throw new Error('Cannot open Firefox Home (about:home) by WebExtensions, set your custom URLs');
}
if (urls.length === 1 && !newTab) {
return this.tabPresenter.open(urls[0], tab.id);
}
for (let url of urls) {
this.tabPresenter.create(url);
}
}
async openURL(
url: string, newTab?: boolean, newWindow?: boolean,
): Promise<void> {
if (newWindow) {
await this.windowPresenter.create(url);
} else if (newTab) {
await this.tabPresenter.create(url);
} else {
let tab = await this.tabPresenter.getCurrent();
await this.tabPresenter.open(url, tab.id);
}
}
}