@unisim/sdk 0.123.4 → 0.125.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -6
- package/android/build.gradle +59 -0
- package/android/src/main/AndroidManifest.xml +88 -0
- package/android/src/main/java/uk/co/unisim/sdk/SuiteAuthProvider.java +107 -0
- package/android/src/main/java/uk/co/unisim/sdk/SuiteAuthStore.java +179 -0
- package/android/src/main/java/uk/co/unisim/sdk/UnisimSuiteAuthPlugin.java +214 -0
- package/dist/ChangelogMenu.js +7 -0
- package/dist/ChangelogMenu.js.map +1 -1
- package/dist/CompanyMenu.d.ts.map +1 -1
- package/dist/CompanyMenu.js +74 -2
- package/dist/CompanyMenu.js.map +1 -1
- package/dist/SuiteSwitcher.d.ts.map +1 -1
- package/dist/SuiteSwitcher.js +70 -4
- package/dist/SuiteSwitcher.js.map +1 -1
- package/dist/UniversalAppsNavBar.d.ts.map +1 -1
- package/dist/UniversalAppsNavBar.js +92 -6
- package/dist/UniversalAppsNavBar.js.map +1 -1
- package/dist/UniversalNavBar.d.ts +25 -3
- package/dist/UniversalNavBar.d.ts.map +1 -1
- package/dist/UniversalNavBar.js +144 -61
- package/dist/UniversalNavBar.js.map +1 -1
- package/dist/UserProfile.d.ts +108 -1
- package/dist/UserProfile.d.ts.map +1 -1
- package/dist/UserProfile.js +147 -78
- package/dist/UserProfile.js.map +1 -1
- package/dist/companies.d.ts +43 -0
- package/dist/companies.d.ts.map +1 -0
- package/dist/companies.js +98 -0
- package/dist/companies.js.map +1 -0
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +14 -0
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/provider.d.ts +14 -0
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +181 -1
- package/dist/provider.js.map +1 -1
- package/dist/sessionStorage.d.ts +25 -7
- package/dist/sessionStorage.d.ts.map +1 -1
- package/dist/sessionStorage.js +49 -15
- package/dist/sessionStorage.js.map +1 -1
- package/dist/suiteApps.d.ts +66 -0
- package/dist/suiteApps.d.ts.map +1 -0
- package/dist/suiteApps.js +168 -0
- package/dist/suiteApps.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/unisimMark.d.ts +1 -1
- package/dist/unisimMark.d.ts.map +1 -1
- package/dist/unisimMark.js +8 -5
- package/dist/unisimMark.js.map +1 -1
- package/ios/Sources/UnisimSuiteAuthPlugin/UnisimSuiteAuthPlugin.swift +63 -1
- package/package.json +8 -2
package/dist/sessionStorage.d.ts
CHANGED
|
@@ -22,6 +22,15 @@ export interface SyncSessionStorageAdapter {
|
|
|
22
22
|
setItem(key: string, value: string): void;
|
|
23
23
|
removeItem(key: string): void;
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* One of the container's registered plugins, or null in a browser (and in a
|
|
27
|
+
* native build whose `capacitor.plugins.json` never listed it).
|
|
28
|
+
*
|
|
29
|
+
* Read off the `Capacitor` global rather than imported from `@capacitor/core`
|
|
30
|
+
* so the SDK stays installable in a plain React app — every consumer is a web
|
|
31
|
+
* build first and only some of them are also wrapped natively.
|
|
32
|
+
*/
|
|
33
|
+
export declare function capacitorPlugin<T>(name: string): T | null;
|
|
25
34
|
/**
|
|
26
35
|
* True inside a Capacitor container (iOS/Android), false in any browser.
|
|
27
36
|
*
|
|
@@ -45,15 +54,24 @@ interface SuiteAuthPlugin {
|
|
|
45
54
|
key: string;
|
|
46
55
|
}): Promise<void>;
|
|
47
56
|
}
|
|
48
|
-
/** True when this native build can reach the shared-Keychain plugin. */
|
|
49
|
-
export declare function hasSharedKeychain(): boolean;
|
|
50
57
|
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
58
|
+
* True when this native build can reach the shared-store plugin — an iOS
|
|
59
|
+
* Keychain group or an Android provider group, depending on the platform.
|
|
60
|
+
*/
|
|
61
|
+
export declare function hasSharedSuiteStore(): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* @deprecated Named when iOS was the only native platform. Use
|
|
64
|
+
* {@link hasSharedSuiteStore} — on Android the shared store is not a Keychain
|
|
65
|
+
* at all. Kept so an older consumer does not break on an SDK bump.
|
|
66
|
+
*/
|
|
67
|
+
export declare const hasSharedKeychain: typeof hasSharedSuiteStore;
|
|
68
|
+
/**
|
|
69
|
+
* Plugin-backed storage, shared across every suite app signed by the same key.
|
|
70
|
+
* Async, which supabase-js supports.
|
|
53
71
|
*
|
|
54
72
|
* ⚠️ On a plugin ERROR this falls back to localStorage for that call, so a
|
|
55
|
-
*
|
|
56
|
-
* user out. A plugin returning `null` is NOT an error — it means "no session
|
|
73
|
+
* hiccup in the shared store degrades to an app-local session rather than
|
|
74
|
+
* signing the user out. A plugin returning `null` is NOT an error — it means "no session
|
|
57
75
|
* in the shared store", and must be reported as such, or a sign-out in one app
|
|
58
76
|
* would never be seen by the others.
|
|
59
77
|
*/
|
|
@@ -72,7 +90,7 @@ export declare function createSharedKeychainStorage(plugin: SuiteAuthPlugin): Se
|
|
|
72
90
|
* happening; don't reach for this adapter directly.
|
|
73
91
|
*/
|
|
74
92
|
export declare function createCookieStorage(domain: string): SyncSessionStorageAdapter;
|
|
75
|
-
export type SessionStorageKind = 'shared-
|
|
93
|
+
export type SessionStorageKind = 'shared-native' | 'native-local' | 'shared-cookie' | 'local';
|
|
76
94
|
export interface ChosenSessionStorage {
|
|
77
95
|
kind: SessionStorageKind;
|
|
78
96
|
/** `undefined` means "let supabase-js use its own localStorage adapter". */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionStorage.d.ts","sourceRoot":"","sources":["../src/sessionStorage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sessionStorage.d.ts","sourceRoot":"","sources":["../src/sessionStorage.ts"],"names":[],"mappings":"AAkDA;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAC5D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9C;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACnC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B;AAgBD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAGzD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAcvC;AAID,UAAU,eAAe;IACvB,GAAG,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IAChE,GAAG,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,MAAM,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAChD;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,4BAAsB,CAAA;AAQpD;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,eAAe,GAAG,qBAAqB,CAmD1F;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,yBAAyB,CA0C7E;AAID,MAAM,MAAM,kBAAkB,GAI1B,eAAe,GACf,cAAc,GACd,eAAe,GACf,OAAO,CAAA;AAEX,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,kBAAkB,CAAA;IACxB,4EAA4E;IAC5E,OAAO,EAAE,qBAAqB,GAAG,SAAS,CAAA;IAC1C,yEAAyE;IACzE,aAAa,EAAE,OAAO,CAAA;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAsBhF"}
|
package/dist/sessionStorage.js
CHANGED
|
@@ -14,9 +14,15 @@
|
|
|
14
14
|
// • **Browser, local dev / Electron** — localStorage. There is no parent
|
|
15
15
|
// zone to scope a cookie to on localhost or file://.
|
|
16
16
|
//
|
|
17
|
-
// • **Native (Capacitor)** —
|
|
18
|
-
//
|
|
19
|
-
//
|
|
17
|
+
// • **Native (Capacitor)** — a store shared by every suite app, via the
|
|
18
|
+
// UnisimSuiteAuth plugin. Falls back to localStorage when the plugin is
|
|
19
|
+
// absent. The plugin presents ONE interface over two quite different
|
|
20
|
+
// mechanisms: on iOS a Keychain access group, which the OS shares between
|
|
21
|
+
// apps of the same team; on Android a signature-permissioned
|
|
22
|
+
// ContentProvider in each app that the others read and write, because
|
|
23
|
+
// Android has no shared box to put anything in (`sharedUserId` was
|
|
24
|
+
// deprecated in API 29). See the plugin sources under `ios/` and
|
|
25
|
+
// `android/` — the JS below is deliberately blind to which one answered.
|
|
20
26
|
//
|
|
21
27
|
// ⚠️ **The native case is why this module exists.** A Capacitor app runs at
|
|
22
28
|
// `capacitor://localhost`, and a cookie written from there with
|
|
@@ -30,8 +36,16 @@
|
|
|
30
36
|
//
|
|
31
37
|
// The shared Keychain then buys the thing that was actually asked for: sign in
|
|
32
38
|
// on Universal Images on the phone and Universal PDF is already signed in.
|
|
33
|
-
//
|
|
34
|
-
//
|
|
39
|
+
//
|
|
40
|
+
// ⚠️ **Sign-out is NOT symmetric with sign-in, and a shared store alone does
|
|
41
|
+
// not make it so.** This comment used to claim it was. What a shared store
|
|
42
|
+
// gives you is a shared *answer*; what it does not give you is anyone asking
|
|
43
|
+
// the question. supabase-js announces a session it FINDS on resume
|
|
44
|
+
// (SIGNED_IN), and announces nothing at all when it finds the store emptied —
|
|
45
|
+
// see the long note on the resume resync in `provider.tsx`, which is what
|
|
46
|
+
// closes the gap. Emptying this store is necessary for suite-wide sign-out and
|
|
47
|
+
// is not sufficient for it; an app already running keeps its in-memory session
|
|
48
|
+
// until something asks.
|
|
35
49
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
36
50
|
function capacitorGlobal() {
|
|
37
51
|
if (typeof window === 'undefined')
|
|
@@ -39,6 +53,18 @@ function capacitorGlobal() {
|
|
|
39
53
|
const c = window.Capacitor;
|
|
40
54
|
return c ?? null;
|
|
41
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* One of the container's registered plugins, or null in a browser (and in a
|
|
58
|
+
* native build whose `capacitor.plugins.json` never listed it).
|
|
59
|
+
*
|
|
60
|
+
* Read off the `Capacitor` global rather than imported from `@capacitor/core`
|
|
61
|
+
* so the SDK stays installable in a plain React app — every consumer is a web
|
|
62
|
+
* build first and only some of them are also wrapped natively.
|
|
63
|
+
*/
|
|
64
|
+
export function capacitorPlugin(name) {
|
|
65
|
+
const plugin = capacitorGlobal()?.Plugins?.[name];
|
|
66
|
+
return plugin ? plugin : null;
|
|
67
|
+
}
|
|
42
68
|
/**
|
|
43
69
|
* True inside a Capacitor container (iOS/Android), false in any browser.
|
|
44
70
|
*
|
|
@@ -65,25 +91,33 @@ export function isNativeShell() {
|
|
|
65
91
|
return protocol === 'capacitor:' || protocol === 'ionic:';
|
|
66
92
|
}
|
|
67
93
|
function suiteAuthPlugin() {
|
|
68
|
-
|
|
69
|
-
return plugin ? plugin : null;
|
|
94
|
+
return capacitorPlugin('UnisimSuiteAuth');
|
|
70
95
|
}
|
|
71
|
-
/**
|
|
72
|
-
|
|
96
|
+
/**
|
|
97
|
+
* True when this native build can reach the shared-store plugin — an iOS
|
|
98
|
+
* Keychain group or an Android provider group, depending on the platform.
|
|
99
|
+
*/
|
|
100
|
+
export function hasSharedSuiteStore() {
|
|
73
101
|
return suiteAuthPlugin() !== null;
|
|
74
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* @deprecated Named when iOS was the only native platform. Use
|
|
105
|
+
* {@link hasSharedSuiteStore} — on Android the shared store is not a Keychain
|
|
106
|
+
* at all. Kept so an older consumer does not break on an SDK bump.
|
|
107
|
+
*/
|
|
108
|
+
export const hasSharedKeychain = hasSharedSuiteStore;
|
|
75
109
|
function localStorageAdapter() {
|
|
76
110
|
// `undefined` lets supabase-js install its own localStorage adapter, which
|
|
77
111
|
// already handles the private-mode / storage-disabled throw.
|
|
78
112
|
return undefined;
|
|
79
113
|
}
|
|
80
114
|
/**
|
|
81
|
-
*
|
|
82
|
-
*
|
|
115
|
+
* Plugin-backed storage, shared across every suite app signed by the same key.
|
|
116
|
+
* Async, which supabase-js supports.
|
|
83
117
|
*
|
|
84
118
|
* ⚠️ On a plugin ERROR this falls back to localStorage for that call, so a
|
|
85
|
-
*
|
|
86
|
-
* user out. A plugin returning `null` is NOT an error — it means "no session
|
|
119
|
+
* hiccup in the shared store degrades to an app-local session rather than
|
|
120
|
+
* signing the user out. A plugin returning `null` is NOT an error — it means "no session
|
|
87
121
|
* in the shared store", and must be reported as such, or a sign-out in one app
|
|
88
122
|
* would never be seen by the others.
|
|
89
123
|
*/
|
|
@@ -93,7 +127,7 @@ export function createSharedKeychainStorage(plugin) {
|
|
|
93
127
|
if (warned)
|
|
94
128
|
return;
|
|
95
129
|
warned = true;
|
|
96
|
-
console.warn(`[unisim/sdk] shared
|
|
130
|
+
console.warn(`[unisim/sdk] shared suite store ${op} failed; falling back to app-local storage. ` +
|
|
97
131
|
'Sign-in will not carry across the suite apps on this device.', err);
|
|
98
132
|
};
|
|
99
133
|
const local = {
|
|
@@ -220,7 +254,7 @@ export function chooseSessionStorage(cookieDomain) {
|
|
|
220
254
|
const plugin = suiteAuthPlugin();
|
|
221
255
|
if (plugin) {
|
|
222
256
|
return {
|
|
223
|
-
kind: 'shared-
|
|
257
|
+
kind: 'shared-native',
|
|
224
258
|
storage: createSharedKeychainStorage(plugin),
|
|
225
259
|
cookiesUsable: false,
|
|
226
260
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionStorage.js","sourceRoot":"","sources":["../src/sessionStorage.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,kDAAkD;AAClD,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,4EAA4E;AAC5E,0BAA0B;AAC1B,EAAE;AACF,mEAAmE;AACnE,4EAA4E;AAC5E,6EAA6E;AAC7E,uCAAuC;AACvC,EAAE;AACF,2EAA2E;AAC3E,yDAAyD;AACzD,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"sessionStorage.js","sourceRoot":"","sources":["../src/sessionStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { SuiteProductId } from './SuiteSwitcher.js';
|
|
2
|
+
export interface SuiteNativeApp {
|
|
3
|
+
/** The switcher's product id — how a row finds its native twin. */
|
|
4
|
+
id: SuiteProductId;
|
|
5
|
+
/**
|
|
6
|
+
* The app's own custom URL scheme, without `://`. Derived from the id
|
|
7
|
+
* (`workplace_assess` → `unisim-workplace-assess`) because underscores are
|
|
8
|
+
* not legal in a URL scheme and hyphens are.
|
|
9
|
+
*/
|
|
10
|
+
scheme: string;
|
|
11
|
+
/** iOS bundle identifier — the app's `appId` in its capacitor.config. */
|
|
12
|
+
iosBundleId: string;
|
|
13
|
+
/** Android application id. Usually the same string; Universal AI's is not. */
|
|
14
|
+
androidPackage: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Every suite product that has a native build, and only those.
|
|
18
|
+
*
|
|
19
|
+
* ⚠️ **Being in the switcher is not enough to be in here.** Ergo Assess, Exports
|
|
20
|
+
* and the rest are web-only; listing them would put a scheme nobody answers
|
|
21
|
+
* into thirteen Info.plists and mark rows "Installed" that can never be. A
|
|
22
|
+
* product missing from this list simply keeps today's behaviour — the https
|
|
23
|
+
* link — which is the correct answer for a product with no app.
|
|
24
|
+
*
|
|
25
|
+
* Universal Family has a native build and is deliberately absent for the same
|
|
26
|
+
* reason: it has no row in the switcher to open.
|
|
27
|
+
*
|
|
28
|
+
* Universal AI is listed, and is the one entry where the two platform ids
|
|
29
|
+
* differ: its Capacitor `appId` `com.universal-ai.app` is legal on iOS and
|
|
30
|
+
* illegal on Android (a hyphen cannot appear in a Java package), so its Android
|
|
31
|
+
* project was generated under `uk.co.unisim.ai`. Note it is also `comingSoon`
|
|
32
|
+
* in the switcher, so its row does not navigate and will not launch — the entry
|
|
33
|
+
* is here so that stops being true the moment the badge comes off.
|
|
34
|
+
*/
|
|
35
|
+
export declare const SUITE_NATIVE_APPS: readonly SuiteNativeApp[];
|
|
36
|
+
export declare function suiteNativeApp(id: SuiteProductId): SuiteNativeApp | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Can this build ask the OS what is installed?
|
|
39
|
+
*
|
|
40
|
+
* False in every browser, and false in a native shell running against an older
|
|
41
|
+
* SDK whose plugin has no `installedApps` — so the switcher must treat it as
|
|
42
|
+
* "show exactly what the web shows", never as "nothing is installed". The
|
|
43
|
+
* difference matters: an empty answer draws no badges either, but it is a
|
|
44
|
+
* finding, and this is not.
|
|
45
|
+
*/
|
|
46
|
+
export declare function canProbeSuiteApps(): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* The subset of {@link SUITE_NATIVE_APPS} installed on this device, by product
|
|
49
|
+
* id. Empty in a browser.
|
|
50
|
+
*
|
|
51
|
+
* Cached, because the answer costs a bridge round trip and a package-manager
|
|
52
|
+
* scan and the menu opens often. Invalidated on resume rather than on a timer:
|
|
53
|
+
* the only way the answer changes is the user leaving to install or delete
|
|
54
|
+
* something, and they cannot do that without backgrounding this app first.
|
|
55
|
+
*/
|
|
56
|
+
export declare function installedSuiteApps(): Promise<ReadonlySet<string>>;
|
|
57
|
+
/** Drop the cached probe. Exported for tests. */
|
|
58
|
+
export declare function resetInstalledSuiteApps(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Bring the installed app for `id` to the front. Resolves false when there is
|
|
61
|
+
* nothing to open — no native build, not installed, no bridge, or the OS
|
|
62
|
+
* refused — and the caller is expected to fall back to the https link on false
|
|
63
|
+
* rather than leaving the tap dead.
|
|
64
|
+
*/
|
|
65
|
+
export declare function openSuiteApp(id: SuiteProductId): Promise<boolean>;
|
|
66
|
+
//# sourceMappingURL=suiteApps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suiteApps.d.ts","sourceRoot":"","sources":["../src/suiteApps.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,EAAE,EAAE,cAAc,CAAA;IAClB;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAA;IACd,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAA;IACnB,8EAA8E;IAC9E,cAAc,EAAE,MAAM,CAAA;CACvB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,cAAc,EActD,CAAA;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,cAAc,GAAG,SAAS,CAE7E;AA2BD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAOD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAkBjE;AAUD,iDAAiD;AACjD,wBAAgB,uBAAuB,SAEtC;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAWvE"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
2
|
+
// Which suite apps are installed on THIS device, and how to open one.
|
|
3
|
+
//
|
|
4
|
+
// The suite switcher lists every product as an https link, which is right on
|
|
5
|
+
// the web and wrong on a phone: a user who has Universal PDF installed taps
|
|
6
|
+
// "Universal PDF" in Universal Images and gets the website, inside the webview
|
|
7
|
+
// they were already in. This module is what lets the switcher hand off to the
|
|
8
|
+
// real app instead, and mark the rows it can hand off to.
|
|
9
|
+
//
|
|
10
|
+
// ⚠️ **An https URL cannot do this.** A Capacitor app runs its own webview, and
|
|
11
|
+
// a WKWebView does NOT honour universal links for navigation that happens
|
|
12
|
+
// inside it — the link resolves as a page load, not as a handoff, no matter how
|
|
13
|
+
// the associated domains are configured. Opening a sibling app needs the
|
|
14
|
+
// platform's own app-to-app channel: a custom URL scheme on iOS, a launch
|
|
15
|
+
// intent on Android. Hence the registry below.
|
|
16
|
+
//
|
|
17
|
+
// The two platforms need different things and fail differently:
|
|
18
|
+
//
|
|
19
|
+
// • **iOS** matches on SCHEME, and `canOpenURL` answers `false` — with only a
|
|
20
|
+
// console line to say why — for any scheme the CALLING app has not listed
|
|
21
|
+
// in its own `LSApplicationQueriesSchemes`. So every app needs every other
|
|
22
|
+
// app's scheme in its Info.plist. `scripts/sync-native-app-links.mjs`
|
|
23
|
+
// writes that from this file; nobody should be hand-editing the lists.
|
|
24
|
+
//
|
|
25
|
+
// • **Android** matches on PACKAGE, and needs no per-app change at all: the
|
|
26
|
+
// `<queries>` block in the SDK's own AndroidManifest.xml is merged into
|
|
27
|
+
// every consumer, so adding an app here plus one line there is the whole
|
|
28
|
+
// job. Same silent failure though — an undeclared package does not exist
|
|
29
|
+
// to `getLaunchIntentForPackage` on API 30+.
|
|
30
|
+
//
|
|
31
|
+
// Both lists are therefore copies of this one, in formats that cannot import
|
|
32
|
+
// it. That is the thing to distrust: see `tests/suite-apps.mjs`, which fails if
|
|
33
|
+
// they drift.
|
|
34
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
35
|
+
import { isNativeShell, capacitorPlugin } from './sessionStorage.js';
|
|
36
|
+
/**
|
|
37
|
+
* Every suite product that has a native build, and only those.
|
|
38
|
+
*
|
|
39
|
+
* ⚠️ **Being in the switcher is not enough to be in here.** Ergo Assess, Exports
|
|
40
|
+
* and the rest are web-only; listing them would put a scheme nobody answers
|
|
41
|
+
* into thirteen Info.plists and mark rows "Installed" that can never be. A
|
|
42
|
+
* product missing from this list simply keeps today's behaviour — the https
|
|
43
|
+
* link — which is the correct answer for a product with no app.
|
|
44
|
+
*
|
|
45
|
+
* Universal Family has a native build and is deliberately absent for the same
|
|
46
|
+
* reason: it has no row in the switcher to open.
|
|
47
|
+
*
|
|
48
|
+
* Universal AI is listed, and is the one entry where the two platform ids
|
|
49
|
+
* differ: its Capacitor `appId` `com.universal-ai.app` is legal on iOS and
|
|
50
|
+
* illegal on Android (a hyphen cannot appear in a Java package), so its Android
|
|
51
|
+
* project was generated under `uk.co.unisim.ai`. Note it is also `comingSoon`
|
|
52
|
+
* in the switcher, so its row does not navigate and will not launch — the entry
|
|
53
|
+
* is here so that stops being true the moment the badge comes off.
|
|
54
|
+
*/
|
|
55
|
+
export const SUITE_NATIVE_APPS = [
|
|
56
|
+
{ id: 'cyber_assess', scheme: 'unisim-cyber-assess', iosBundleId: 'uk.co.unisim.cyberassess', androidPackage: 'uk.co.unisim.cyberassess' },
|
|
57
|
+
{ id: 'workplace_assess', scheme: 'unisim-workplace-assess', iosBundleId: 'uk.co.unisim.wfhassess', androidPackage: 'uk.co.unisim.wfhassess' },
|
|
58
|
+
{ id: 'fire_assess', scheme: 'unisim-fire-assess', iosBundleId: 'uk.co.unisim.fireassess', androidPackage: 'uk.co.unisim.fireassess' },
|
|
59
|
+
{ id: 'coshh_assess', scheme: 'unisim-coshh-assess', iosBundleId: 'uk.co.unisim.coshhassess', androidPackage: 'uk.co.unisim.coshhassess' },
|
|
60
|
+
{ id: 'risk_assess', scheme: 'unisim-risk-assess', iosBundleId: 'uk.co.unisim.riskassess', androidPackage: 'uk.co.unisim.riskassess' },
|
|
61
|
+
{ id: 'pdf', scheme: 'unisim-pdf', iosBundleId: 'uk.co.unisim.pdf', androidPackage: 'uk.co.unisim.pdf' },
|
|
62
|
+
{ id: 'images', scheme: 'unisim-images', iosBundleId: 'uk.co.unisim.images', androidPackage: 'uk.co.unisim.images' },
|
|
63
|
+
{ id: 'qr', scheme: 'unisim-qr', iosBundleId: 'uk.co.unisim.qr', androidPackage: 'uk.co.unisim.qr' },
|
|
64
|
+
{ id: 'compress', scheme: 'unisim-compress', iosBundleId: 'uk.co.unisim.compress', androidPackage: 'uk.co.unisim.compress' },
|
|
65
|
+
{ id: 'converter', scheme: 'unisim-converter', iosBundleId: 'uk.co.unisim.converter', androidPackage: 'uk.co.unisim.converter' },
|
|
66
|
+
{ id: 'polling', scheme: 'unisim-polling', iosBundleId: 'uk.co.unisim.polling', androidPackage: 'uk.co.unisim.polling' },
|
|
67
|
+
{ id: 'blackbook', scheme: 'unisim-blackbook', iosBundleId: 'uk.co.unisim.blackbook', androidPackage: 'uk.co.unisim.blackbook' },
|
|
68
|
+
{ id: 'ai', scheme: 'unisim-ai', iosBundleId: 'com.universal-ai.app', androidPackage: 'uk.co.unisim.ai' },
|
|
69
|
+
];
|
|
70
|
+
export function suiteNativeApp(id) {
|
|
71
|
+
return SUITE_NATIVE_APPS.find((a) => a.id === id);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* ⚠️ These methods hang off `UnisimSuiteAuth` — the session-store plugin —
|
|
75
|
+
* rather than a launcher plugin of their own, and that is a deliberate trade of
|
|
76
|
+
* a tidy name for a failure mode we can see.
|
|
77
|
+
*
|
|
78
|
+
* Capacitor resolves Android plugins through `capacitor.plugins.json`, which is
|
|
79
|
+
* generated by `npx cap sync` and COMMITTED in each app. A new plugin class
|
|
80
|
+
* would be invisible in every app until each one re-synced, and invisible is
|
|
81
|
+
* exactly how it would present: no error, no launch, just the web link again in
|
|
82
|
+
* some apps and not others. Adding methods to a class that is already in all
|
|
83
|
+
* thirteen files cannot go wrong that way.
|
|
84
|
+
*/
|
|
85
|
+
function suiteAppsPlugin() {
|
|
86
|
+
const plugin = capacitorPlugin('UnisimSuiteAuth');
|
|
87
|
+
if (!plugin || typeof plugin.installedApps !== 'function')
|
|
88
|
+
return null;
|
|
89
|
+
return plugin;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Can this build ask the OS what is installed?
|
|
93
|
+
*
|
|
94
|
+
* False in every browser, and false in a native shell running against an older
|
|
95
|
+
* SDK whose plugin has no `installedApps` — so the switcher must treat it as
|
|
96
|
+
* "show exactly what the web shows", never as "nothing is installed". The
|
|
97
|
+
* difference matters: an empty answer draws no badges either, but it is a
|
|
98
|
+
* finding, and this is not.
|
|
99
|
+
*/
|
|
100
|
+
export function canProbeSuiteApps() {
|
|
101
|
+
return isNativeShell() && suiteAppsPlugin() !== null;
|
|
102
|
+
}
|
|
103
|
+
const NONE = new Set();
|
|
104
|
+
let probe = null;
|
|
105
|
+
let resumeHooked = false;
|
|
106
|
+
/**
|
|
107
|
+
* The subset of {@link SUITE_NATIVE_APPS} installed on this device, by product
|
|
108
|
+
* id. Empty in a browser.
|
|
109
|
+
*
|
|
110
|
+
* Cached, because the answer costs a bridge round trip and a package-manager
|
|
111
|
+
* scan and the menu opens often. Invalidated on resume rather than on a timer:
|
|
112
|
+
* the only way the answer changes is the user leaving to install or delete
|
|
113
|
+
* something, and they cannot do that without backgrounding this app first.
|
|
114
|
+
*/
|
|
115
|
+
export function installedSuiteApps() {
|
|
116
|
+
if (probe)
|
|
117
|
+
return probe;
|
|
118
|
+
const plugin = suiteAppsPlugin();
|
|
119
|
+
if (!plugin || !isNativeShell())
|
|
120
|
+
return Promise.resolve(NONE);
|
|
121
|
+
hookResume();
|
|
122
|
+
probe = plugin
|
|
123
|
+
.installedApps({ apps: [...SUITE_NATIVE_APPS] })
|
|
124
|
+
.then((r) => new Set(r?.installed ?? []))
|
|
125
|
+
.catch((err) => {
|
|
126
|
+
// Degrade to the web behaviour rather than to an empty menu. Nothing the
|
|
127
|
+
// user sees is wrong afterwards — the rows still navigate — so this is a
|
|
128
|
+
// console line, not a UI state.
|
|
129
|
+
console.warn('[unisim/sdk] could not check which suite apps are installed', err);
|
|
130
|
+
probe = null;
|
|
131
|
+
return NONE;
|
|
132
|
+
});
|
|
133
|
+
return probe;
|
|
134
|
+
}
|
|
135
|
+
function hookResume() {
|
|
136
|
+
if (resumeHooked || typeof document === 'undefined')
|
|
137
|
+
return;
|
|
138
|
+
resumeHooked = true;
|
|
139
|
+
document.addEventListener('visibilitychange', () => {
|
|
140
|
+
if (document.visibilityState === 'visible')
|
|
141
|
+
probe = null;
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/** Drop the cached probe. Exported for tests. */
|
|
145
|
+
export function resetInstalledSuiteApps() {
|
|
146
|
+
probe = null;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Bring the installed app for `id` to the front. Resolves false when there is
|
|
150
|
+
* nothing to open — no native build, not installed, no bridge, or the OS
|
|
151
|
+
* refused — and the caller is expected to fall back to the https link on false
|
|
152
|
+
* rather than leaving the tap dead.
|
|
153
|
+
*/
|
|
154
|
+
export async function openSuiteApp(id) {
|
|
155
|
+
const app = suiteNativeApp(id);
|
|
156
|
+
const plugin = suiteAppsPlugin();
|
|
157
|
+
if (!app || !plugin || !isNativeShell())
|
|
158
|
+
return false;
|
|
159
|
+
try {
|
|
160
|
+
const { opened } = await plugin.openApp(app);
|
|
161
|
+
return opened === true;
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
console.warn(`[unisim/sdk] could not open ${app.id}`, err);
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=suiteApps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suiteApps.js","sourceRoot":"","sources":["../src/suiteApps.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -166,7 +166,7 @@ export interface SeatPool {
|
|
|
166
166
|
* note the changelog validates at runtime against JSON, so a mismatch here
|
|
167
167
|
* surfaces as a mis-labelled entry rather than a build failure.
|
|
168
168
|
*/
|
|
169
|
-
export type ChangelogProduct = ProductCode | 'suite' | 'haptics';
|
|
169
|
+
export type ChangelogProduct = ProductCode | 'suite' | 'haptics' | 'family';
|
|
170
170
|
export interface ChangelogEntry {
|
|
171
171
|
product: ChangelogProduct;
|
|
172
172
|
type: 'added' | 'changed' | 'fixed' | 'removed' | 'deprecated' | 'security';
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|