@owdproject/core
Version:
Nuxt Desktop module for browser desktop experiences (windows, shell, apps)
57 lines (42 loc) • 1.57 kB
text/typescript
import { getActivePinia, setActivePinia } from 'pinia'
import type { Pinia } from 'pinia'
import { useApplicationManager } from '../runtime/composables/useApplicationManager'
const pendingDesktopApps: ApplicationConfig[] = []
let pluginPiniaInstance: Pinia | undefined
/** Set by desktop-shell-init; avoids importing nuxt/app during jiti config load. */
export function registerDesktopPluginPinia(pinia: Pinia | undefined) {
pluginPiniaInstance = pinia
}
function resolveActivePinia() {
const active = getActivePinia()
if (active) return active
if (pluginPiniaInstance) {
setActivePinia(pluginPiniaInstance)
return pluginPiniaInstance
}
return undefined
}
let isBooted = false
/**
* Register a desktop app. Queues until Pinia is active when theme/app plugins
* run before shell-init (legacy published apps using synchronous setup).
*/
export async function defineDesktopApp(config: ApplicationConfig) {
if (import.meta.server) return undefined
if (isBooted && resolveActivePinia()) {
const applicationManager = useApplicationManager()
return applicationManager.defineApp(config.id, config)
}
pendingDesktopApps.push(config)
return undefined
}
export async function flushPendingDesktopApps() {
isBooted = true
if (pendingDesktopApps.length === 0) return
if (!resolveActivePinia()) return
const queue = pendingDesktopApps.splice(0, pendingDesktopApps.length)
const applicationManager = useApplicationManager()
for (const config of queue) {
await applicationManager.defineApp(config.id, config)
}
}