mirror of
https://github.com/Wanxp/obsidian-douban.git
synced 2026-04-06 01:58:48 +08:00
154 lines
4.5 KiB
TypeScript
154 lines
4.5 KiB
TypeScript
import {
|
|
DoubanSearchGroupPublishResultSubjectNextPage,
|
|
DoubanSearchGroupPublishResultSubjectPreviousPage,
|
|
DoubanSearchResultSubject_EMPTY, DoubanSearchResultSubject_TIP_EMPTY,
|
|
DoubanSearchResultSubjectNextPage,
|
|
DoubanSearchResultSubjectNextPageNeedLogin,
|
|
DoubanSearchResultSubjectPreviousPage,
|
|
NavigateType,
|
|
SEARCH_ITEM_PAGE_SIZE,
|
|
SupportType
|
|
} from "../../../constant/Constsant";
|
|
import {FuzzySuggestModal, RequestUrlParam, request} from "obsidian";
|
|
|
|
import DoubanPlugin from "../../../main";
|
|
import DoubanSearchResultSubject from "../model/DoubanSearchResultSubject";
|
|
import HandleContext from "../model/HandleContext";
|
|
import {SearchPage} from "../model/SearchPage";
|
|
import {SearchPageInfo} from "../model/SearchPageInfo";
|
|
import {i18nHelper} from "../../../lang/helper";
|
|
import {log} from "src/org/wanxp/utils/Logutil";
|
|
import SearcherV2 from "./SearchV2";
|
|
|
|
export {DoubanFuzzySuggester}
|
|
|
|
|
|
class DoubanFuzzySuggester extends FuzzySuggestModal<DoubanSearchResultSubject> {
|
|
|
|
private plugin: DoubanPlugin;
|
|
private doubanSearchResultExtract: DoubanSearchResultSubject[];
|
|
private context: HandleContext;
|
|
private searchItem:string;
|
|
|
|
constructor(plugin: DoubanPlugin, context: HandleContext, searchItem:string) {
|
|
super(app);
|
|
this.plugin = plugin;
|
|
this.context = context;
|
|
this.searchItem = searchItem;
|
|
this.setPlaceholder(i18nHelper.getMessage('150101'));
|
|
}
|
|
|
|
|
|
getItems(): DoubanSearchResultSubject[] {
|
|
return this.doubanSearchResultExtract;
|
|
}
|
|
|
|
getItemText(item: DoubanSearchResultSubject): string {
|
|
if (this.isNavigate(item)) {
|
|
return item.title;
|
|
}
|
|
let text: string = item.type + "/" + (item.score ? item.score : '-') + "/" + item.title + "/" + item.cast;
|
|
return text;
|
|
}
|
|
|
|
private isNavigate(item: DoubanSearchResultSubject) {
|
|
return item.type == "navigate";
|
|
}
|
|
|
|
async onChooseItem(item: DoubanSearchResultSubject, evt: MouseEvent | KeyboardEvent):Promise<void> {
|
|
if(this.isNavigate(item)) {
|
|
if (await this.handleNavigate(item)) {
|
|
this.start();
|
|
}
|
|
return;
|
|
}
|
|
this.plugin.showStatus(i18nHelper.getMessage('140204', item.title));
|
|
this.context.listItem = item;
|
|
if (item) {
|
|
this.plugin.settingsManager.debug(`选择了:${item.type}:${item.id}:${item.title}`)
|
|
}
|
|
this.plugin.doubanExtractHandler.handle(item, this.context);
|
|
}
|
|
|
|
async handleNavigate(item: DoubanSearchResultSubject):Promise<boolean> {
|
|
const {searchPage} = this.context;
|
|
let currentPage:SearchPageInfo = searchPage;
|
|
let result:boolean = false;
|
|
switch (item.url) {
|
|
case NavigateType.previous:
|
|
currentPage = searchPage.previousPage();
|
|
result = true;
|
|
break;
|
|
case NavigateType.next:
|
|
currentPage = searchPage.nextPage();
|
|
result = true;
|
|
break;
|
|
case NavigateType.nextNeedLogin:
|
|
log.warn(i18nHelper.getMessage("140304"));
|
|
break;
|
|
}
|
|
if (result) {
|
|
const searchPageResult: SearchPage =
|
|
await SearcherV2.search(this.searchItem, currentPage.type, currentPage.pageNum, SEARCH_ITEM_PAGE_SIZE, this.plugin.settings, this.plugin.settingsManager);
|
|
this.context.searchPage = searchPageResult;
|
|
this.updatePageResult(searchPageResult);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private updatePageResult(searchPageResult: SearchPage) {
|
|
this.initItems(searchPageResult);
|
|
|
|
}
|
|
|
|
|
|
|
|
public showSearchPage(searchPage: SearchPage) {
|
|
this.initItems(searchPage);
|
|
this.start();
|
|
}
|
|
|
|
private initItems(searchPage: SearchPage) {
|
|
const doubanList: DoubanSearchResultSubject[] = searchPage.list;
|
|
|
|
if (searchPage.type == SupportType.all && searchPage.pageNum == 1) {
|
|
if (doubanList.length == 0) {
|
|
// if (searchPage.list.length > 0) {
|
|
doubanList.push(DoubanSearchResultSubject_EMPTY);
|
|
}else if (searchPage.list.length < SEARCH_ITEM_PAGE_SIZE) {
|
|
doubanList.push(DoubanSearchResultSubject_TIP_EMPTY);
|
|
}
|
|
}
|
|
if (searchPage.hasNext) {
|
|
if (this.plugin.userComponent.isLogin()) {
|
|
if (searchPage.type == SupportType.all && searchPage.pageNum == 1) {
|
|
doubanList.push(DoubanSearchGroupPublishResultSubjectNextPage)
|
|
}else {
|
|
doubanList.push(DoubanSearchResultSubjectNextPage)
|
|
}
|
|
}else {
|
|
doubanList.push(DoubanSearchResultSubjectNextPageNeedLogin)
|
|
}
|
|
}
|
|
if (searchPage.hasPrevious) {
|
|
if (searchPage.type == SupportType.all && searchPage.pageNum == 2) {
|
|
doubanList.unshift(DoubanSearchGroupPublishResultSubjectPreviousPage)
|
|
}else {
|
|
doubanList.unshift(DoubanSearchResultSubjectPreviousPage);
|
|
}
|
|
}
|
|
this.doubanSearchResultExtract = doubanList;
|
|
|
|
}
|
|
|
|
|
|
public start(): void {
|
|
try {
|
|
this.open();
|
|
} catch (e) {
|
|
log.error(e.toString(), e);
|
|
}
|
|
}
|
|
|
|
}
|