import { defineStore } from 'pinia' import { ref } from 'vue' /** BTCPay and Home Assistant set X-Frame-Options and don't support subpath proxy - open in new tab */ function mustOpenInNewTab(url: string): boolean { try { const u = new URL(url) return u.port === '23000' || u.port === '8123' } catch { return false } } export const useAppLauncherStore = defineStore('appLauncher', () => { const isOpen = ref(false) const url = ref('') const title = ref('') let previousActiveElement: HTMLElement | null = null function open(payload: { url: string; title: string; openInNewTab?: boolean }) { if (payload.openInNewTab || mustOpenInNewTab(payload.url)) { window.open(payload.url, '_blank', 'noopener,noreferrer') return } previousActiveElement = (document.activeElement as HTMLElement) || null url.value = payload.url title.value = payload.title isOpen.value = true } function close() { const toRestore = previousActiveElement previousActiveElement = null isOpen.value = false url.value = '' title.value = '' if (toRestore && typeof toRestore.focus === 'function') { requestAnimationFrame(() => { toRestore.focus() }) } } return { isOpen, url, title, open, close, } })