mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-08-22 00:42:47 +08:00
✨ feat(native-window): 完善原生独立窗口与跨屏拖拽
- 支持全部工作台标签与 AI 对话在多显示器中原生独立展示 - 修复拖拽指针捕获,恢复关闭、右键菜单和跨窗口释放识别 - 拆分子窗启动入口并按需加载语言与工作台内容 - 内容与 Monaco 完成可见绘制后再提交迁移,消除白屏和加载闪烁 - 加固结果编辑、宿主同步及关闭、超时和焦点竞态
This commit is contained in:
47
frontend/src/bootstrap.ts
Normal file
47
frontend/src/bootstrap.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
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);
|
||||
});
|
||||
Reference in New Issue
Block a user