diff --git a/frontend/src/App.vue b/frontend/src/App.vue index fb24a2e..f82ba7c 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -11,6 +11,7 @@ import { import { useRoute, useRouter } from 'vue-router' import { SkyProvider } from '@/ui' +import AdminPanel from '@/components/AdminPanel.vue' import PhoneHomeIndicator from '@/components/PhoneHomeIndicator.vue' import PhoneControlCenter from '@/components/PhoneControlCenter.vue' import PhoneDynamicIsland from '@/components/PhoneDynamicIsland.vue' @@ -114,8 +115,13 @@ type AppMessage = { | CustomAppCatalogEventData | CustomAppEventData | NavigationEventData + | AdminPanelOpenPayload } +type AdminPanelOpenPayload = Required< + Pick +> + type CustomAppCatalogEventData = { apps?: unknown } @@ -355,6 +361,9 @@ const appTransitionName = computed(() => route.query.transition === 'app-switch' ? 'app-switch' : 'app-window', ) const isLocked = ref(false) +const adminPanelOpen = ref( + isDevelopment && developmentParameters.has('adminPanel'), +) const springboardEditing = ref(false) const isUnlocking = ref(false) const passcodeBusy = ref(false) @@ -518,10 +527,7 @@ function hydratePhone(payload: PhoneOpenPayload): void { clock.hydrate(payload.device?.data.alarms?.payload) games.hydrate(payload.device?.data.games?.payload) media.hydrate(payload.device?.data.media?.payload) - appStore.hydrate( - payload.device?.data.apps?.payload, - phone.permissions.adminPanel, - ) + appStore.hydrate(payload.device?.data.apps?.payload) widgets.hydrate(payload.device?.data.widgets?.payload) } @@ -723,7 +729,15 @@ function openDevelopmentPayphonePreview(): void { function onMessage(event: MessageEvent): void { if (!isTrustedRootMessageSource(event.source, window)) return - if (event.data?.type === 'custom-apps:catalog') { + if (event.data?.type === 'admin:open') { + const data = event.data.data as AdminPanelOpenPayload | undefined + if (data?.lang && data.locales && data.fallbackLocales) { + phone.setLocale(data.lang, data.locales, data.fallbackLocales) + } + adminPanelOpen.value = true + } else if (event.data?.type === 'admin:close') { + adminPanelOpen.value = false + } else if (event.data?.type === 'custom-apps:catalog') { appCatalog.replaceCatalog(event.data.data) const catalogPayload = event.data.data as | { apps?: unknown; debug?: unknown } @@ -1736,6 +1750,15 @@ onBeforeUnmount(() => {