Files
MyGoNavi/frontend/src/bootstrap.ts
Syngnat 3f4b247faa feat(native-window): 完善原生独立窗口与跨屏拖拽
- 支持全部工作台标签与 AI 对话在多显示器中原生独立展示
- 修复拖拽指针捕获,恢复关闭、右键菜单和跨窗口释放识别
- 拆分子窗启动入口并按需加载语言与工作台内容
- 内容与 Monaco 完成可见绘制后再提交迁移,消除白屏和加载闪烁
- 加固结果编辑、宿主同步及关闭、超时和焦点竞态
2026-07-17 16:06:24 +08:00

48 lines
1.6 KiB
TypeScript

import { loadCatalog } from './i18n/catalog';
import { resolveLanguage } from './i18n/resolveLanguage';
import { isNativeDetachedWindowRoute } from './utils/nativeDetachedWindowRoute';
type DetachedBootstrapRuntime = {
loadBootstrap?: () => Promise<{
payload?: { storeState?: { languagePreference?: string } };
}>;
};
const readBrowserLanguages = (): string[] => {
if (typeof navigator === 'undefined') return [];
if (Array.isArray(navigator.languages) && navigator.languages.length > 0) {
return [...navigator.languages];
}
return navigator.language ? [navigator.language] : [];
};
const readDetachedLanguagePreference = async (): Promise<string | undefined> => {
if (typeof window === 'undefined') return undefined;
const runtime = (window as typeof window & {
__GONAVI_DETACHED__?: DetachedBootstrapRuntime;
}).__GONAVI_DETACHED__;
if (typeof runtime?.loadBootstrap !== 'function') return undefined;
try {
const bootstrap = await runtime.loadBootstrap();
return bootstrap.payload?.storeState?.languagePreference;
} catch {
return undefined;
}
};
const loadEntry = async (): Promise<void> => {
const detached = isNativeDetachedWindowRoute();
const preference = detached ? await readDetachedLanguagePreference() : undefined;
const language = resolveLanguage(preference, readBrowserLanguages());
await loadCatalog(language);
if (detached) {
await import('./nativeDetachedMain');
} else {
await import('./main');
}
};
void loadEntry().catch((error) => {
console.error('[GoNavi] Failed to load frontend entry', error);
});