aboutsummaryrefslogtreecommitdiff
path: root/src/background/completion/TabCompletionUseCase.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/background/completion/TabCompletionUseCase.ts')
-rw-r--r--src/background/completion/TabCompletionUseCase.ts55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/background/completion/TabCompletionUseCase.ts b/src/background/completion/TabCompletionUseCase.ts
new file mode 100644
index 0000000..dec86e9
--- /dev/null
+++ b/src/background/completion/TabCompletionUseCase.ts
@@ -0,0 +1,55 @@
+import { inject, injectable } from "tsyringe";
+import TabItem from "./TabItem";
+import TabRepository, { Tab } from "./TabRepository";
+import TabPresenter from "../presenters/TabPresenter";
+import TabFlag from "../../shared/TabFlag";
+
+@injectable()
+export default class TabCompletionUseCase {
+ constructor(
+ @inject('TabRepository') private tabRepository: TabRepository,
+ @inject('TabPresenter') private tabPresenter: TabPresenter,
+ ) {
+ }
+
+ async queryTabs(query: string, excludePinned: boolean): Promise<TabItem[]> {
+ const lastTabId = await this.tabPresenter.getLastSelectedId();
+ const allTabs = await this.tabRepository.getAllTabs(excludePinned);
+ const num = parseInt(query, 10);
+ let tabs: Tab[] = [];
+ if (!isNaN(num)) {
+ const tab = allTabs.find(t => t.index === num - 1);
+ if (tab) {
+ tabs = [tab];
+ }
+ } else if (query == '%') {
+ const tab = allTabs.find(t => t.active);
+ if (tab) {
+ tabs = [tab];
+ }
+ } else if (query == '#') {
+ const tab = allTabs.find(t => t.id === lastTabId);
+ if (tab) {
+ tabs = [tab];
+ }
+ } else {
+ tabs = await this.tabRepository.queryTabs(query, excludePinned);
+ }
+
+ return tabs.map(tab => {
+ let flag = TabFlag.None;
+ if (tab.active) {
+ flag = TabFlag.CurrentTab
+ } else if (tab.id == lastTabId) {
+ flag = TabFlag.LastTab
+ }
+ return {
+ index: tab.index + 1,
+ flag: flag,
+ title: tab.title,
+ url: tab.url,
+ faviconUrl : tab.faviconUrl
+ }
+ });
+ }
+}