redoc/src/services/SearchStore.ts

66 lines
1.5 KiB
TypeScript
Raw Normal View History

import { IS_BROWSER } from '../utils/';
import type { IMenuItem } from './types';
import type { OperationModel } from './models';
2018-03-06 14:12:14 +03:00
import Worker from './SearchWorker.worker';
2018-05-16 12:44:36 +03:00
function getWorker() {
let worker: new () => Worker;
if (IS_BROWSER) {
try {
// tslint:disable-next-line
worker = require('workerize-loader?inline&fallback=false!./SearchWorker.worker');
} catch (e) {
worker = require('./SearchWorker.worker').default;
}
} else {
2018-03-06 14:12:14 +03:00
worker = require('./SearchWorker.worker').default;
}
return new worker();
2018-03-06 14:12:14 +03:00
}
2018-02-08 19:41:02 +03:00
2018-05-18 15:13:46 +03:00
export class SearchStore<T> {
searchWorker = getWorker();
2018-02-08 19:41:02 +03:00
2018-02-22 19:48:50 +03:00
indexItems(groups: Array<IMenuItem | OperationModel>) {
2018-03-06 14:12:49 +03:00
const recurse = items => {
items.forEach(group => {
2018-03-06 14:10:08 +03:00
if (group.type !== 'group') {
this.add(group.name, group.description || '', group.id);
}
recurse(group.items);
});
};
recurse(groups);
this.searchWorker.done();
2018-02-08 19:41:02 +03:00
}
2018-05-18 15:13:46 +03:00
add(title: string, body: string, meta?: T) {
this.searchWorker.add(title, body, meta);
2018-02-08 19:41:02 +03:00
}
2020-01-16 00:05:51 +03:00
dispose() {
(this.searchWorker as any).terminate();
2020-05-25 16:36:09 +03:00
(this.searchWorker as any).dispose();
2020-01-16 00:05:51 +03:00
}
2018-02-08 19:41:02 +03:00
search(q: string) {
2018-05-18 15:13:46 +03:00
return this.searchWorker.search<T>(q);
2018-02-08 19:41:02 +03:00
}
2018-03-06 14:10:08 +03:00
async toJS() {
return this.searchWorker.toJS();
}
load(state: any) {
this.searchWorker.load(state);
}
2020-09-24 14:03:16 +03:00
fromExternalJS(path?: string, exportName?: string) {
if (path && exportName) {
this.searchWorker.fromExternalJS(path, exportName);
2020-09-24 14:03:16 +03:00
}
}
2018-02-08 19:41:02 +03:00
}