feat(native): a capability handshake between the app binary and the server's UI

The UI ships with the server and the binary through the stores, so the two
drift. TrekShell.getCapabilities now reports the binary's shell API, version
and native features by name (iOS and Android), and the UI turns each native
feature on only where the binary has it; a binary from before the handshake
counts as shell API 1 with none. The other way round, the server names the
oldest binary its UI works with (minNativeShellApi), and an app below it is
asked to update with a link to its store.
This commit is contained in:
Maurice
2026-11-06 13:08:39 +01:00
parent 7b29a5d34e
commit f92aea80a7
40 changed files with 446 additions and 0 deletions
+3
View File
@@ -1,4 +1,5 @@
import { registerPlugin } from '@capacitor/core';
import type { NativeCapabilities } from './capabilities';
/**
* The app's own native plugin, implemented in
@@ -29,6 +30,8 @@ export interface TrekShellPlugin {
refreshOfflineCopy(): Promise<{ saved: boolean }>;
/** iOS: loads that copy under the server's origin. False when there is none. */
openOfflineCopy(): Promise<{ opened: boolean }>;
/** What this binary offers the UI (native/capabilities.ts). Missing before shell API 2. */
getCapabilities(): Promise<NativeCapabilities>;
}
export const TrekShell = registerPlugin<TrekShellPlugin>('TrekShell');