@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.
- package/lib/bridge/AuthenticatedFetch.js +77 -0
- package/lib/bridge/AuthenticatedFetch.js.map +1 -0
- package/lib/bridge/BridgeDebugger.js +65 -0
- package/lib/bridge/BridgeDebugger.js.map +1 -0
- package/lib/bridge/CancellableRequest.js +38 -0
- package/lib/bridge/CancellableRequest.js.map +1 -0
- package/lib/bridge/ChunkedMessageHandler.js +71 -0
- package/lib/bridge/ChunkedMessageHandler.js.map +1 -0
- package/lib/bridge/NativeWebViewBridge.js +256 -0
- package/lib/bridge/NativeWebViewBridge.js.map +1 -0
- package/lib/bridge/TypedBridge.js +8 -0
- package/lib/bridge/TypedBridge.js.map +1 -0
- package/lib/bridge/WebViewManager.js +57 -0
- package/lib/bridge/WebViewManager.js.map +1 -0
- package/lib/bridge/handlers/AnalyticsBridgeHandler.js +23 -0
- package/lib/bridge/handlers/AnalyticsBridgeHandler.js.map +1 -0
- package/lib/bridge/handlers/AuthBridgeHandler.js +49 -0
- package/lib/bridge/handlers/AuthBridgeHandler.js.map +1 -0
- package/lib/bridge/handlers/NavigationBridgeHandler.js +62 -0
- package/lib/bridge/handlers/NavigationBridgeHandler.js.map +1 -0
- package/lib/bridge/readAuth0Session.js +51 -0
- package/lib/bridge/readAuth0Session.js.map +1 -0
- package/lib/bridge/resolveMobileWebUrl.js +35 -0
- package/lib/bridge/resolveMobileWebUrl.js.map +1 -0
- package/lib/bridge/types.js +12 -0
- package/lib/bridge/types.js.map +1 -0
- package/lib/bridge/webBridgeBootstrap.js +185 -0
- package/lib/bridge/webBridgeBootstrap.js.map +1 -0
- package/lib/components/CustomDrawer.js +6 -2
- package/lib/components/CustomDrawer.js.map +1 -1
- package/lib/compute.js +54 -1
- package/lib/compute.js.map +1 -1
- package/lib/config/env-config.js +4 -0
- package/lib/config/env-config.js.map +1 -1
- package/lib/hooks/mintSurfaceSystemToken.js +260 -0
- package/lib/hooks/mintSurfaceSystemToken.js.map +1 -0
- package/lib/hooks/useObtainSystemToken.js +76 -0
- package/lib/hooks/useObtainSystemToken.js.map +1 -0
- package/lib/hooks/usePrerequisiteIds.js +97 -54
- package/lib/hooks/usePrerequisiteIds.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/routes.json +55 -0
- package/lib/screens/Chat/index.js +41 -10
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js +31 -11
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/WebBuilder/WebViewWithNavigation.js +20 -0
- package/lib/screens/WebBuilder/WebViewWithNavigation.js.map +1 -0
- package/lib/screens/WebBuilder/index.js +345 -0
- package/lib/screens/WebBuilder/index.js.map +1 -0
- package/lib/theme/mobileTokens.js +3 -1
- package/lib/theme/mobileTokens.js.map +1 -1
- package/package.json +11 -5
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import {jsx,jsxs}from'react/jsx-runtime';import {useRef,useState,useMemo,useEffect,useCallback}from'react';import {useColorScheme,AppState,StyleSheet,View,ActivityIndicator,Text,Pressable,Platform}from'react-native';import {SafeAreaView}from'react-native-safe-area-context';import {WebView}from'react-native-webview';import {useNavigation,useRoute}from'@react-navigation/native';import {config}from'../../config/env-config.js';import {mobileTokens}from'../../theme/mobileTokens.js';import {WebViewManager}from'../../bridge/WebViewManager.js';import {NativeWebViewBridge}from'../../bridge/NativeWebViewBridge.js';import {WEB_BRIDGE_BOOTSTRAP}from'../../bridge/webBridgeBootstrap.js';import {AuthBridgeHandler}from'../../bridge/handlers/AuthBridgeHandler.js';import {NavigationBridgeHandler}from'../../bridge/handlers/NavigationBridgeHandler.js';import {AnalyticsBridgeHandler}from'../../bridge/handlers/AnalyticsBridgeHandler.js';import {getPackagerHost,resolveMobileWebUrl}from'../../bridge/resolveMobileWebUrl.js';import {appendSurfaceAuthParams,buildCdecliTokenInjection,buildSurfaceGateRecoveryScript}from'../../hooks/mintSurfaceSystemToken.js';import {useObtainSystemToken}from'../../hooks/useObtainSystemToken.js';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {WebViewWithNavigation}from'./WebViewWithNavigation.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
function makeHandoffState() {
|
|
21
|
+
return `mobile-webview-${Date.now().toString(36)}`;
|
|
22
|
+
}
|
|
23
|
+
function WebBuilderScreen() {
|
|
24
|
+
var _a;
|
|
25
|
+
const navigation = useNavigation();
|
|
26
|
+
const route = useRoute();
|
|
27
|
+
const colorScheme = useColorScheme();
|
|
28
|
+
const isDark = colorScheme === "dark";
|
|
29
|
+
const webViewRef = useRef(null);
|
|
30
|
+
const bridgeRef = useRef(null);
|
|
31
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
32
|
+
const [hasError, setHasError] = useState(false);
|
|
33
|
+
const [errorDetail, setErrorDetail] = useState(null);
|
|
34
|
+
const [canGoBack, setCanGoBack] = useState(false);
|
|
35
|
+
const [reloadKey, setReloadKey] = useState(0);
|
|
36
|
+
const [authToken, setAuthToken] = useState(null);
|
|
37
|
+
const [authBackend, setAuthBackend] = useState(null);
|
|
38
|
+
const [authState, setAuthState] = useState(() => makeHandoffState());
|
|
39
|
+
const [authReady, setAuthReady] = useState(false);
|
|
40
|
+
const [authError, setAuthError] = useState(null);
|
|
41
|
+
const [mintGeneration, setMintGeneration] = useState(0);
|
|
42
|
+
const {
|
|
43
|
+
orgName,
|
|
44
|
+
projectId,
|
|
45
|
+
tagId
|
|
46
|
+
} = usePrerequisiteIds();
|
|
47
|
+
const {
|
|
48
|
+
obtainSystemToken,
|
|
49
|
+
loading: systemTokenQueryLoading
|
|
50
|
+
} = useObtainSystemToken(true);
|
|
51
|
+
const packagerHost = getPackagerHost();
|
|
52
|
+
const handoffParams = useMemo(() => {
|
|
53
|
+
const params = route == null ? void 0 : route.params;
|
|
54
|
+
const channelId = typeof (params == null ? void 0 : params.channelId) === "string" ? params.channelId.trim() : "";
|
|
55
|
+
const projectIdParam = typeof (params == null ? void 0 : params.projectId) === "string" ? params.projectId.trim() : "";
|
|
56
|
+
const message = typeof (params == null ? void 0 : params.message) === "string" ? params.message.trim() : "";
|
|
57
|
+
return {
|
|
58
|
+
channelId: channelId || null,
|
|
59
|
+
projectId: projectIdParam || null,
|
|
60
|
+
message: message || null
|
|
61
|
+
};
|
|
62
|
+
}, [route == null ? void 0 : route.params]);
|
|
63
|
+
const baseUrl = useMemo(() => {
|
|
64
|
+
var _a2;
|
|
65
|
+
const fromParams = (_a2 = route == null ? void 0 : route.params) == null ? void 0 : _a2.url;
|
|
66
|
+
const raw = typeof fromParams === "string" && fromParams.trim() ? fromParams.trim() : config.WEB_BUILDER_URL;
|
|
67
|
+
const resolved = resolveMobileWebUrl(raw, packagerHost);
|
|
68
|
+
if (!handoffParams.channelId && !handoffParams.message) return resolved;
|
|
69
|
+
try {
|
|
70
|
+
const url = new URL(resolved);
|
|
71
|
+
if (handoffParams.channelId) url.searchParams.set("channelId", handoffParams.channelId);
|
|
72
|
+
if (handoffParams.projectId) url.searchParams.set("projectId", handoffParams.projectId);
|
|
73
|
+
if (handoffParams.message) url.searchParams.set("message", handoffParams.message);
|
|
74
|
+
return url.toString();
|
|
75
|
+
} catch (e) {
|
|
76
|
+
const sep = resolved.includes("?") ? "&" : "?";
|
|
77
|
+
const parts = [];
|
|
78
|
+
if (handoffParams.channelId) parts.push(`channelId=${encodeURIComponent(handoffParams.channelId)}`);
|
|
79
|
+
if (handoffParams.projectId) parts.push(`projectId=${encodeURIComponent(handoffParams.projectId)}`);
|
|
80
|
+
if (handoffParams.message) parts.push(`message=${encodeURIComponent(handoffParams.message)}`);
|
|
81
|
+
return parts.length ? `${resolved}${sep}${parts.join("&")}` : resolved;
|
|
82
|
+
}
|
|
83
|
+
}, [route == null ? void 0 : route.params, packagerHost, handoffParams]);
|
|
84
|
+
const graphqlUrl = useMemo(() => resolveMobileWebUrl(config.GRAPHQL_URL, packagerHost), [packagerHost]);
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
let cancelled = false;
|
|
87
|
+
setAuthReady(false);
|
|
88
|
+
setAuthError(null);
|
|
89
|
+
const handoffState = makeHandoffState();
|
|
90
|
+
setAuthState(handoffState);
|
|
91
|
+
if (__DEV__) {
|
|
92
|
+
console.log("[WebBuilder] surface=", baseUrl, "graphql=", graphqlUrl);
|
|
93
|
+
}
|
|
94
|
+
if (systemTokenQueryLoading) {
|
|
95
|
+
return () => {
|
|
96
|
+
cancelled = true;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
(async () => {
|
|
100
|
+
try {
|
|
101
|
+
const token = await obtainSystemToken();
|
|
102
|
+
if (cancelled) return;
|
|
103
|
+
if (!(token == null ? void 0 : token.trim())) {
|
|
104
|
+
throw new Error("Could not obtain system token via Apollo. Ensure org/project are set (same as chat).");
|
|
105
|
+
}
|
|
106
|
+
if (__DEV__) {
|
|
107
|
+
console.log("[WebBuilder] Apollo system token length=", token.length);
|
|
108
|
+
}
|
|
109
|
+
setAuthToken(token.trim());
|
|
110
|
+
setAuthBackend(graphqlUrl);
|
|
111
|
+
setAuthReady(true);
|
|
112
|
+
} catch (err) {
|
|
113
|
+
if (cancelled) return;
|
|
114
|
+
const message = err instanceof Error ? err.message : "Token mint failed";
|
|
115
|
+
console.warn("[WebBuilder] surface token mint failed:", message);
|
|
116
|
+
setAuthError(message);
|
|
117
|
+
setAuthToken(null);
|
|
118
|
+
setAuthBackend(null);
|
|
119
|
+
setAuthReady(true);
|
|
120
|
+
}
|
|
121
|
+
})();
|
|
122
|
+
return () => {
|
|
123
|
+
cancelled = true;
|
|
124
|
+
};
|
|
125
|
+
}, [baseUrl, graphqlUrl, obtainSystemToken, systemTokenQueryLoading, orgName, projectId, tagId, mintGeneration]);
|
|
126
|
+
const mfeUrl = useMemo(() => {
|
|
127
|
+
if (!authToken) return baseUrl;
|
|
128
|
+
return appendSurfaceAuthParams(baseUrl, authToken, authState);
|
|
129
|
+
}, [baseUrl, authToken, authState]);
|
|
130
|
+
const injectedBeforeContent = useMemo(() => {
|
|
131
|
+
const parts = [WEB_BRIDGE_BOOTSTRAP];
|
|
132
|
+
if (authToken && authBackend) {
|
|
133
|
+
parts.unshift(buildCdecliTokenInjection(authToken, authBackend, authState));
|
|
134
|
+
}
|
|
135
|
+
return parts.join("\n");
|
|
136
|
+
}, [authToken, authBackend, authState]);
|
|
137
|
+
const reinjectAfterLoad = useMemo(() => {
|
|
138
|
+
if (!authToken || !authBackend) return void 0;
|
|
139
|
+
return buildSurfaceGateRecoveryScript(authToken, authBackend, authState);
|
|
140
|
+
}, [authToken, authBackend, authState]);
|
|
141
|
+
const mfeConfig = useMemo(() => ({
|
|
142
|
+
url: mfeUrl,
|
|
143
|
+
cachePolicy: "default"
|
|
144
|
+
}), [mfeUrl]);
|
|
145
|
+
const webViewManager = WebViewManager.getInstance();
|
|
146
|
+
const surfaceColor = isDark ? "#0f172a" : mobileTokens.color.surface;
|
|
147
|
+
const textColor = isDark ? "#f8fafc" : mobileTokens.color.text;
|
|
148
|
+
const mutedColor = isDark ? "#94a3b8" : mobileTokens.color.textMuted;
|
|
149
|
+
useEffect(() => {
|
|
150
|
+
const bridge = new NativeWebViewBridge(webViewRef);
|
|
151
|
+
bridgeRef.current = bridge;
|
|
152
|
+
new AuthBridgeHandler(bridge);
|
|
153
|
+
new NavigationBridgeHandler(bridge, () => navigation);
|
|
154
|
+
new AnalyticsBridgeHandler(bridge);
|
|
155
|
+
return () => {
|
|
156
|
+
bridge.dispose();
|
|
157
|
+
bridgeRef.current = null;
|
|
158
|
+
};
|
|
159
|
+
}, [navigation]);
|
|
160
|
+
useEffect(() => {
|
|
161
|
+
if (!authToken) return;
|
|
162
|
+
const id = mfeConfig.url;
|
|
163
|
+
webViewManager.registerWebView(id, webViewRef);
|
|
164
|
+
return () => {
|
|
165
|
+
webViewManager.unregisterWebView(id);
|
|
166
|
+
};
|
|
167
|
+
}, [authToken, mfeConfig.url, webViewManager]);
|
|
168
|
+
useEffect(() => {
|
|
169
|
+
const handleAppStateChange = (nextAppState) => {
|
|
170
|
+
var _a2, _b;
|
|
171
|
+
if (nextAppState === "background") {
|
|
172
|
+
(_b = (_a2 = webViewRef.current) == null ? void 0 : _a2.clearCache) == null ? void 0 : _b.call(_a2, true);
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
const subscription = AppState.addEventListener("change", handleAppStateChange);
|
|
176
|
+
return () => subscription.remove();
|
|
177
|
+
}, []);
|
|
178
|
+
useEffect(() => {
|
|
179
|
+
if (!authReady || !authToken || hasError) return;
|
|
180
|
+
const timer = setTimeout(() => {
|
|
181
|
+
setIsLoading((loading) => {
|
|
182
|
+
if (!loading) return loading;
|
|
183
|
+
const detail = `Timed out loading ${mfeConfig.url}. Is WEB_BUILDER_URL reachable from this device?`;
|
|
184
|
+
console.warn("[WebBuilder]", detail);
|
|
185
|
+
setErrorDetail(detail);
|
|
186
|
+
setHasError(true);
|
|
187
|
+
return false;
|
|
188
|
+
});
|
|
189
|
+
}, 2e4);
|
|
190
|
+
return () => clearTimeout(timer);
|
|
191
|
+
}, [authReady, authToken, hasError, mfeConfig.url, reloadKey]);
|
|
192
|
+
const handleLoadStart = useCallback(() => {
|
|
193
|
+
setIsLoading(true);
|
|
194
|
+
setHasError(false);
|
|
195
|
+
setErrorDetail(null);
|
|
196
|
+
}, []);
|
|
197
|
+
const handleLoadEnd = useCallback(() => {
|
|
198
|
+
setIsLoading(false);
|
|
199
|
+
webViewManager.updateUsage(mfeConfig.url);
|
|
200
|
+
}, [mfeConfig.url, webViewManager]);
|
|
201
|
+
const handleError = useCallback((event) => {
|
|
202
|
+
const {
|
|
203
|
+
description,
|
|
204
|
+
code,
|
|
205
|
+
url
|
|
206
|
+
} = event.nativeEvent;
|
|
207
|
+
const detail = [description, code != null ? `code ${code}` : null, url || mfeConfig.url].filter(Boolean).join(" \xB7 ");
|
|
208
|
+
if (__DEV__) {
|
|
209
|
+
console.warn("[WebBuilder] load error:", detail);
|
|
210
|
+
}
|
|
211
|
+
setErrorDetail(detail);
|
|
212
|
+
setHasError(true);
|
|
213
|
+
setIsLoading(false);
|
|
214
|
+
}, [mfeConfig.url]);
|
|
215
|
+
const handleHttpError = useCallback((event) => {
|
|
216
|
+
const {
|
|
217
|
+
statusCode,
|
|
218
|
+
description,
|
|
219
|
+
url
|
|
220
|
+
} = event.nativeEvent;
|
|
221
|
+
if (statusCode < 400) return;
|
|
222
|
+
const detail = `HTTP ${statusCode}${description ? `: ${description}` : ""} \xB7 ${url || mfeConfig.url}`;
|
|
223
|
+
if (__DEV__) {
|
|
224
|
+
console.warn("[WebBuilder] http error:", detail);
|
|
225
|
+
}
|
|
226
|
+
setErrorDetail(detail);
|
|
227
|
+
setHasError(true);
|
|
228
|
+
setIsLoading(false);
|
|
229
|
+
}, [mfeConfig.url]);
|
|
230
|
+
const handleMessage = useCallback((event) => {
|
|
231
|
+
var _a2;
|
|
232
|
+
(_a2 = bridgeRef.current) == null ? void 0 : _a2.handleMessage(event);
|
|
233
|
+
}, []);
|
|
234
|
+
const handleNavigationStateChange = useCallback((navState) => {
|
|
235
|
+
setCanGoBack(Boolean(navState.canGoBack));
|
|
236
|
+
}, []);
|
|
237
|
+
const handleRetry = useCallback(() => {
|
|
238
|
+
setHasError(false);
|
|
239
|
+
setErrorDetail(null);
|
|
240
|
+
setAuthError(null);
|
|
241
|
+
setAuthToken(null);
|
|
242
|
+
setAuthBackend(null);
|
|
243
|
+
setIsLoading(true);
|
|
244
|
+
setMintGeneration((g) => g + 1);
|
|
245
|
+
setReloadKey((k) => k + 1);
|
|
246
|
+
}, []);
|
|
247
|
+
const handleNativeGoBack = useCallback(() => {
|
|
248
|
+
if (navigation.canGoBack()) {
|
|
249
|
+
navigation.goBack();
|
|
250
|
+
}
|
|
251
|
+
}, [navigation]);
|
|
252
|
+
const cacheMode = mfeConfig.cachePolicy === "cache-else-load" ? "LOAD_CACHE_ELSE_NETWORK" : "LOAD_DEFAULT";
|
|
253
|
+
const showAuthSpinner = !authReady;
|
|
254
|
+
const showAuthFailure = authReady && !authToken;
|
|
255
|
+
if (showAuthSpinner) {
|
|
256
|
+
return /* @__PURE__ */ jsx(SafeAreaView, { edges: ["left", "right", "bottom"], style: [styles.container, {
|
|
257
|
+
backgroundColor: surfaceColor
|
|
258
|
+
}], children: /* @__PURE__ */ jsxs(View, { style: styles.centered, children: [
|
|
259
|
+
/* @__PURE__ */ jsx(ActivityIndicator, { size: "large", color: mobileTokens.color.primary }),
|
|
260
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.errorBody, {
|
|
261
|
+
color: mutedColor,
|
|
262
|
+
marginTop: 12
|
|
263
|
+
}], children: "Preparing Web Builder\u2026" })
|
|
264
|
+
] }) });
|
|
265
|
+
}
|
|
266
|
+
if (showAuthFailure || hasError) {
|
|
267
|
+
return /* @__PURE__ */ jsx(SafeAreaView, { edges: ["left", "right", "bottom"], style: [styles.container, {
|
|
268
|
+
backgroundColor: surfaceColor
|
|
269
|
+
}], children: /* @__PURE__ */ jsxs(View, { style: styles.centered, children: [
|
|
270
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.errorTitle, {
|
|
271
|
+
color: textColor
|
|
272
|
+
}], children: showAuthFailure ? "Could not open Web Builder" : "Failed to load micro frontend" }),
|
|
273
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.errorBody, {
|
|
274
|
+
color: mutedColor
|
|
275
|
+
}], children: showAuthFailure ? authError || "Sign-in token could not be minted for the surface. Ensure you are logged in with an org." : `Could not open ${baseUrl}. Check WEB_BUILDER_URL / network, then retry.` }),
|
|
276
|
+
errorDetail ? /* @__PURE__ */ jsx(Text, { style: [styles.errorMeta, {
|
|
277
|
+
color: mutedColor
|
|
278
|
+
}], selectable: true, children: errorDetail }) : null,
|
|
279
|
+
/* @__PURE__ */ jsx(Pressable, { onPress: handleRetry, style: [styles.retryButton, {
|
|
280
|
+
backgroundColor: mobileTokens.color.primary
|
|
281
|
+
}], accessibilityRole: "button", accessibilityLabel: "Retry loading WebBuilder", children: /* @__PURE__ */ jsx(Text, { style: styles.retryLabel, children: "Retry" }) })
|
|
282
|
+
] }) });
|
|
283
|
+
}
|
|
284
|
+
return /* @__PURE__ */ jsxs(SafeAreaView, { edges: ["left", "right", "bottom"], style: [styles.container, {
|
|
285
|
+
backgroundColor: surfaceColor
|
|
286
|
+
}], children: [
|
|
287
|
+
/* @__PURE__ */ jsx(WebViewWithNavigation, { webViewRef, canGoBack, onGoBack: handleNativeGoBack }),
|
|
288
|
+
isLoading && /* @__PURE__ */ jsx(View, { style: [styles.loadingOverlay, {
|
|
289
|
+
backgroundColor: surfaceColor
|
|
290
|
+
}], pointerEvents: "none", children: /* @__PURE__ */ jsx(ActivityIndicator, { size: "large", color: mobileTokens.color.primary }) }),
|
|
291
|
+
/* @__PURE__ */ jsx(WebView, __spreadValues({ ref: webViewRef, source: {
|
|
292
|
+
uri: mfeConfig.url
|
|
293
|
+
}, style: styles.webview, onLoadStart: handleLoadStart, onLoadEnd: handleLoadEnd, onError: handleError, onHttpError: handleHttpError, onMessage: handleMessage, onNavigationStateChange: handleNavigationStateChange, injectedJavaScriptBeforeContentLoaded: injectedBeforeContent, injectedJavaScript: reinjectAfterLoad, cacheEnabled: mfeConfig.cachePolicy !== "reload", cacheMode, javaScriptEnabled: true, domStorageEnabled: true, sharedCookiesEnabled: true, thirdPartyCookiesEnabled: true, startInLoadingState: true, scalesPageToFit: true, originWhitelist: ["*"], mixedContentMode: "always", allowsInlineMediaPlayback: false, mediaPlaybackRequiresUserAction: true, setSupportMultipleWindows: false, allowsBackForwardNavigationGestures: true }, Platform.OS === "android" ? {
|
|
294
|
+
overScrollMode: "never"
|
|
295
|
+
} : null), `${reloadKey}-${(_a = authToken == null ? void 0 : authToken.slice(-8)) != null ? _a : "none"}`)
|
|
296
|
+
] });
|
|
297
|
+
}
|
|
298
|
+
const styles = StyleSheet.create({
|
|
299
|
+
container: {
|
|
300
|
+
flex: 1
|
|
301
|
+
},
|
|
302
|
+
webview: {
|
|
303
|
+
flex: 1,
|
|
304
|
+
backgroundColor: "transparent"
|
|
305
|
+
},
|
|
306
|
+
loadingOverlay: __spreadProps(__spreadValues({}, StyleSheet.absoluteFillObject), {
|
|
307
|
+
justifyContent: "center",
|
|
308
|
+
alignItems: "center",
|
|
309
|
+
zIndex: 1e3
|
|
310
|
+
}),
|
|
311
|
+
centered: {
|
|
312
|
+
flex: 1,
|
|
313
|
+
justifyContent: "center",
|
|
314
|
+
alignItems: "center",
|
|
315
|
+
paddingHorizontal: 24,
|
|
316
|
+
gap: 12
|
|
317
|
+
},
|
|
318
|
+
errorTitle: {
|
|
319
|
+
fontSize: 17,
|
|
320
|
+
fontWeight: "600",
|
|
321
|
+
textAlign: "center"
|
|
322
|
+
},
|
|
323
|
+
errorBody: {
|
|
324
|
+
fontSize: 14,
|
|
325
|
+
textAlign: "center",
|
|
326
|
+
marginBottom: 4,
|
|
327
|
+
lineHeight: 20
|
|
328
|
+
},
|
|
329
|
+
errorMeta: {
|
|
330
|
+
fontSize: 12,
|
|
331
|
+
textAlign: "center",
|
|
332
|
+
marginBottom: 8,
|
|
333
|
+
lineHeight: 16
|
|
334
|
+
},
|
|
335
|
+
retryButton: {
|
|
336
|
+
paddingHorizontal: 20,
|
|
337
|
+
paddingVertical: 12,
|
|
338
|
+
borderRadius: mobileTokens.radius.md
|
|
339
|
+
},
|
|
340
|
+
retryLabel: {
|
|
341
|
+
color: "#ffffff",
|
|
342
|
+
fontSize: 15,
|
|
343
|
+
fontWeight: "600"
|
|
344
|
+
}
|
|
345
|
+
});export{WebBuilderScreen as default};//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/screens/WebBuilder/index.tsx"],"sourcesContent":["/**\n * WebBuilder — native shell hosting the webbuilder-surface WebView.\n *\n * Mints the org system JWT (same as CDeCLI) and hands it to the surface via\n * `?token=&state=` (SurfaceLoginGate.captureLoginCallback) + localStorage\n * `cdecli_token`, so the standalone \"Sign in with Yantra\" gate is skipped.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n AppState,\n type AppStateStatus,\n Platform,\n Pressable,\n StyleSheet,\n Text,\n useColorScheme,\n View,\n} from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\nimport {\n WebView,\n type WebViewMessageEvent,\n type WebViewNavigation,\n type WebViewErrorEvent,\n type WebViewHttpErrorEvent,\n} from 'react-native-webview';\nimport { useNavigation, useRoute } from '@react-navigation/native';\nimport { config } from '../../config/env-config';\nimport { mobileTokens } from '../../theme/mobileTokens';\nimport {\n AnalyticsBridgeHandler,\n AuthBridgeHandler,\n getPackagerHost,\n NativeWebViewBridge,\n NavigationBridgeHandler,\n resolveMobileWebUrl,\n WEB_BRIDGE_BOOTSTRAP,\n WebViewManager,\n} from '../../bridge';\nimport {\n appendSurfaceAuthParams,\n buildCdecliTokenInjection,\n buildSurfaceGateRecoveryScript,\n} from '../../hooks/mintSurfaceSystemToken';\nimport { useObtainSystemToken } from '../../hooks/useObtainSystemToken';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { WebViewWithNavigation } from './WebViewWithNavigation';\n\nexport type MicroFrontendCachePolicy = 'default' | 'reload' | 'cache-else-load';\n\nexport interface MicroFrontendConfig {\n url: string;\n preload?: boolean;\n cachePolicy?: MicroFrontendCachePolicy;\n}\n\nexport interface WebBuilderRouteParams {\n orgName?: string | null;\n /** Optional override URL; defaults to WEB_BUILDER_URL from env. */\n url?: string | null;\n /** Channel to open / continue in the surface (`?channelId=`). */\n channelId?: string | null;\n /** Yantra project UUID (`?projectId=`). Defaults to channelId on the surface if omitted. */\n projectId?: string | null;\n /** Optional first Agent prompt to auto-send after hydrate (`?message=`). */\n message?: string | null;\n}\n\nfunction makeHandoffState(): string {\n return `mobile-webview-${Date.now().toString(36)}`;\n}\n\nexport default function WebBuilderScreen() {\n const navigation = useNavigation<any>();\n const route = useRoute<any>();\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n\n const webViewRef = useRef<WebView>(null);\n const bridgeRef = useRef<NativeWebViewBridge | null>(null);\n\n const [isLoading, setIsLoading] = useState(true);\n const [hasError, setHasError] = useState(false);\n const [errorDetail, setErrorDetail] = useState<string | null>(null);\n const [canGoBack, setCanGoBack] = useState(false);\n const [reloadKey, setReloadKey] = useState(0);\n const [authToken, setAuthToken] = useState<string | null>(null);\n const [authBackend, setAuthBackend] = useState<string | null>(null);\n const [authState, setAuthState] = useState<string>(() => makeHandoffState());\n const [authReady, setAuthReady] = useState(false);\n const [authError, setAuthError] = useState<string | null>(null);\n const [mintGeneration, setMintGeneration] = useState(0);\n\n const { orgName, projectId, tagId } = usePrerequisiteIds();\n // Same Apollo session the rest of the app uses (web harness pastes this JWT).\n // Raw fetch + SecureStore Auth0 Bearer gets 401 on local GraphQL; Apollo does not.\n const { obtainSystemToken, loading: systemTokenQueryLoading } = useObtainSystemToken(true);\n\n const packagerHost = getPackagerHost();\n\n const handoffParams = useMemo(() => {\n const params = route?.params as WebBuilderRouteParams | undefined;\n const channelId = typeof params?.channelId === 'string' ? params.channelId.trim() : '';\n const projectIdParam = typeof params?.projectId === 'string' ? params.projectId.trim() : '';\n const message = typeof params?.message === 'string' ? params.message.trim() : '';\n return {\n channelId: channelId || null,\n projectId: projectIdParam || null,\n message: message || null,\n };\n }, [route?.params]);\n\n const baseUrl = useMemo(() => {\n const fromParams = (route?.params as WebBuilderRouteParams | undefined)?.url;\n const raw = typeof fromParams === 'string' && fromParams.trim() ? fromParams.trim() : config.WEB_BUILDER_URL;\n const resolved = resolveMobileWebUrl(raw, packagerHost);\n // Stamp Chat → Build handoff before auth params so the surface can deep-link.\n if (!handoffParams.channelId && !handoffParams.message) return resolved;\n try {\n const url = new URL(resolved);\n if (handoffParams.channelId) url.searchParams.set('channelId', handoffParams.channelId);\n if (handoffParams.projectId) url.searchParams.set('projectId', handoffParams.projectId);\n if (handoffParams.message) url.searchParams.set('message', handoffParams.message);\n return url.toString();\n } catch {\n const sep = resolved.includes('?') ? '&' : '?';\n const parts: string[] = [];\n if (handoffParams.channelId) parts.push(`channelId=${encodeURIComponent(handoffParams.channelId)}`);\n if (handoffParams.projectId) parts.push(`projectId=${encodeURIComponent(handoffParams.projectId)}`);\n if (handoffParams.message) parts.push(`message=${encodeURIComponent(handoffParams.message)}`);\n return parts.length ? `${resolved}${sep}${parts.join('&')}` : resolved;\n }\n }, [route?.params, packagerHost, handoffParams]);\n\n /** Same GRAPHQL_URL the rest of the app uses — rewritten for device LAN. */\n const graphqlUrl = useMemo(() => resolveMobileWebUrl(config.GRAPHQL_URL, packagerHost), [packagerHost]);\n\n useEffect(() => {\n let cancelled = false;\n setAuthReady(false);\n setAuthError(null);\n const handoffState = makeHandoffState();\n setAuthState(handoffState);\n\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.log('[WebBuilder] surface=', baseUrl, 'graphql=', graphqlUrl);\n }\n\n // Wait for org/project (and initial GetUserSystemToken) so create/reveal can succeed.\n if (systemTokenQueryLoading) {\n return () => {\n cancelled = true;\n };\n }\n\n (async () => {\n try {\n const token = await obtainSystemToken();\n if (cancelled) return;\n if (!token?.trim()) {\n throw new Error(\n 'Could not obtain system token via Apollo. Ensure org/project are set (same as chat).',\n );\n }\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.log('[WebBuilder] Apollo system token length=', token.length);\n }\n setAuthToken(token.trim());\n setAuthBackend(graphqlUrl);\n setAuthReady(true);\n } catch (err) {\n if (cancelled) return;\n const message = err instanceof Error ? err.message : 'Token mint failed';\n // eslint-disable-next-line no-console\n console.warn('[WebBuilder] surface token mint failed:', message);\n setAuthError(message);\n setAuthToken(null);\n setAuthBackend(null);\n setAuthReady(true);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [baseUrl, graphqlUrl, obtainSystemToken, systemTokenQueryLoading, orgName, projectId, tagId, mintGeneration]);\n\n const mfeUrl = useMemo(() => {\n if (!authToken) return baseUrl;\n return appendSurfaceAuthParams(baseUrl, authToken, authState);\n }, [baseUrl, authToken, authState]);\n\n const injectedBeforeContent = useMemo(() => {\n const parts = [WEB_BRIDGE_BOOTSTRAP];\n if (authToken && authBackend) {\n parts.unshift(buildCdecliTokenInjection(authToken, authBackend, authState));\n }\n return parts.join('\\n');\n }, [authToken, authBackend, authState]);\n\n /** If the SPA still shows the login gate after load, force one handoff reload. */\n const reinjectAfterLoad = useMemo(() => {\n if (!authToken || !authBackend) return undefined;\n return buildSurfaceGateRecoveryScript(authToken, authBackend, authState);\n }, [authToken, authBackend, authState]);\n\n const mfeConfig: MicroFrontendConfig = useMemo(\n () => ({\n url: mfeUrl,\n cachePolicy: 'default',\n }),\n [mfeUrl],\n );\n\n const webViewManager = WebViewManager.getInstance();\n const surfaceColor = isDark ? '#0f172a' : mobileTokens.color.surface;\n const textColor = isDark ? '#f8fafc' : mobileTokens.color.text;\n const mutedColor = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n\n // Bridge + service handlers\n useEffect(() => {\n const bridge = new NativeWebViewBridge(webViewRef);\n bridgeRef.current = bridge;\n // eslint-disable-next-line no-new\n new AuthBridgeHandler(bridge);\n // eslint-disable-next-line no-new\n new NavigationBridgeHandler(bridge, () => navigation);\n // eslint-disable-next-line no-new\n new AnalyticsBridgeHandler(bridge);\n\n return () => {\n bridge.dispose();\n bridgeRef.current = null;\n };\n }, [navigation]);\n\n useEffect(() => {\n if (!authToken) return;\n const id = mfeConfig.url;\n webViewManager.registerWebView(id, webViewRef);\n return () => {\n webViewManager.unregisterWebView(id);\n };\n }, [authToken, mfeConfig.url, webViewManager]);\n\n useEffect(() => {\n const handleAppStateChange = (nextAppState: AppStateStatus) => {\n if (nextAppState === 'background') {\n webViewRef.current?.clearCache?.(true);\n }\n };\n const subscription = AppState.addEventListener('change', handleAppStateChange);\n return () => subscription.remove();\n }, []);\n\n useEffect(() => {\n if (!authReady || !authToken || hasError) return;\n const timer = setTimeout(() => {\n setIsLoading((loading) => {\n if (!loading) return loading;\n const detail = `Timed out loading ${mfeConfig.url}. Is WEB_BUILDER_URL reachable from this device?`;\n // eslint-disable-next-line no-console\n console.warn('[WebBuilder]', detail);\n setErrorDetail(detail);\n setHasError(true);\n return false;\n });\n }, 20000);\n return () => clearTimeout(timer);\n }, [authReady, authToken, hasError, mfeConfig.url, reloadKey]);\n\n const handleLoadStart = useCallback(() => {\n setIsLoading(true);\n setHasError(false);\n setErrorDetail(null);\n }, []);\n\n const handleLoadEnd = useCallback(() => {\n setIsLoading(false);\n webViewManager.updateUsage(mfeConfig.url);\n }, [mfeConfig.url, webViewManager]);\n\n const handleError = useCallback(\n (event: WebViewErrorEvent) => {\n const { description, code, url } = event.nativeEvent;\n const detail = [description, code != null ? `code ${code}` : null, url || mfeConfig.url]\n .filter(Boolean)\n .join(' · ');\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[WebBuilder] load error:', detail);\n }\n setErrorDetail(detail);\n setHasError(true);\n setIsLoading(false);\n },\n [mfeConfig.url],\n );\n\n const handleHttpError = useCallback(\n (event: WebViewHttpErrorEvent) => {\n const { statusCode, description, url } = event.nativeEvent;\n if (statusCode < 400) return;\n const detail = `HTTP ${statusCode}${description ? `: ${description}` : ''} · ${url || mfeConfig.url}`;\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[WebBuilder] http error:', detail);\n }\n setErrorDetail(detail);\n setHasError(true);\n setIsLoading(false);\n },\n [mfeConfig.url],\n );\n\n const handleMessage = useCallback((event: WebViewMessageEvent) => {\n bridgeRef.current?.handleMessage(event);\n }, []);\n\n const handleNavigationStateChange = useCallback((navState: WebViewNavigation) => {\n setCanGoBack(Boolean(navState.canGoBack));\n }, []);\n\n const handleRetry = useCallback(() => {\n setHasError(false);\n setErrorDetail(null);\n setAuthError(null);\n setAuthToken(null);\n setAuthBackend(null);\n setIsLoading(true);\n setMintGeneration((g) => g + 1);\n setReloadKey((k) => k + 1);\n }, []);\n\n const handleNativeGoBack = useCallback(() => {\n if (navigation.canGoBack()) {\n navigation.goBack();\n }\n }, [navigation]);\n\n const cacheMode =\n mfeConfig.cachePolicy === 'cache-else-load' ? ('LOAD_CACHE_ELSE_NETWORK' as const) : ('LOAD_DEFAULT' as const);\n\n const showAuthSpinner = !authReady;\n const showAuthFailure = authReady && !authToken;\n\n if (showAuthSpinner) {\n return (\n <SafeAreaView\n edges={['left', 'right', 'bottom']}\n style={[styles.container, { backgroundColor: surfaceColor }]}\n >\n <View style={styles.centered}>\n <ActivityIndicator size=\"large\" color={mobileTokens.color.primary} />\n <Text style={[styles.errorBody, { color: mutedColor, marginTop: 12 }]}>Preparing Web Builder…</Text>\n </View>\n </SafeAreaView>\n );\n }\n\n if (showAuthFailure || hasError) {\n return (\n <SafeAreaView\n edges={['left', 'right', 'bottom']}\n style={[styles.container, { backgroundColor: surfaceColor }]}\n >\n <View style={styles.centered}>\n <Text style={[styles.errorTitle, { color: textColor }]}>\n {showAuthFailure ? 'Could not open Web Builder' : 'Failed to load micro frontend'}\n </Text>\n <Text style={[styles.errorBody, { color: mutedColor }]}>\n {showAuthFailure\n ? authError ||\n 'Sign-in token could not be minted for the surface. Ensure you are logged in with an org.'\n : `Could not open ${baseUrl}. Check WEB_BUILDER_URL / network, then retry.`}\n </Text>\n {errorDetail ? (\n <Text style={[styles.errorMeta, { color: mutedColor }]} selectable>\n {errorDetail}\n </Text>\n ) : null}\n <Pressable\n onPress={handleRetry}\n style={[styles.retryButton, { backgroundColor: mobileTokens.color.primary }]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Retry loading WebBuilder\"\n >\n <Text style={styles.retryLabel}>Retry</Text>\n </Pressable>\n </View>\n </SafeAreaView>\n );\n }\n\n return (\n <SafeAreaView edges={['left', 'right', 'bottom']} style={[styles.container, { backgroundColor: surfaceColor }]}>\n <WebViewWithNavigation webViewRef={webViewRef} canGoBack={canGoBack} onGoBack={handleNativeGoBack} />\n\n {isLoading && (\n <View style={[styles.loadingOverlay, { backgroundColor: surfaceColor }]} pointerEvents=\"none\">\n <ActivityIndicator size=\"large\" color={mobileTokens.color.primary} />\n </View>\n )}\n\n <WebView\n key={`${reloadKey}-${authToken?.slice(-8) ?? 'none'}`}\n ref={webViewRef}\n source={{\n uri: mfeConfig.url,\n }}\n style={styles.webview}\n onLoadStart={handleLoadStart}\n onLoadEnd={handleLoadEnd}\n onError={handleError}\n onHttpError={handleHttpError}\n onMessage={handleMessage}\n onNavigationStateChange={handleNavigationStateChange}\n injectedJavaScriptBeforeContentLoaded={injectedBeforeContent}\n injectedJavaScript={reinjectAfterLoad}\n cacheEnabled={mfeConfig.cachePolicy !== 'reload'}\n cacheMode={cacheMode}\n javaScriptEnabled\n domStorageEnabled\n sharedCookiesEnabled\n thirdPartyCookiesEnabled\n startInLoadingState\n scalesPageToFit\n originWhitelist={['*']}\n mixedContentMode=\"always\"\n allowsInlineMediaPlayback={false}\n mediaPlaybackRequiresUserAction\n setSupportMultipleWindows={false}\n allowsBackForwardNavigationGestures\n {...(Platform.OS === 'android' ? { overScrollMode: 'never' as const } : null)}\n />\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n webview: {\n flex: 1,\n backgroundColor: 'transparent',\n },\n loadingOverlay: {\n ...StyleSheet.absoluteFillObject,\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 1000,\n },\n centered: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n paddingHorizontal: 24,\n gap: 12,\n },\n errorTitle: {\n fontSize: 17,\n fontWeight: '600',\n textAlign: 'center',\n },\n errorBody: {\n fontSize: 14,\n textAlign: 'center',\n marginBottom: 4,\n lineHeight: 20,\n },\n errorMeta: {\n fontSize: 12,\n textAlign: 'center',\n marginBottom: 8,\n lineHeight: 16,\n },\n retryButton: {\n paddingHorizontal: 20,\n paddingVertical: 12,\n borderRadius: mobileTokens.radius.md,\n },\n retryLabel: {\n color: '#ffffff',\n fontSize: 15,\n fontWeight: '600',\n },\n});\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mobileTokens.js","sources":["../../src/theme/mobileTokens.ts"],"sourcesContent":["export const mobileTokens = {\n color: {\n bg: '#f8fafc',\n surface: '#ffffff',\n surfaceMuted: '#f1f5f9',\n border: '#e2e8f0',\n text: '#0f172a',\n textMuted: '#475569',\n primary: '#4f46e5',\n primarySoft: '#eef2ff',\n primaryBorder: '#c7d2fe',\n successSoft: '#ecfdf5',\n successText: '#047857',\n warningSoft: '#fffbeb',\n warningText: '#b45309',\n dangerSoft: '#fef2f2',\n dangerText: '#b91c1c',\n },\n radius: {\n sm: 10,\n md: 14,\n lg: 18,\n pill: 999,\n },\n shadow: {\n card: {\n shadowColor: '#0f172a',\n shadowOpacity: 0.06,\n shadowRadius: 10,\n shadowOffset: { width: 0, height: 4 },\n elevation: 2,\n },\n },\n} as const;\n"],"names":[],"mappings":"AAAO,MAAM,YAAe,GAAA;AAAA,EAC1B,KAAO,EAAA;AAAA,IACL,EAAI,EAAA,SAAA;AAAA,IACJ,OAAS,EAAA,SAAA;AAAA,IACT,YAAc,EAAA,SAAA;AAAA,IACd,MAAQ,EAAA,SAAA;AAAA,IACR,IAAM,EAAA,SAAA;AAAA,IACN,SAAW,EAAA,SAAA;AAAA,IACX,OAAS,EAAA,SAAA;AAAA,IACT,WAAa,EAAA,SAAA;AAAA,IACb,aAAe,EAAA,SAAA;AAAA,IACf,WAAa,EAAA,SAAA;AAAA,IACb,WAAa,EAAA,SAAA;AAAA,IACb,WAAa,EAAA,SAAA;AAAA,IACb,WAAa,EAAA,SAAA;AAAA,IACb,UAAY,EAAA,SAAA;AAAA,IACZ,UAAY,EAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"mobileTokens.js","sources":["../../src/theme/mobileTokens.ts"],"sourcesContent":["export const mobileTokens = {\n color: {\n bg: '#f8fafc',\n surface: '#ffffff',\n surfaceMuted: '#f1f5f9',\n border: '#e2e8f0',\n text: '#0f172a',\n textMuted: '#475569',\n primary: '#4f46e5',\n primarySoft: '#eef2ff',\n primaryBorder: '#c7d2fe',\n successSoft: '#ecfdf5',\n successText: '#047857',\n warningSoft: '#fffbeb',\n warningText: '#b45309',\n dangerSoft: '#fef2f2',\n dangerText: '#b91c1c',\n },\n radius: {\n sm: 10,\n md: 14,\n lg: 18,\n pill: 999,\n },\n shadow: {\n card: {\n shadowColor: '#0f172a',\n shadowOpacity: 0.06,\n shadowRadius: 10,\n shadowOffset: { width: 0, height: 4 },\n elevation: 2,\n },\n },\n} as const;\n"],"names":[],"mappings":"AAAO,MAAM,YAAe,GAAA;AAAA,EAC1B,KAAO,EAAA;AAAA,IACL,EAAI,EAAA,SAAA;AAAA,IACJ,OAAS,EAAA,SAAA;AAAA,IACT,YAAc,EAAA,SAAA;AAAA,IACd,MAAQ,EAAA,SAAA;AAAA,IACR,IAAM,EAAA,SAAA;AAAA,IACN,SAAW,EAAA,SAAA;AAAA,IACX,OAAS,EAAA,SAAA;AAAA,IACT,WAAa,EAAA,SAAA;AAAA,IACb,aAAe,EAAA,SAAA;AAAA,IACf,WAAa,EAAA,SAAA;AAAA,IACb,WAAa,EAAA,SAAA;AAAA,IACb,WAAa,EAAA,SAAA;AAAA,IACb,WAAa,EAAA,SAAA;AAAA,IACb,UAAY,EAAA,SAAA;AAAA,IACZ,UAAY,EAAA;AAAA,GACd;AAAA,EACA,MAAQ,EAAA;AAAA,IAEN,EAAI,EAAA,EAGN,CAaF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminide-stack/yantra-mobile",
|
|
3
|
-
"version": "12.0.32
|
|
3
|
+
"version": "12.0.32",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"uuid": "^9.0.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"common": "12.0.32
|
|
28
|
+
"common": "^12.0.32"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
31
31
|
"@admin-layout/gluestack-ui-mobile": "*",
|
|
@@ -40,8 +40,14 @@
|
|
|
40
40
|
"@expo/vector-icons": "*",
|
|
41
41
|
"@messenger-box/platform-mobile": "*",
|
|
42
42
|
"@react-native-async-storage/async-storage": "*",
|
|
43
|
-
"
|
|
44
|
-
"
|
|
43
|
+
"@react-navigation/native": "*",
|
|
44
|
+
"common": "12.0.31",
|
|
45
|
+
"expo-constants": "*",
|
|
46
|
+
"expo-secure-store": "*",
|
|
47
|
+
"lodash": "*",
|
|
48
|
+
"react-native": "*",
|
|
49
|
+
"react-native-safe-area-context": "*",
|
|
50
|
+
"react-native-webview": "*"
|
|
45
51
|
},
|
|
46
52
|
"publishConfig": {
|
|
47
53
|
"access": "public"
|
|
@@ -49,5 +55,5 @@
|
|
|
49
55
|
"typescript": {
|
|
50
56
|
"definition": "lib/index.d.ts"
|
|
51
57
|
},
|
|
52
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "0046cee6de2088c70b0196af3c79ead24e989836"
|
|
53
59
|
}
|