Files
fanqie-assistant/src/settingsPanel.ts
T

50 lines
1.3 KiB
TypeScript

// 设置面板的挂载/卸载。
// 面板是全局单例,从用户菜单里唤起。
import { createApp, h, type App } from 'vue'
import SettingsView from './views/SettingsView.vue'
import settingscss from './assets/settings.css?raw'
const CONTAINER_ID = 'fqa-settings-root'
const STYLE_ID = 'fqa-settings-style'
let app: App | null = null
let container: HTMLElement | null = null
function injectStyle() {
if (document.getElementById(STYLE_ID)) return
const style = document.createElement('style')
style.id = STYLE_ID
style.textContent = settingscss
document.head.appendChild(style)
}
export function closeSettings(): void {
app?.unmount()
app = null
container?.remove()
container = null
}
export function openSettings(): void {
if (app) return
injectStyle()
container = document.createElement('div')
container.id = CONTAINER_ID
document.body.appendChild(container)
app = createApp({
render: () => h(SettingsView, { onClose: closeSettings }),
})
app.config.errorHandler = (err, _instance, info) => {
console.error(`[fqa:settings] Vue error (${info}):`, err)
}
app.mount(container)
}
export function toggleSettings(): void {
if (app) closeSettings()
else openSettings()
}