🔍 Add web worker for search operations to improve performance and handle search progress and results
This commit is contained in:
@@ -396,7 +396,43 @@ const preferences = useLocalStorage('gamemaster-explorer-prefs', {
|
|||||||
const clipboard = useClipboard();
|
const clipboard = useClipboard();
|
||||||
const client = new GamemasterClient();
|
const client = new GamemasterClient();
|
||||||
|
|
||||||
// Computed
|
// Web Worker for search operations
|
||||||
|
let searchWorker = null;
|
||||||
|
let searchWorkerRequestId = 0;
|
||||||
|
const initSearchWorker = () => {
|
||||||
|
if (!searchWorker) {
|
||||||
|
searchWorker = new Worker(
|
||||||
|
new URL('../workers/search.worker.js', import.meta.url),
|
||||||
|
{ type: 'module' }
|
||||||
|
);
|
||||||
|
searchWorker.onmessage = handleSearchWorkerMessage;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSearchWorkerMessage = (event) => {
|
||||||
|
const { type, id, results, percent, error: workerError } = event.data;
|
||||||
|
|
||||||
|
if (type === 'progress') {
|
||||||
|
operationProgress.value.percent = percent;
|
||||||
|
operationProgress.value.message = `Searching... ${Math.round(percent)}%`;
|
||||||
|
} else if (type === 'complete') {
|
||||||
|
searchResults.value = results;
|
||||||
|
currentResultIndex.value = 0;
|
||||||
|
operationProgress.value.complete = true;
|
||||||
|
setTimeout(() => {
|
||||||
|
operationProgress.value.active = false;
|
||||||
|
}, 500);
|
||||||
|
// Scroll to first result if found
|
||||||
|
if (results.length > 0) {
|
||||||
|
nextTick(() => scrollToResult());
|
||||||
|
}
|
||||||
|
} else if (type === 'error') {
|
||||||
|
console.error('Search worker error:', workerError);
|
||||||
|
operationProgress.value.active = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Composables
|
||||||
const hasFiles = computed(() => status.value.totalFiles > 0);
|
const hasFiles = computed(() => status.value.totalFiles > 0);
|
||||||
const fileTooLarge = computed(() => fileLines.value.length > 10000);
|
const fileTooLarge = computed(() => fileLines.value.length > 10000);
|
||||||
const lineHeight = computed(() => {
|
const lineHeight = computed(() => {
|
||||||
|
|||||||
Reference in New Issue
Block a user