@adminide-stack/yantra-mobile 12.0.32-alpha.4 → 12.0.32

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.
Files changed (54) hide show
  1. package/lib/bridge/AuthenticatedFetch.js +77 -0
  2. package/lib/bridge/AuthenticatedFetch.js.map +1 -0
  3. package/lib/bridge/BridgeDebugger.js +65 -0
  4. package/lib/bridge/BridgeDebugger.js.map +1 -0
  5. package/lib/bridge/CancellableRequest.js +38 -0
  6. package/lib/bridge/CancellableRequest.js.map +1 -0
  7. package/lib/bridge/ChunkedMessageHandler.js +71 -0
  8. package/lib/bridge/ChunkedMessageHandler.js.map +1 -0
  9. package/lib/bridge/NativeWebViewBridge.js +256 -0
  10. package/lib/bridge/NativeWebViewBridge.js.map +1 -0
  11. package/lib/bridge/TypedBridge.js +8 -0
  12. package/lib/bridge/TypedBridge.js.map +1 -0
  13. package/lib/bridge/WebViewManager.js +57 -0
  14. package/lib/bridge/WebViewManager.js.map +1 -0
  15. package/lib/bridge/handlers/AnalyticsBridgeHandler.js +23 -0
  16. package/lib/bridge/handlers/AnalyticsBridgeHandler.js.map +1 -0
  17. package/lib/bridge/handlers/AuthBridgeHandler.js +49 -0
  18. package/lib/bridge/handlers/AuthBridgeHandler.js.map +1 -0
  19. package/lib/bridge/handlers/NavigationBridgeHandler.js +62 -0
  20. package/lib/bridge/handlers/NavigationBridgeHandler.js.map +1 -0
  21. package/lib/bridge/readAuth0Session.js +51 -0
  22. package/lib/bridge/readAuth0Session.js.map +1 -0
  23. package/lib/bridge/resolveMobileWebUrl.js +35 -0
  24. package/lib/bridge/resolveMobileWebUrl.js.map +1 -0
  25. package/lib/bridge/types.js +12 -0
  26. package/lib/bridge/types.js.map +1 -0
  27. package/lib/bridge/webBridgeBootstrap.js +185 -0
  28. package/lib/bridge/webBridgeBootstrap.js.map +1 -0
  29. package/lib/components/CustomDrawer.js +6 -2
  30. package/lib/components/CustomDrawer.js.map +1 -1
  31. package/lib/compute.js +54 -1
  32. package/lib/compute.js.map +1 -1
  33. package/lib/config/env-config.js +4 -0
  34. package/lib/config/env-config.js.map +1 -1
  35. package/lib/hooks/mintSurfaceSystemToken.js +260 -0
  36. package/lib/hooks/mintSurfaceSystemToken.js.map +1 -0
  37. package/lib/hooks/useObtainSystemToken.js +76 -0
  38. package/lib/hooks/useObtainSystemToken.js.map +1 -0
  39. package/lib/hooks/usePrerequisiteIds.js +97 -54
  40. package/lib/hooks/usePrerequisiteIds.js.map +1 -1
  41. package/lib/index.js +1 -1
  42. package/lib/index.js.map +1 -1
  43. package/lib/routes.json +55 -0
  44. package/lib/screens/Chat/index.js +41 -10
  45. package/lib/screens/Chat/index.js.map +1 -1
  46. package/lib/screens/Home/HomeScreen.js +31 -11
  47. package/lib/screens/Home/HomeScreen.js.map +1 -1
  48. package/lib/screens/WebBuilder/WebViewWithNavigation.js +20 -0
  49. package/lib/screens/WebBuilder/WebViewWithNavigation.js.map +1 -0
  50. package/lib/screens/WebBuilder/index.js +345 -0
  51. package/lib/screens/WebBuilder/index.js.map +1 -0
  52. package/lib/theme/mobileTokens.js +3 -1
  53. package/lib/theme/mobileTokens.js.map +1 -1
  54. package/package.json +11 -5
