mirror of
https://github.com/handsomezhuzhu/AeroStart.git
synced 2026-02-20 20:10:15 +00:00
♻️ refactor: reorganize project structure and centralize search engine config
- Move all source files from root to src/ directory for better organization - Create src/config/searchEngines.ts to centralize search engine configurations - Define unified SearchEngineConfig interface - Support both JSONP and Fetch request methods - Implement response parsers for Google, Baidu, Bing, DuckDuckGo, and Bilibili - Refactor src/utils/suggestions.ts to use centralized config - Simplify code from 126 lines to 81 lines - Support hybrid JSONP/Fetch mode (Bilibili uses Fetch via Vite proxy) - Remove duplicate URL construction and parsing logic - Update path alias configuration - Change @/* from ./* to ./src/* in tsconfig.json - Update vite.config.ts alias to point to ./src - Add Bilibili proxy configuration in vite.config.ts for development - Remove Bilibili rewrites from vercel.json (use Vite proxy instead) - Add @vercel/node to devDependencies - Remove unused files: README.md, i18n/README.md, metadata.json, vite-env.d.ts 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
81
src/utils/suggestions.ts
Normal file
81
src/utils/suggestions.ts
Normal file
@@ -0,0 +1,81 @@
|
||||
import {
|
||||
getSearchEngineConfig,
|
||||
buildJsonpUrl,
|
||||
type SearchEngineType
|
||||
} from '@/config/searchEngines';
|
||||
|
||||
let callbackCount = 0;
|
||||
|
||||
/**
|
||||
* Fetch search suggestions (supports hybrid JSONP and Fetch mode)
|
||||
*/
|
||||
export const fetchSuggestions = (engine: string, query: string): Promise<string[]> => {
|
||||
return new Promise((resolve) => {
|
||||
if (!query || !query.trim()) {
|
||||
resolve([]);
|
||||
return;
|
||||
}
|
||||
|
||||
const config = getSearchEngineConfig(engine as SearchEngineType);
|
||||
if (!config) {
|
||||
resolve([]);
|
||||
return;
|
||||
}
|
||||
|
||||
// Bilibili uses fetch (via Vite proxy)
|
||||
if (engine === 'Bilibili') {
|
||||
const url = `/bilibili?term=${encodeURIComponent(query)}`;
|
||||
|
||||
fetch(url)
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
try {
|
||||
const suggestions = config.parseResponse(data);
|
||||
resolve(suggestions);
|
||||
} catch (e) {
|
||||
resolve([]);
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
resolve([]);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// Other engines use JSONP
|
||||
const callbackName = `jsonp_cb_${Date.now()}_${callbackCount++}`;
|
||||
const script = document.createElement('script');
|
||||
let timeoutId: any;
|
||||
|
||||
const cleanup = () => {
|
||||
if ((window as any)[callbackName]) delete (window as any)[callbackName];
|
||||
if (document.body.contains(script)) document.body.removeChild(script);
|
||||
if (timeoutId) clearTimeout(timeoutId);
|
||||
};
|
||||
|
||||
// 3 seconds timeout
|
||||
timeoutId = setTimeout(() => {
|
||||
cleanup();
|
||||
resolve([]);
|
||||
}, 3000);
|
||||
|
||||
// Set global callback function
|
||||
(window as any)[callbackName] = (data: any) => {
|
||||
cleanup();
|
||||
try {
|
||||
const suggestions = config.parseResponse(data);
|
||||
resolve(suggestions);
|
||||
} catch (e) {
|
||||
resolve([]);
|
||||
}
|
||||
};
|
||||
|
||||
// Build URL and make request
|
||||
script.src = buildJsonpUrl(config, query, callbackName);
|
||||
script.onerror = () => {
|
||||
cleanup();
|
||||
resolve([]);
|
||||
};
|
||||
document.body.appendChild(script);
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user