what the mobile app needs is now buildable against something real: GET /apps, GET /key, GET /install/:app/:platform/:version, POST /installs, plus device and build verbs. all under /api/kiosk, all behind a platform session. the install URL is built per request and never stored, because it carries the CALLING user's key - two people asking for the same build get different links, which is the point: the artefact route is public and the key is what authorises it. deliberately NOT here: the four requests that arrive with no session. installd fetching the manifest and the ipa, the device posting its udid, safari downloading a mobileconfig. a plugin cannot serve an unauthenticated route today, so those wait for the platform primitive and will land in api/public.ts - a separate file so the two surfaces cannot be confused by whoever reads either one. so /install returns a correct URL pointing at a route that does not exist yet. that is the shape the app should build against. layout is a horizontal root with the app list first, and that is load-bearing: on a phone WorkspaceRenderer collapses horizontal groups to children[0] and PluginScreen passes no mobilePanelId, so first is the only panel a phone shows. the install page is the one page that must work in mobile safari. PUBLIC_URL is read from the environment rather than officer-url.mjs, which exports only loopback URLs - ios is not on loopback, and it needs https with a cert it already trusts or it declines silently.
15 lines
817 B
TypeScript
15 lines
817 B
TypeScript
import type { AppRegistryMeta } from 'officerdev';
|
|
import { Smartphone, Tablet } from 'lucide-react';
|
|
import { AppsPanel } from './AppsPanel';
|
|
import { DevicesPanel } from './DevicesPanel';
|
|
|
|
// `panels.ts`, not `.tsx` — discovery checks for that exact filename and refuses the plugin by name if it
|
|
// is missing, so components live in their own files and this stays a declaration.
|
|
//
|
|
// `availableOnPanel: false` throughout: PluginScreen renders the workspace `locked`, so these are not
|
|
// swappable and offering them in a picker would be a lie.
|
|
export const appRegistryMetas: AppRegistryMeta[] = [
|
|
{ key: 'kiosk-apps', name: 'Apps', icon: Smartphone, component: AppsPanel, availableOnPanel: false },
|
|
{ key: 'kiosk-devices', name: 'Devices', icon: Tablet, component: DevicesPanel, availableOnPanel: false },
|
|
];
|