@@ -0,0 +1,57 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+ const _WebViewManager = class _WebViewManager {
5
+ constructor() {
6
+ __publicField(this, "activeWebViews", /* @__PURE__ */ new Map());
7
+ __publicField(this, "maxWebViews", 3);
8
+ }
9
+ static getInstance() {
10
+ if (!_WebViewManager.instance) {
11
+ _WebViewManager.instance = new _WebViewManager();
12
+ }
13
+ return _WebViewManager.instance;
14
+ }
15
+ /** Test / teardown helper. */
16
+ static resetInstance() {
17
+ _WebViewManager.instance = null;
18
+ }
19
+ registerWebView(id, ref) {
20
+ this.activeWebViews.set(id, {
21
+ ref,
22
+ lastUsed: Date.now(),
23
+ memoryUsage: 0
24
+ });
25
+ this.cleanupIfNeeded();
26
+ }
27
+ unregisterWebView(id) {
28
+ this.activeWebViews.delete(id);
29
+ }
30
+ updateUsage(id) {
31
+ const webView = this.activeWebViews.get(id);
32
+ if (webView) {
33
+ webView.lastUsed = Date.now();
34
+ }
35
+ }
36
+ clearCache(id) {
37
+ var _a, _b;
38
+ const entry = this.activeWebViews.get(id);
39
+ (_b = (_a = entry == null ? void 0 : entry.ref.current) == null ? void 0 : _a.clearCache) == null ? void 0 : _b.call(_a, true);
40
+ }
41
+ getActiveCount() {
42
+ return this.activeWebViews.size;
43
+ }
44
+ cleanupIfNeeded() {
45
+ var _a, _b;
46
+ if (this.activeWebViews.size <= this.maxWebViews) return;
47
+ const entries = Array.from(this.activeWebViews.entries());
48
+ const lru = entries.reduce((min, current) => current[1].lastUsed < min[1].lastUsed ? current : min);
49
+ (_b = (_a = lru[1].ref.current) == null ? void 0 : _a.clearCache) == null ? void 0 : _b.call(_a, true);
50
+ this.activeWebViews.delete(lru[0]);
51
+ if (__DEV__) {
52
+ console.log(`[WebViewManager] Cleared WebView ${lru[0]} due to memory limits`);
53
+ }
54
+ }
55
+ };
56
+ __publicField(_WebViewManager, "instance", null);
57
+ let WebViewManager = _WebViewManager;export{WebViewManager};//# sourceMappingURL=WebViewManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebViewManager.js","sources":["../../src/bridge/WebViewManager.ts"],"sourcesContent":["import type React from 'react';\nimport type { WebView } from 'react-native-webview';\n\ntype WebViewEntry = {\n ref: React.RefObject<WebView | null>;\n lastUsed: number;\n memoryUsage: number;\n};\n\n/**\n * Caps concurrent WebViews and evicts least-recently-used instances\n * to reduce low-RAM Android white-screen crashes.\n */\nexport class WebViewManager {\n private static instance: WebViewManager | null = null;\n\n private activeWebViews = new Map<string, WebViewEntry>();\n\n private maxWebViews = 3;\n\n static getInstance(): WebViewManager {\n if (!WebViewManager.instance) {\n WebViewManager.instance = new WebViewManager();\n }\n return WebViewManager.instance;\n }\n\n /** Test / teardown helper. */\n static resetInstance(): void {\n WebViewManager.instance = null;\n }\n\n registerWebView(id: string, ref: React.RefObject<WebView | null>): void {\n this.activeWebViews.set(id, {\n ref,\n lastUsed: Date.now(),\n memoryUsage: 0,\n });\n this.cleanupIfNeeded();\n }\n\n unregisterWebView(id: string): void {\n this.activeWebViews.delete(id);\n }\n\n updateUsage(id: string): void {\n const webView = this.activeWebViews.get(id);\n if (webView) {\n webView.lastUsed = Date.now();\n }\n }\n\n clearCache(id: string): void {\n const entry = this.activeWebViews.get(id);\n entry?.ref.current?.clearCache?.(true);\n }\n\n getActiveCount(): number {\n return this.activeWebViews.size;\n }\n\n private cleanupIfNeeded(): void {\n if (this.activeWebViews.size <= this.maxWebViews) return;\n\n const entries = Array.from(this.activeWebViews.entries());\n const lru = entries.reduce((min, current) => (current[1].lastUsed < min[1].lastUsed ? current : min));\n\n lru[1].ref.current?.clearCache?.(true);\n this.activeWebViews.delete(lru[0]);\n\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.log(`[WebViewManager] Cleared WebView ${lru[0]} due to memory limits`);\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ class AnalyticsBridgeHandler {
2
+ constructor(bridge) {
3
+ this.bridge = bridge;
4
+ this.setupHandlers();
5
+ }
6
+ setupHandlers() {
7
+ this.bridge.on("request:analytics.track", (message) => {
8
+ var _a;
9
+ try {
10
+ const payload = (_a = message.payload) != null ? _a : {};
11
+ if (__DEV__) {
12
+ console.log("[Analytics]", payload.event, payload.properties);
13
+ }
14
+ this.bridge.sendResponse(message.id, true, void 0);
15
+ } catch (error) {
16
+ this.bridge.sendResponse(message.id, false, null, {
17
+ code: "ANALYTICS_ERROR",
18
+ message: error instanceof Error ? error.message : "Analytics failed"
19
+ });
20
+ }
21
+ });
22
+ }
23
+ }export{AnalyticsBridgeHandler};//# sourceMappingURL=AnalyticsBridgeHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsBridgeHandler.js","sources":["../../../src/bridge/handlers/AnalyticsBridgeHandler.ts"],"sourcesContent":["import type { NativeWebViewBridge } from '../NativeWebViewBridge';\nimport type { BridgeMessage } from '../types';\n\n/**\n * Handles analytics.track from the WebView (logs in __DEV__; extend with a real sink later).\n */\nexport class AnalyticsBridgeHandler {\n constructor(private readonly bridge: NativeWebViewBridge) {\n this.setupHandlers();\n }\n\n private setupHandlers(): void {\n this.bridge.on('request:analytics.track', (message: BridgeMessage) => {\n try {\n const payload = (message.payload ?? {}) as {\n event?: string;\n properties?: Record<string, unknown>;\n };\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.log('[Analytics]', payload.event, payload.properties);\n }\n this.bridge.sendResponse(message.id, true, undefined);\n } catch (error) {\n this.bridge.sendResponse(message.id, false, null, {\n code: 'ANALYTICS_ERROR',\n message: error instanceof Error ? error.message : 'Analytics failed',\n });\n }\n });\n }\n}\n"],"names":[],"mappings":"AAMO,MAAM,sBAAuB,CAAA;AAAA,EAClC,YAA6B,MAA6B,EAAA;AAA7B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAC3B,IAAA,IAAA,CAAK,aAAc,EAAA;AAAA;AACrB,EACQ,aAAsB,GAAA;AAC5B,IAAA,IAAA,CAAK,MAAO,CAAA,EAAA,CAAG,yBAA2B,EAAA,CAAC,OAA2B,KAAA;AAX1E,MAAA,IAAA,EAAA;AAYM,MAAI,IAAA;AACF,QAAA,MAAM,OAAW,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,OAAR,KAAA,IAAA,GAAA,EAAA,GAAmB,EAAC;AAIrC,QAAA,IAAI,OAAS,EAAA;AAEX,UAAA,OAAA,CAAQ,GAAI,CAAA,aAAA,EAAe,OAAQ,CAAA,KAAA,EAAO,QAAQ,UAAU,CAAA;AAAA;AAE9D,QAAA,IAAA,CAAK,MAAO,CAAA,YAAA,CAAa,OAAQ,CAAA,EAAA,EAAI,MAAM,KAAS,CAAA,CAAA;AAAA,eAC7C,KAAO,EAAA;AACd,QAAA,IAAA,CAAK,MAAO,CAAA,YAAA,CAAa,OAAQ,CAAA,EAAA,EAAI,OAAO,IAAM,EAAA;AAAA,UAChD,IAAM,EAAA,iBAAA;AAAA,UACN,OAAS,EAAA,KAAA,YAAiB,KAAQ,GAAA,KAAA,CAAM,OAAU,GAAA;AAAA,SACnD,CAAA;AAAA;AACH,KACD,CAAA;AAAA;AAEL"}
@@ -0,0 +1,49 @@
1
+ import {readAuth0IdToken,readAuth0ExpiresAt}from'../readAuth0Session.js';class AuthBridgeHandler {
2
+ constructor(bridge) {
3
+ this.bridge = bridge;
4
+ this.setupHandlers();
5
+ }
6
+ setupHandlers() {
7
+ this.bridge.on("request:auth.getToken", async (message) => {
8
+ try {
9
+ const token = await readAuth0IdToken();
10
+ if (!token) {
11
+ throw new Error("No active session");
12
+ }
13
+ const expiresAt = await readAuth0ExpiresAt();
14
+ this.bridge.sendResponse(message.id, true, {
15
+ token,
16
+ expiresAt
17
+ });
18
+ } catch (error) {
19
+ this.bridge.sendResponse(message.id, false, null, {
20
+ code: "AUTH_ERROR",
21
+ message: error instanceof Error ? error.message : "Auth error"
22
+ });
23
+ }
24
+ });
25
+ this.bridge.on("request:auth.refreshToken", async (message) => {
26
+ try {
27
+ const token = await readAuth0IdToken();
28
+ if (!token) {
29
+ this.bridge.sendEvent("auth.sessionExpired");
30
+ throw new Error("Session expired");
31
+ }
32
+ const expiresAt = await readAuth0ExpiresAt();
33
+ if (expiresAt <= Date.now()) {
34
+ this.bridge.sendEvent("auth.sessionExpired");
35
+ throw new Error("Session expired");
36
+ }
37
+ this.bridge.sendResponse(message.id, true, {
38
+ token,
39
+ expiresAt
40
+ });
41
+ } catch (error) {
42
+ this.bridge.sendResponse(message.id, false, null, {
43
+ code: "REFRESH_FAILED",
44
+ message: error instanceof Error ? error.message : "Refresh failed"
45
+ });
46
+ }
47
+ });
48
+ }
49
+ }export{AuthBridgeHandler};//# sourceMappingURL=AuthBridgeHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthBridgeHandler.js","sources":["../../../src/bridge/handlers/AuthBridgeHandler.ts"],"sourcesContent":["import type { NativeWebViewBridge } from '../NativeWebViewBridge';\nimport type { BridgeMessage } from '../types';\nimport { readAuth0ExpiresAt, readAuth0IdToken } from '../readAuth0Session';\n\n/**\n * Serves Auth0 session tokens from SecureStore / AsyncStorage\n * (same layout as @adminide-stack/user-auth0-mobile NativeStorage).\n */\nexport class AuthBridgeHandler {\n constructor(private readonly bridge: NativeWebViewBridge) {\n this.setupHandlers();\n }\n\n private setupHandlers(): void {\n this.bridge.on('request:auth.getToken', async (message: BridgeMessage) => {\n try {\n const token = await readAuth0IdToken();\n if (!token) {\n throw new Error('No active session');\n }\n const expiresAt = await readAuth0ExpiresAt();\n this.bridge.sendResponse(message.id, true, { token, expiresAt });\n } catch (error) {\n this.bridge.sendResponse(message.id, false, null, {\n code: 'AUTH_ERROR',\n message: error instanceof Error ? error.message : 'Auth error',\n });\n }\n });\n\n this.bridge.on('request:auth.refreshToken', async (message: BridgeMessage) => {\n try {\n // Re-read storage; a full Auth0 refresh is owned by the auth module.\n const token = await readAuth0IdToken();\n if (!token) {\n this.bridge.sendEvent('auth.sessionExpired');\n throw new Error('Session expired');\n }\n const expiresAt = await readAuth0ExpiresAt();\n if (expiresAt <= Date.now()) {\n this.bridge.sendEvent('auth.sessionExpired');\n throw new Error('Session expired');\n }\n this.bridge.sendResponse(message.id, true, { token, expiresAt });\n } catch (error) {\n this.bridge.sendResponse(message.id, false, null, {\n code: 'REFRESH_FAILED',\n message: error instanceof Error ? error.message : 'Refresh failed',\n });\n }\n });\n }\n}\n"],"names":[],"mappings":"yEAQO,MAAM,iBAAkB,CAAA;AAAA,EAC7B,YAA6B,MAA6B,EAAA;AAA7B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAC3B,IAAA,IAAA,CAAK,aAAc,EAAA;AAAA;AACrB,EACQ,aAAsB,GAAA;AAC5B,IAAA,IAAA,CAAK,MAAO,CAAA,EAAA,CAAG,uBAAyB,EAAA,OAAO,OAA2B,KAAA;AACxE,MAAI,IAAA;AACF,QAAM,MAAA,KAAA,GAAQ,MAAM,gBAAiB,EAAA;AACrC,QAAA,IAAI,CAAC,KAAO,EAAA;AACV,UAAM,MAAA,IAAI,MAAM,mBAAmB,CAAA;AAAA;AAErC,QAAM,MAAA,SAAA,GAAY,MAAM,kBAAmB,EAAA;AAC3C,QAAA,IAAA,CAAK,MAAO,CAAA,YAAA,CAAa,OAAQ,CAAA,EAAA,EAAI,IAAM,EAAA;AAAA,UACzC,KAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,eACM,KAAO,EAAA;AACd,QAAA,IAAA,CAAK,MAAO,CAAA,YAAA,CAAa,OAAQ,CAAA,EAAA,EAAI,OAAO,IAAM,EAAA;AAAA,UAChD,IAAM,EAAA,YAAA;AAAA,UACN,OAAS,EAAA,KAAA,YAAiB,KAAQ,GAAA,KAAA,CAAM,OAAU,GAAA;AAAA,SACnD,CAAA;AAAA;AACH,KACD,CAAA;AACD,IAAA,IAAA,CAAK,MAAO,CAAA,EAAA,CAAG,2BAA6B,EAAA,OAAO,OAA2B,KAAA;AAC5E,MAAI,IAAA;AAEF,QAAM,MAAA,KAAA,GAAQ,MAAM,gBAAiB,EAAA;AACrC,QAAA,IAAI,CAAC,KAAO,EAAA;AACV,UAAK,IAAA,CAAA,MAAA,CAAO,UAAU,qBAAqB,CAAA;AAC3C,UAAM,MAAA,IAAI,MAAM,iBAAiB,CAAA;AAAA;AAEnC,QAAM,MAAA,SAAA,GAAY,MAAM,kBAAmB,EAAA;AAC3C,QAAI,IAAA,SAAA,IAAa,IAAK,CAAA,GAAA,EAAO,EAAA;AAC3B,UAAK,IAAA,CAAA,MAAA,CAAO,UAAU,qBAAqB,CAAA;AAC3C,UAAM,MAAA,IAAI,MAAM,iBAAiB,CAAA;AAAA;AAEnC,QAAA,IAAA,CAAK,MAAO,CAAA,YAAA,CAAa,OAAQ,CAAA,EAAA,EAAI,IAAM,EAAA;AAAA,UACzC,KAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,eACM,KAAO,EAAA;AACd,QAAA,IAAA,CAAK,MAAO,CAAA,YAAA,CAAa,OAAQ,CAAA,EAAA,EAAI,OAAO,IAAM,EAAA;AAAA,UAChD,IAAM,EAAA,gBAAA;AAAA,UACN,OAAS,EAAA,KAAA,YAAiB,KAAQ,GAAA,KAAA,CAAM,OAAU,GAAA;AAAA,SACnD,CAAA;AAAA;AACH,KACD,CAAA;AAAA;AAEL"}
@@ -0,0 +1,62 @@
1
+ import {CommonActions}from'@react-navigation/native';const SCREEN_ALIASES = {
2
+ home: "MainStack.Layout.Home",
3
+ chat: "MainStack.Chat",
4
+ chathistory: "MainStack.ChatHistory",
5
+ webbuilder: "MainStack.WebBuilder",
6
+ WebBuilder: "MainStack.WebBuilder",
7
+ Home: "MainStack.Layout.Home",
8
+ Chat: "MainStack.Chat",
9
+ ChatHistory: "MainStack.ChatHistory"
10
+ };
11
+ class NavigationBridgeHandler {
12
+ constructor(bridge, getNavigation) {
13
+ this.bridge = bridge;
14
+ this.getNavigation = getNavigation;
15
+ this.setupHandlers();
16
+ }
17
+ setupHandlers() {
18
+ this.bridge.on("request:navigation.navigate", (message) => {
19
+ var _a, _b, _c;
20
+ try {
21
+ const payload = (_a = message.payload) != null ? _a : {};
22
+ const screen = (_b = payload.screen) == null ? void 0 : _b.trim();
23
+ if (!screen) {
24
+ throw new Error("screen is required");
25
+ }
26
+ const routeName = (_c = SCREEN_ALIASES[screen]) != null ? _c : screen;
27
+ const navigation = this.getNavigation();
28
+ if (!navigation) {
29
+ throw new Error("Navigation unavailable");
30
+ }
31
+ navigation.dispatch(CommonActions.navigate({
32
+ name: routeName,
33
+ params: payload.params
34
+ }));
35
+ this.bridge.sendResponse(message.id, true, void 0);
36
+ } catch (error) {
37
+ this.bridge.sendResponse(message.id, false, null, {
38
+ code: "NAVIGATION_ERROR",
39
+ message: error instanceof Error ? error.message : "Navigation failed"
40
+ });
41
+ }
42
+ });
43
+ this.bridge.on("request:navigation.goBack", (message) => {
44
+ try {
45
+ const navigation = this.getNavigation();
46
+ if (!navigation) {
47
+ throw new Error("Navigation unavailable");
48
+ }
49
+ const canGoBack = typeof navigation.canGoBack === "function" ? navigation.canGoBack() : false;
50
+ if (canGoBack) {
51
+ navigation.goBack();
52
+ }
53
+ this.bridge.sendResponse(message.id, true, canGoBack);
54
+ } catch (error) {
55
+ this.bridge.sendResponse(message.id, false, null, {
56
+ code: "NAVIGATION_ERROR",
57
+ message: error instanceof Error ? error.message : "goBack failed"
58
+ });
59
+ }
60
+ });
61
+ }
62
+ }export{NavigationBridgeHandler};//# sourceMappingURL=NavigationBridgeHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavigationBridgeHandler.js","sources":["../../../src/bridge/handlers/NavigationBridgeHandler.ts"],"sourcesContent":["import { CommonActions, type NavigationContainerRef } from '@react-navigation/native';\nimport type { NativeWebViewBridge } from '../NativeWebViewBridge';\nimport type { BridgeMessage } from '../types';\n\ntype NavigationLike = {\n dispatch: (action: unknown) => void;\n goBack: () => void;\n canGoBack: () => boolean;\n};\n\n/** Maps short screen keys to MainStack route names used by Yantra mobile. */\nconst SCREEN_ALIASES: Record<string, string> = {\n home: 'MainStack.Layout.Home',\n chat: 'MainStack.Chat',\n chathistory: 'MainStack.ChatHistory',\n webbuilder: 'MainStack.WebBuilder',\n WebBuilder: 'MainStack.WebBuilder',\n Home: 'MainStack.Layout.Home',\n Chat: 'MainStack.Chat',\n ChatHistory: 'MainStack.ChatHistory',\n};\n\n/**\n * Handles navigation.* bridge requests from the WebView.\n */\nexport class NavigationBridgeHandler {\n constructor(\n private readonly bridge: NativeWebViewBridge,\n private readonly getNavigation: () => NavigationLike | NavigationContainerRef<any> | null,\n ) {\n this.setupHandlers();\n }\n\n private setupHandlers(): void {\n this.bridge.on('request:navigation.navigate', (message: BridgeMessage) => {\n try {\n const payload = (message.payload ?? {}) as {\n screen?: string;\n params?: Record<string, unknown>;\n };\n const screen = payload.screen?.trim();\n if (!screen) {\n throw new Error('screen is required');\n }\n const routeName = SCREEN_ALIASES[screen] ?? screen;\n const navigation = this.getNavigation();\n if (!navigation) {\n throw new Error('Navigation unavailable');\n }\n navigation.dispatch(\n CommonActions.navigate({\n name: routeName,\n params: payload.params,\n }),\n );\n this.bridge.sendResponse(message.id, true, undefined);\n } catch (error) {\n this.bridge.sendResponse(message.id, false, null, {\n code: 'NAVIGATION_ERROR',\n message: error instanceof Error ? error.message : 'Navigation failed',\n });\n }\n });\n\n this.bridge.on('request:navigation.goBack', (message: BridgeMessage) => {\n try {\n const navigation = this.getNavigation();\n if (!navigation) {\n throw new Error('Navigation unavailable');\n }\n const canGoBack = typeof navigation.canGoBack === 'function' ? navigation.canGoBack() : false;\n if (canGoBack) {\n navigation.goBack();\n }\n this.bridge.sendResponse(message.id, true, canGoBack);\n } catch (error) {\n this.bridge.sendResponse(message.id, false, null, {\n code: 'NAVIGATION_ERROR',\n message: error instanceof Error ? error.message : 'goBack failed',\n });\n }\n });\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import AsyncStorage from'@react-native-async-storage/async-storage';import*as SecureStore from'expo-secure-store';import {Platform}from'react-native';const SECURE_KEYS = /* @__PURE__ */ new Set(["id_token", "access_token", "refresh_token"]);
2
+ async function readRaw(key) {
3
+ let raw = null;
4
+ if (Platform.OS !== "web" && SECURE_KEYS.has(key)) {
5
+ try {
6
+ raw = await SecureStore.getItemAsync(key);
7
+ } catch (e) {
8
+ raw = null;
9
+ }
10
+ }
11
+ if (!raw) {
12
+ try {
13
+ raw = await AsyncStorage.getItem(key);
14
+ } catch (e) {
15
+ raw = null;
16
+ }
17
+ }
18
+ if (!raw || raw === "undefined") return null;
19
+ return raw;
20
+ }
21
+ function unwrapStoredString(raw) {
22
+ try {
23
+ const parsed = JSON.parse(raw);
24
+ if (typeof parsed === "string" && parsed.trim()) return parsed.trim();
25
+ if (typeof parsed === "number" && Number.isFinite(parsed)) return String(parsed);
26
+ } catch (e) {
27
+ if (raw.trim()) return raw.trim();
28
+ }
29
+ return null;
30
+ }
31
+ async function readAuth0IdToken() {
32
+ for (const key of ["id_token", "access_token"]) {
33
+ const raw = await readRaw(key);
34
+ if (!raw) continue;
35
+ const value = unwrapStoredString(raw);
36
+ if (value) return value;
37
+ }
38
+ return null;
39
+ }
40
+ async function readAuth0ExpiresAt() {
41
+ const raw = await readRaw("expires_at");
42
+ if (!raw) return Date.now() + 60 * 60 * 1e3;
43
+ try {
44
+ const parsed = JSON.parse(raw);
45
+ const value = typeof parsed === "number" ? parsed : parseInt(String(parsed), 10);
46
+ return Number.isFinite(value) ? value : Date.now() + 60 * 60 * 1e3;
47
+ } catch (e) {
48
+ const value = parseInt(raw, 10);
49
+ return Number.isFinite(value) ? value : Date.now() + 60 * 60 * 1e3;
50
+ }
51
+ }export{readAuth0ExpiresAt,readAuth0IdToken};//# sourceMappingURL=readAuth0Session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readAuth0Session.js","sources":["../../src/bridge/readAuth0Session.ts"],"sourcesContent":["/**\n * Auth0 mobile stores id/access/refresh tokens in expo-secure-store\n * (@adminide-stack/user-auth0-mobile NativeStorage). Non-secret keys\n * (expires_at, session_id) stay in AsyncStorage.\n */\n\nimport AsyncStorage from '@react-native-async-storage/async-storage';\nimport * as SecureStore from 'expo-secure-store';\nimport { Platform } from 'react-native';\n\nconst SECURE_KEYS = new Set(['id_token', 'access_token', 'refresh_token']);\n\nasync function readRaw(key: string): Promise<string | null> {\n let raw: string | null = null;\n if (Platform.OS !== 'web' && SECURE_KEYS.has(key)) {\n try {\n raw = await SecureStore.getItemAsync(key);\n } catch {\n raw = null;\n }\n }\n if (!raw) {\n try {\n raw = await AsyncStorage.getItem(key);\n } catch {\n raw = null;\n }\n }\n if (!raw || raw === 'undefined') return null;\n return raw;\n}\n\nfunction unwrapStoredString(raw: string): string | null {\n try {\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed === 'string' && parsed.trim()) return parsed.trim();\n if (typeof parsed === 'number' && Number.isFinite(parsed)) return String(parsed);\n } catch {\n if (raw.trim()) return raw.trim();\n }\n return null;\n}\n\n/** Prefer id_token (Auth0 JWT); fall back to access_token. */\nexport async function readAuth0IdToken(): Promise<string | null> {\n for (const key of ['id_token', 'access_token'] as const) {\n const raw = await readRaw(key);\n if (!raw) continue;\n const value = unwrapStoredString(raw);\n if (value) return value;\n }\n return null;\n}\n\nexport async function readAuth0ExpiresAt(): Promise<number> {\n const raw = await readRaw('expires_at');\n if (!raw) return Date.now() + 60 * 60 * 1000;\n try {\n const parsed: unknown = JSON.parse(raw);\n const value = typeof parsed === 'number' ? parsed : parseInt(String(parsed), 10);\n return Number.isFinite(value) ? value : Date.now() + 60 * 60 * 1000;\n } catch {\n const value = parseInt(raw, 10);\n return Number.isFinite(value) ? value : Date.now() + 60 * 60 * 1000;\n }\n}\n"],"names":[],"mappings":"sJASA,MAAM,8BAAkB,IAAA,GAAA,CAAI,CAAC,UAAY,EAAA,cAAA,EAAgB,eAAe,CAAC,CAAA;AACzE,eAAe,QAAQ,GAAqC,EAAA;AAC1D,EAAA,IAAI,GAAqB,GAAA,IAAA;AACzB,EAAA,IAAI,SAAS,EAAO,KAAA,KAAA,IAAS,WAAY,CAAA,GAAA,CAAI,GAAG,CAAG,EAAA;AACjD,IAAI,IAAA;AACF,MAAM,GAAA,GAAA,MAAM,WAAY,CAAA,YAAA,CAAa,GAAG,CAAA;AAAA,KAClC,CAAA,OAAA,CAAA,EAAA;AACN,MAAM,GAAA,GAAA,IAAA;AAAA;AACR;AAEF,EAAA,IAAI,CAAC,GAAK,EAAA;AACR,IAAI,IAAA;AACF,MAAM,GAAA,GAAA,MAAM,YAAa,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,KAC9B,CAAA,OAAA,CAAA,EAAA;AACN,MAAM,GAAA,GAAA,IAAA;AAAA;AACR;AAEF,EAAA,IAAI,CAAC,GAAA,IAAO,GAAQ,KAAA,WAAA,EAAoB,OAAA,IAAA;AACxC,EAAO,OAAA,GAAA;AACT;AACA,SAAS,mBAAmB,GAA4B,EAAA;AACtD,EAAI,IAAA;AACF,IAAM,MAAA,MAAA,GAAkB,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA;AACtC,IAAI,IAAA,OAAO,WAAW,QAAY,IAAA,MAAA,CAAO,MAAQ,EAAA,OAAO,OAAO,IAAK,EAAA;AACpE,IAAI,IAAA,OAAO,WAAW,QAAY,IAAA,MAAA,CAAO,SAAS,MAAM,CAAA,EAAU,OAAA,MAAA,CAAO,MAAM,CAAA;AAAA,GACzE,CAAA,OAAA,CAAA,EAAA;AACN,IAAA,IAAI,GAAI,CAAA,IAAA,EAAQ,EAAA,OAAO,IAAI,IAAK,EAAA;AAAA;AAElC,EAAO,OAAA,IAAA;AACT;AAGA,eAAsB,gBAA2C,GAAA;AAC/D,EAAA,KAAA,MAAW,GAAO,IAAA,CAAC,UAAY,EAAA,cAAc,CAAY,EAAA;AACvD,IAAM,MAAA,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,GAAK,EAAA;AACV,IAAM,MAAA,KAAA,GAAQ,mBAAmB,GAAG,CAAA;AACpC,IAAA,IAAI,OAAc,OAAA,KAAA;AAAA;AAEpB,EAAO,OAAA,IAAA;AACT;AACA,eAAsB,kBAAsC,GAAA;AAC1D,EAAM,MAAA,GAAA,GAAM,MAAM,OAAA,CAAQ,YAAY,CAAA;AACtC,EAAA,IAAI,CAAC,GAAK,EAAA,OAAO,KAAK,GAAI,EAAA,GAAI,KAAK,EAAK,GAAA,GAAA;AACxC,EAAI,IAAA;AACF,IAAM,MAAA,MAAA,GAAkB,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA;AACtC,IAAM,MAAA,KAAA,GAAQ,OAAO,MAAW,KAAA,QAAA,GAAW,SAAS,QAAS,CAAA,MAAA,CAAO,MAAM,CAAA,EAAG,EAAE,CAAA;AAC/E,IAAO,OAAA,MAAA,CAAO,SAAS,KAAK,CAAA,GAAI,QAAQ,IAAK,CAAA,GAAA,EAAQ,GAAA,EAAA,GAAK,EAAK,GAAA,GAAA;AAAA,GACzD,CAAA,OAAA,CAAA,EAAA;AACN,IAAM,MAAA,KAAA,GAAQ,QAAS,CAAA,GAAA,EAAK,EAAE,CAAA;AAC9B,IAAO,OAAA,MAAA,CAAO,SAAS,KAAK,CAAA,GAAI,QAAQ,IAAK,CAAA,GAAA,EAAQ,GAAA,EAAA,GAAK,EAAK,GAAA,GAAA;AAAA;AAEnE"}
@@ -0,0 +1,35 @@
1
+ function resolveMobileWebUrl(url, packagerHost) {
2
+ var _a;
3
+ if (!url || typeof url !== "string") return url;
4
+ let parsed;
5
+ try {
6
+ parsed = new URL(url);
7
+ } catch (e) {
8
+ return url;
9
+ }
10
+ const isLoopback = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1";
11
+ if (!isLoopback) return url;
12
+ const host = (_a = (packagerHost != null ? packagerHost : "").split(":")[0]) == null ? void 0 : _a.trim();
13
+ if (!host || host === "localhost" || host === "127.0.0.1") {
14
+ return url;
15
+ }
16
+ parsed.hostname = host;
17
+ return parsed.toString();
18
+ }
19
+ function getPackagerHost() {
20
+ var _a, _b, _c, _d, _e, _f, _g, _h;
21
+ try {
22
+ const Constants = require("expo-constants").default;
23
+ const candidates = [(_a = Constants.expoConfig) == null ? void 0 : _a.hostUri, (_d = (_c = (_b = Constants.manifest2) == null ? void 0 : _b.extra) == null ? void 0 : _c.expoClient) == null ? void 0 : _d.hostUri, (_e = Constants.manifest) == null ? void 0 : _e.debuggerHost, (_f = Constants.manifest) == null ? void 0 : _f.hostUri, Constants.experienceUrl];
24
+ for (const raw of candidates) {
25
+ if (!raw || typeof raw !== "string") continue;
26
+ const cleaned = raw.replace(/^[a-z]+:\/\//i, "");
27
+ const host = (_h = (_g = cleaned.split("/")[0]) == null ? void 0 : _g.split(":")[0]) == null ? void 0 : _h.trim();
28
+ if (host && host !== "localhost" && host !== "127.0.0.1") {
29
+ return host;
30
+ }
31
+ }
32
+ } catch (e) {
33
+ }
34
+ return null;
35
+ }export{getPackagerHost,resolveMobileWebUrl};//# sourceMappingURL=resolveMobileWebUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveMobileWebUrl.js","sources":["../../src/bridge/resolveMobileWebUrl.ts"],"sourcesContent":["/**\n * Rewrites localhost / 127.0.0.1 in CLIENT_URL to the Metro/Expo packager host\n * so a physical device WebView can reach the Mac's web server.\n */\nexport function resolveMobileWebUrl(url: string, packagerHost?: string | null): string {\n if (!url || typeof url !== 'string') return url;\n\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return url;\n }\n\n const isLoopback = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';\n if (!isLoopback) return url;\n\n const host = (packagerHost ?? '').split(':')[0]?.trim();\n if (!host || host === 'localhost' || host === '127.0.0.1') {\n return url;\n }\n\n parsed.hostname = host;\n return parsed.toString();\n}\n\n/** Best-effort Expo / Metro host (IP or hostname), without port. */\nexport function getPackagerHost(): string | null {\n try {\n // Lazy require so unit tests / non-Expo bundles don't hard-fail.\n // eslint-disable-next-line @typescript-eslint/no-require-imports, global-require\n const Constants = require('expo-constants').default as {\n expoConfig?: { hostUri?: string };\n experienceUrl?: string;\n manifest?: { debuggerHost?: string; hostUri?: string };\n manifest2?: { extra?: { expoClient?: { hostUri?: string } } };\n };\n\n const candidates = [\n Constants.expoConfig?.hostUri,\n Constants.manifest2?.extra?.expoClient?.hostUri,\n Constants.manifest?.debuggerHost,\n Constants.manifest?.hostUri,\n Constants.experienceUrl,\n ];\n\n for (const raw of candidates) {\n if (!raw || typeof raw !== 'string') continue;\n // experienceUrl may be exp://192.168.x.x:8081\n const cleaned = raw.replace(/^[a-z]+:\\/\\//i, '');\n const host = cleaned.split('/')[0]?.split(':')[0]?.trim();\n if (host && host !== 'localhost' && host !== '127.0.0.1') {\n return host;\n }\n }\n } catch {\n // expo-constants unavailable\n }\n return null;\n}\n"],"names":[],"mappings":"AAIgB,SAAA,mBAAA,CAAoB,KAAa,YAAsC,EAAA;AAJvF,EAAA,IAAA,EAAA;AAKE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAiB,OAAA,GAAA;AAC5C,EAAI,IAAA,MAAA;AACJ,EAAI,IAAA;AACF,IAAS,MAAA,GAAA,IAAI,IAAI,GAAG,CAAA;AAAA,GACd,CAAA,OAAA,CAAA,EAAA;AACN,IAAO,OAAA,GAAA;AAAA;AAET,EAAA,MAAM,UAAa,GAAA,MAAA,CAAO,QAAa,KAAA,WAAA,IAAe,OAAO,QAAa,KAAA,WAAA;AAC1E,EAAI,IAAA,CAAC,YAAmB,OAAA,GAAA;AACxB,EAAM,MAAA,IAAA,GAAA,CAAQ,4CAAgB,EAAI,EAAA,KAAA,CAAM,GAAG,CAAE,CAAA,CAAC,MAAhC,IAAmC,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,EAAA;AACjD,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAS,KAAA,WAAA,IAAe,SAAS,WAAa,EAAA;AACzD,IAAO,OAAA,GAAA;AAAA;AAET,EAAA,MAAA,CAAO,QAAW,GAAA,IAAA;AAClB,EAAA,OAAO,OAAO,QAAS,EAAA;AACzB;AAGO,SAAS,eAAiC,GAAA;AAvBjD,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAwBE,EAAI,IAAA;AAGF,IAAM,MAAA,SAAA,GAAY,OAAQ,CAAA,gBAAgB,CAAE,CAAA,OAAA;AAiB5C,IAAM,MAAA,UAAA,GAAa,EAAC,EAAU,GAAA,SAAA,CAAA,UAAA,KAAV,mBAAsB,OAAS,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,SAAA,CAAU,SAAV,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAqB,KAArB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA4B,eAA5B,IAAwC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAA,EAAA,CAAS,EAAU,GAAA,SAAA,CAAA,QAAA,KAAV,IAAoB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,YAAA,EAAA,CAAc,eAAU,QAAV,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAoB,OAAS,EAAA,SAAA,CAAU,aAAa,CAAA;AAC1L,IAAA,KAAA,MAAW,OAAO,UAAY,EAAA;AAC5B,MAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAU,EAAA;AAErC,MAAA,MAAM,OAAU,GAAA,GAAA,CAAI,OAAQ,CAAA,eAAA,EAAiB,EAAE,CAAA;AAC/C,MAAM,MAAA,IAAA,GAAA,CAAO,EAAQ,GAAA,CAAA,EAAA,GAAA,OAAA,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,KAApB,IAAuB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA,CAAM,GAAK,CAAA,CAAA,CAAA,CAAA,KAAlC,IAAsC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,EAAA;AACnD,MAAA,IAAI,IAAQ,IAAA,IAAA,KAAS,WAAe,IAAA,IAAA,KAAS,WAAa,EAAA;AACxD,QAAO,OAAA,IAAA;AAAA;AACT;AACF,GACM,CAAA,OAAA,CAAA,EAAA;AAAA;AAGR,EAAO,OAAA,IAAA;AACT"}
@@ -0,0 +1,12 @@
1
+ var MessageType = /* @__PURE__ */ ((MessageType2) => {
2
+ MessageType2["REQUEST"] = "REQUEST";
3
+ MessageType2["RESPONSE"] = "RESPONSE";
4
+ MessageType2["EVENT"] = "EVENT";
5
+ MessageType2["ERROR"] = "ERROR";
6
+ MessageType2["CHUNK"] = "CHUNK";
7
+ return MessageType2;
8
+ })(MessageType || {});
9
+ const BRIDGE_PROTOCOL_VERSION = "1.0";
10
+ const BRIDGE_READY_ACTION = "BRIDGE_READY";
11
+ const DEFAULT_BRIDGE_TIMEOUT_MS = 1e4;
12
+ const DEFAULT_CHUNK_SIZE = 5e4;export{BRIDGE_PROTOCOL_VERSION,BRIDGE_READY_ACTION,DEFAULT_BRIDGE_TIMEOUT_MS,DEFAULT_CHUNK_SIZE,MessageType};//# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":["../../src/bridge/types.ts"],"sourcesContent":["/** Shared WebView ↔ native bridge protocol (sph.sh Parts 1–2). */\n\nexport enum MessageType {\n REQUEST = 'REQUEST',\n RESPONSE = 'RESPONSE',\n EVENT = 'EVENT',\n ERROR = 'ERROR',\n CHUNK = 'CHUNK',\n}\n\nexport interface BridgeMessage<T = unknown> {\n id: string;\n type: MessageType;\n action: string;\n payload: T;\n timestamp: number;\n version: string;\n}\n\nexport interface BridgeErrorPayload {\n code: string;\n message: string;\n details?: unknown;\n}\n\nexport interface BridgeResponse<T = unknown> {\n id: string;\n success: boolean;\n data?: T;\n error?: BridgeErrorPayload;\n}\n\n/** Chunk envelope for large postMessage payloads. */\nexport interface ChunkEnvelope {\n type: MessageType.CHUNK;\n chunkId: string;\n chunkIndex: number;\n totalChunks: number;\n data: string;\n}\n\nexport const BRIDGE_PROTOCOL_VERSION = '1.0';\nexport const BRIDGE_READY_ACTION = 'BRIDGE_READY';\nexport const DEFAULT_BRIDGE_TIMEOUT_MS = 10_000;\nexport const DEFAULT_CHUNK_SIZE = 50_000;\n\n/**\n * Typed action contract used by both native and web sides.\n * Camera / biometrics deferred until a concrete WebBuilder need exists.\n */\nexport interface BridgeAPI {\n 'auth.getToken': {\n request: void;\n response: { token: string; expiresAt: number };\n };\n 'auth.refreshToken': {\n request: { currentToken?: string };\n response: { token: string; expiresAt: number };\n };\n 'navigation.navigate': {\n request: { screen: string; params?: Record<string, unknown> };\n response: void;\n };\n 'navigation.goBack': {\n request: void;\n response: boolean;\n };\n 'analytics.track': {\n request: {\n event: string;\n properties?: Record<string, unknown>;\n };\n response: void;\n };\n}\n\nexport type BridgeAction = keyof BridgeAPI;\n"],"names":["MessageType"],"mappings":"AAEY,IAAA,WAAA,qBAAAA,YAAL,KAAA;AACL,EAAAA,aAAA,SAAU,CAAA,GAAA,SAAA;AACV,EAAAA,aAAA,UAAW,CAAA,GAAA,UAAA;AACX,EAAAA,aAAA,OAAQ,CAAA,GAAA,OAAA;AACR,EAAAA,aAAA,OAAQ,CAAA,GAAA,OAAA;AACR,EAAAA,aAAA,OAAQ,CAAA,GAAA,OAAA;AALE,EAAAA,OAAAA,YAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;AAmCL,MAAM,uBAA0B,GAAA;AAChC,MAAM,mBAAsB,GAAA;AAC5B,MAAM,yBAA4B,GAAA;AAClC,MAAM,kBAAqB,GAAA"}
@@ -0,0 +1,185 @@
1
+ const WEB_BRIDGE_BOOTSTRAP = `
2
+ (function () {
3
+ if (window.__yantraBridgeInstalled) { true; return; }
4
+ window.__yantraBridgeInstalled = true;
5
+
6
+ var MessageType = {
7
+ REQUEST: 'REQUEST',
8
+ RESPONSE: 'RESPONSE',
9
+ EVENT: 'EVENT',
10
+ ERROR: 'ERROR',
11
+ CHUNK: 'CHUNK'
12
+ };
13
+
14
+ function generateId() {
15
+ return Date.now() + '-' + Math.random().toString(36).slice(2, 11);
16
+ }
17
+
18
+ function postToNative(serialized) {
19
+ if (window.ReactNativeWebView && window.ReactNativeWebView.postMessage) {
20
+ window.ReactNativeWebView.postMessage(serialized);
21
+ }
22
+ }
23
+
24
+ function WebViewBridge() {
25
+ this.handlers = {};
26
+ this.eventListeners = {};
27
+ this.pending = {};
28
+ this.chunks = {};
29
+
30
+ var self = this;
31
+ function onMsg(event) {
32
+ self.handleIncoming(event && event.data !== undefined ? event.data : event);
33
+ }
34
+ window.addEventListener('message', onMsg);
35
+ document.addEventListener('message', onMsg);
36
+
37
+ this.emit('BRIDGE_READY');
38
+ }
39
+
40
+ WebViewBridge.prototype.sendMessage = function (message) {
41
+ postToNative(JSON.stringify(message));
42
+ };
43
+
44
+ WebViewBridge.prototype.emit = function (action, payload) {
45
+ this.sendMessage({
46
+ id: generateId(),
47
+ type: MessageType.EVENT,
48
+ action: action,
49
+ payload: payload,
50
+ timestamp: Date.now(),
51
+ version: '1.0'
52
+ });
53
+ };
54
+
55
+ WebViewBridge.prototype.handle = function (action, handler) {
56
+ this.handlers[action] = handler;
57
+ };
58
+
59
+ WebViewBridge.prototype.on = function (action, listener) {
60
+ if (!this.eventListeners[action]) this.eventListeners[action] = [];
61
+ this.eventListeners[action].push(listener);
62
+ var self = this;
63
+ return function unsubscribe() {
64
+ self.eventListeners[action] = (self.eventListeners[action] || []).filter(function (l) {
65
+ return l !== listener;
66
+ });
67
+ };
68
+ };
69
+
70
+ WebViewBridge.prototype.request = function (action, payload, timeoutMs) {
71
+ var self = this;
72
+ var id = generateId();
73
+ var ms = timeoutMs || 10000;
74
+ return new Promise(function (resolve, reject) {
75
+ var timeout = setTimeout(function () {
76
+ delete self.pending[id];
77
+ reject(new Error('Request ' + action + ' timed out'));
78
+ }, ms);
79
+ self.pending[id] = { resolve: resolve, reject: reject, timeout: timeout };
80
+ self.sendMessage({
81
+ id: id,
82
+ type: MessageType.REQUEST,
83
+ action: action,
84
+ payload: payload,
85
+ timestamp: Date.now(),
86
+ version: '1.0'
87
+ });
88
+ });
89
+ };
90
+
91
+ WebViewBridge.prototype.sendResponse = function (id, success, data, error) {
92
+ this.sendMessage({
93
+ id: id,
94
+ type: MessageType.RESPONSE,
95
+ action: 'response',
96
+ payload: { id: id, success: success, data: data, error: error },
97
+ timestamp: Date.now(),
98
+ version: '1.0'
99
+ });
100
+ };
101
+
102
+ WebViewBridge.prototype.handleIncoming = function (raw) {
103
+ var data = raw;
104
+ if (typeof raw === 'string') {
105
+ try { data = JSON.parse(raw); } catch (e) { return; }
106
+ }
107
+ if (!data || typeof data !== 'object') return;
108
+
109
+ if (data.type === MessageType.CHUNK) {
110
+ var chunkId = data.chunkId;
111
+ if (!this.chunks[chunkId]) {
112
+ this.chunks[chunkId] = { chunks: new Array(data.totalChunks), receivedCount: 0, totalChunks: data.totalChunks };
113
+ }
114
+ var acc = this.chunks[chunkId];
115
+ if (acc.chunks[data.chunkIndex] === undefined) {
116
+ acc.chunks[data.chunkIndex] = data.data;
117
+ acc.receivedCount += 1;
118
+ }
119
+ if (acc.receivedCount === acc.totalChunks) {
120
+ var complete = acc.chunks.join('');
121
+ delete this.chunks[chunkId];
122
+ try { this.dispatch(JSON.parse(complete)); } catch (e) {}
123
+ }
124
+ return;
125
+ }
126
+
127
+ this.dispatch(data);
128
+ };
129
+
130
+ WebViewBridge.prototype.dispatch = function (message) {
131
+ var self = this;
132
+ if (message.action === 'batch' && Array.isArray(message.payload)) {
133
+ message.payload.forEach(function (inner) { self.dispatch(inner); });
134
+ return;
135
+ }
136
+
137
+ if (message.type === MessageType.RESPONSE) {
138
+ var payload = message.payload || {};
139
+ var responseId = payload.id || message.id;
140
+ var pending = this.pending[responseId];
141
+ if (!pending) return;
142
+ clearTimeout(pending.timeout);
143
+ delete this.pending[responseId];
144
+ if (payload.success !== false) {
145
+ pending.resolve(payload.data !== undefined ? payload.data : message.payload);
146
+ } else {
147
+ pending.reject(new Error((payload.error && payload.error.message) || 'Unknown error'));
148
+ }
149
+ return;
150
+ }
151
+
152
+ if (message.type === MessageType.REQUEST) {
153
+ var handler = this.handlers[message.action];
154
+ if (!handler) {
155
+ this.sendResponse(message.id, false, null, {
156
+ code: 'HANDLER_NOT_FOUND',
157
+ message: 'No handler registered for action: ' + message.action
158
+ });
159
+ return;
160
+ }
161
+ Promise.resolve()
162
+ .then(function () { return handler(message.payload); })
163
+ .then(function (result) { self.sendResponse(message.id, true, result); })
164
+ .catch(function (err) {
165
+ self.sendResponse(message.id, false, null, {
166
+ code: 'HANDLER_ERROR',
167
+ message: err && err.message ? err.message : 'Unknown error'
168
+ });
169
+ });
170
+ return;
171
+ }
172
+
173
+ if (message.type === MessageType.EVENT) {
174
+ var listeners = this.eventListeners[message.action] || [];
175
+ listeners.forEach(function (listener) {
176
+ try { listener(message.payload); } catch (e) {}
177
+ });
178
+ }
179
+ };
180
+
181
+ window.bridge = new WebViewBridge();
182
+ true;
183
+ })();
184
+ true;
185
+ `;export{WEB_BRIDGE_BOOTSTRAP};//# sourceMappingURL=webBridgeBootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webBridgeBootstrap.js","sources":["../../src/bridge/webBridgeBootstrap.ts"],"sourcesContent":["/**\n * Injected into the WebView before content loads.\n * Exposes window.bridge with request/emit/on/handle and signals BRIDGE_READY.\n *\n * Must end with `true;` for react-native-webview injectedJavaScript.\n */\nexport const WEB_BRIDGE_BOOTSTRAP = `\n(function () {\n if (window.__yantraBridgeInstalled) { true; return; }\n window.__yantraBridgeInstalled = true;\n\n var MessageType = {\n REQUEST: 'REQUEST',\n RESPONSE: 'RESPONSE',\n EVENT: 'EVENT',\n ERROR: 'ERROR',\n CHUNK: 'CHUNK'\n };\n\n function generateId() {\n return Date.now() + '-' + Math.random().toString(36).slice(2, 11);\n }\n\n function postToNative(serialized) {\n if (window.ReactNativeWebView && window.ReactNativeWebView.postMessage) {\n window.ReactNativeWebView.postMessage(serialized);\n }\n }\n\n function WebViewBridge() {\n this.handlers = {};\n this.eventListeners = {};\n this.pending = {};\n this.chunks = {};\n\n var self = this;\n function onMsg(event) {\n self.handleIncoming(event && event.data !== undefined ? event.data : event);\n }\n window.addEventListener('message', onMsg);\n document.addEventListener('message', onMsg);\n\n this.emit('BRIDGE_READY');\n }\n\n WebViewBridge.prototype.sendMessage = function (message) {\n postToNative(JSON.stringify(message));\n };\n\n WebViewBridge.prototype.emit = function (action, payload) {\n this.sendMessage({\n id: generateId(),\n type: MessageType.EVENT,\n action: action,\n payload: payload,\n timestamp: Date.now(),\n version: '1.0'\n });\n };\n\n WebViewBridge.prototype.handle = function (action, handler) {\n this.handlers[action] = handler;\n };\n\n WebViewBridge.prototype.on = function (action, listener) {\n if (!this.eventListeners[action]) this.eventListeners[action] = [];\n this.eventListeners[action].push(listener);\n var self = this;\n return function unsubscribe() {\n self.eventListeners[action] = (self.eventListeners[action] || []).filter(function (l) {\n return l !== listener;\n });\n };\n };\n\n WebViewBridge.prototype.request = function (action, payload, timeoutMs) {\n var self = this;\n var id = generateId();\n var ms = timeoutMs || 10000;\n return new Promise(function (resolve, reject) {\n var timeout = setTimeout(function () {\n delete self.pending[id];\n reject(new Error('Request ' + action + ' timed out'));\n }, ms);\n self.pending[id] = { resolve: resolve, reject: reject, timeout: timeout };\n self.sendMessage({\n id: id,\n type: MessageType.REQUEST,\n action: action,\n payload: payload,\n timestamp: Date.now(),\n version: '1.0'\n });\n });\n };\n\n WebViewBridge.prototype.sendResponse = function (id, success, data, error) {\n this.sendMessage({\n id: id,\n type: MessageType.RESPONSE,\n action: 'response',\n payload: { id: id, success: success, data: data, error: error },\n timestamp: Date.now(),\n version: '1.0'\n });\n };\n\n WebViewBridge.prototype.handleIncoming = function (raw) {\n var data = raw;\n if (typeof raw === 'string') {\n try { data = JSON.parse(raw); } catch (e) { return; }\n }\n if (!data || typeof data !== 'object') return;\n\n if (data.type === MessageType.CHUNK) {\n var chunkId = data.chunkId;\n if (!this.chunks[chunkId]) {\n this.chunks[chunkId] = { chunks: new Array(data.totalChunks), receivedCount: 0, totalChunks: data.totalChunks };\n }\n var acc = this.chunks[chunkId];\n if (acc.chunks[data.chunkIndex] === undefined) {\n acc.chunks[data.chunkIndex] = data.data;\n acc.receivedCount += 1;\n }\n if (acc.receivedCount === acc.totalChunks) {\n var complete = acc.chunks.join('');\n delete this.chunks[chunkId];\n try { this.dispatch(JSON.parse(complete)); } catch (e) {}\n }\n return;\n }\n\n this.dispatch(data);\n };\n\n WebViewBridge.prototype.dispatch = function (message) {\n var self = this;\n if (message.action === 'batch' && Array.isArray(message.payload)) {\n message.payload.forEach(function (inner) { self.dispatch(inner); });\n return;\n }\n\n if (message.type === MessageType.RESPONSE) {\n var payload = message.payload || {};\n var responseId = payload.id || message.id;\n var pending = this.pending[responseId];\n if (!pending) return;\n clearTimeout(pending.timeout);\n delete this.pending[responseId];\n if (payload.success !== false) {\n pending.resolve(payload.data !== undefined ? payload.data : message.payload);\n } else {\n pending.reject(new Error((payload.error && payload.error.message) || 'Unknown error'));\n }\n return;\n }\n\n if (message.type === MessageType.REQUEST) {\n var handler = this.handlers[message.action];\n if (!handler) {\n this.sendResponse(message.id, false, null, {\n code: 'HANDLER_NOT_FOUND',\n message: 'No handler registered for action: ' + message.action\n });\n return;\n }\n Promise.resolve()\n .then(function () { return handler(message.payload); })\n .then(function (result) { self.sendResponse(message.id, true, result); })\n .catch(function (err) {\n self.sendResponse(message.id, false, null, {\n code: 'HANDLER_ERROR',\n message: err && err.message ? err.message : 'Unknown error'\n });\n });\n return;\n }\n\n if (message.type === MessageType.EVENT) {\n var listeners = this.eventListeners[message.action] || [];\n listeners.forEach(function (listener) {\n try { listener(message.payload); } catch (e) {}\n });\n }\n };\n\n window.bridge = new WebViewBridge();\n true;\n})();\ntrue;\n`;\n"],"names":[],"mappings":"AAMO,MAAM,oBAAuB,GAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA"}
@@ -37,10 +37,14 @@ function routeLabel(descriptor, route) {
37
37
  return tail === "Chat" ? "Chat" : tail;
38
38
  }
39
39
  function isVisibleDrawerRoute(route, descriptor) {
40
- var _a, _b;
41
- String((_a = route == null ? void 0 : route.name) != null ? _a : "");
40
+ var _a, _b, _c;
41
+ const routeName = String((_a = route == null ? void 0 : route.name) != null ? _a : "");
42
+ if (routeName.includes("WebBuilder") || routeName.toLowerCase().includes("webbuilder")) {
43
+ return false;
44
+ }
42
45
  const itemStyle = (_b = descriptor == null ? void 0 : descriptor.options) == null ? void 0 : _b.drawerItemStyle;
43
46
  if (itemStyle && itemStyle.display === "none") return false;
47
+ if (((_c = descriptor == null ? void 0 : descriptor.options) == null ? void 0 : _c.hideInMenu) === true) return false;
44
48
  return true;
45
49
  }
46
50
  function getInitials(name) {