@adminide-stack/yantra-mobile 12.0.28-alpha.51 → 12.0.28-alpha.58

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 (55) hide show
  1. package/lib/assets/icon.png +0 -0
  2. package/lib/components/CustomDrawer.js +358 -0
  3. package/lib/components/CustomDrawer.js.map +1 -0
  4. package/lib/components/GatewayToolbarButtonMobile.js +84 -0
  5. package/lib/components/GatewayToolbarButtonMobile.js.map +1 -0
  6. package/lib/components/YantraBrandLoader.js +94 -0
  7. package/lib/components/YantraBrandLoader.js.map +1 -0
  8. package/lib/compute.js +37 -5
  9. package/lib/compute.js.map +1 -1
  10. package/lib/config/constants.js +16 -0
  11. package/lib/config/constants.js.map +1 -0
  12. package/lib/config/env-config.js +74 -19
  13. package/lib/config/env-config.js.map +1 -1
  14. package/lib/contexts/GatewayContext.js +77 -0
  15. package/lib/contexts/GatewayContext.js.map +1 -0
  16. package/lib/graphql/agentGatewayDocuments.js +53 -0
  17. package/lib/graphql/agentGatewayDocuments.js.map +1 -0
  18. package/lib/hooks/useCdecliAutoConnect.js +219 -0
  19. package/lib/hooks/useCdecliAutoConnect.js.map +1 -0
  20. package/lib/hooks/useCdecliChannel.js +226 -0
  21. package/lib/hooks/useCdecliChannel.js.map +1 -0
  22. package/lib/hooks/useChatApi.js +220 -170
  23. package/lib/hooks/useChatApi.js.map +1 -1
  24. package/lib/hooks/useChatStream.js +232 -58
  25. package/lib/hooks/useChatStream.js.map +1 -1
  26. package/lib/hooks/useGatewayConnection.js +123 -0
  27. package/lib/hooks/useGatewayConnection.js.map +1 -0
  28. package/lib/hooks/useGatewayRegistry.js +28 -0
  29. package/lib/hooks/useGatewayRegistry.js.map +1 -0
  30. package/lib/hooks/usePrerequisiteIds.js +122 -0
  31. package/lib/hooks/usePrerequisiteIds.js.map +1 -0
  32. package/lib/hooks/useWorkspaceProvisioner.js +236 -0
  33. package/lib/hooks/useWorkspaceProvisioner.js.map +1 -0
  34. package/lib/index.js +1 -1
  35. package/lib/index.js.map +1 -1
  36. package/lib/routes.json +8 -5
  37. package/lib/screens/Home/HomeScreen.js +420 -97
  38. package/lib/screens/Home/HomeScreen.js.map +1 -1
  39. package/lib/screens/Home/components/ChatHistoryLanding.js +229 -0
  40. package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -0
  41. package/lib/screens/Home/components/DeepSearchModal.js +334 -0
  42. package/lib/screens/Home/components/DeepSearchModal.js.map +1 -0
  43. package/lib/screens/Home/deepSearchUtils.js +41 -0
  44. package/lib/screens/Home/deepSearchUtils.js.map +1 -0
  45. package/lib/screens/NewChat/index.js +75 -0
  46. package/lib/screens/NewChat/index.js.map +1 -0
  47. package/lib/services/agentSessionManager.js +451 -0
  48. package/lib/services/agentSessionManager.js.map +1 -0
  49. package/lib/services/gatewayApiKeyBridge.js +4 -0
  50. package/lib/services/gatewayApiKeyBridge.js.map +1 -0
  51. package/lib/services/gatewayClient.js +470 -0
  52. package/lib/services/gatewayClient.js.map +1 -0
  53. package/lib/utils/gatewaySelectionStorage.js +21 -0
  54. package/lib/utils/gatewaySelectionStorage.js.map +1 -0
  55. package/package.json +7 -3
Binary file
@@ -0,0 +1,358 @@
1
+ import {jsx,jsxs}from'react/jsx-runtime';import {useMemo,useCallback}from'react';import {StyleSheet,View,Image,Pressable}from'react-native';import {DrawerContentScrollView}from'@react-navigation/drawer';import {Ionicons}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';import {useRoute}from'@react-navigation/native';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {useDispatch,useSelector}from'react-redux';import {logoutAndRedirect,userSelector}from'@adminide-stack/user-auth0-client';import {useAccountProfileQuery}from'common/graphql';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
+ const APP_ICON = require("../assets/icon.png");
21
+ const PALETTE = {
22
+ bg: "#ffffff",
23
+ surface: "#ffffff",
24
+ border: "#e5e7eb",
25
+ text: "#111827",
26
+ textSecondary: "#6b7280",
27
+ icon: "#4b5563",
28
+ rowHighlight: "#f3f4f6"
29
+ };
30
+ function routeLabel(descriptor, route) {
31
+ var _a, _b, _c;
32
+ const optLabel = (_a = descriptor == null ? void 0 : descriptor.options) == null ? void 0 : _a.drawerLabel;
33
+ if (typeof optLabel === "string" && optLabel.trim()) return optLabel;
34
+ const title = (_b = descriptor == null ? void 0 : descriptor.options) == null ? void 0 : _b.title;
35
+ if (typeof title === "string" && title.trim()) return title;
36
+ const tail = String((_c = route == null ? void 0 : route.name) != null ? _c : "").split(".").pop() || "Route";
37
+ return tail === "Chat" ? "Chat" : tail;
38
+ }
39
+ function isVisibleDrawerRoute(route, descriptor) {
40
+ var _a, _b;
41
+ String((_a = route == null ? void 0 : route.name) != null ? _a : "");
42
+ const itemStyle = (_b = descriptor == null ? void 0 : descriptor.options) == null ? void 0 : _b.drawerItemStyle;
43
+ if (itemStyle && itemStyle.display === "none") return false;
44
+ return true;
45
+ }
46
+ function pickPrimaryDisplayName(authUser) {
47
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
48
+ const u = authUser;
49
+ const p = u == null ? void 0 : u.profile;
50
+ const email = ((_b = (_a = p == null ? void 0 : p.email) != null ? _a : u == null ? void 0 : u.email) != null ? _b : "").trim();
51
+ const emailLower = email.toLowerCase();
52
+ const given = ((_d = (_c = p == null ? void 0 : p.given_name) != null ? _c : u == null ? void 0 : u.givenName) != null ? _d : "").trim();
53
+ const family = ((_f = (_e = p == null ? void 0 : p.family_name) != null ? _e : u == null ? void 0 : u.familyName) != null ? _f : "").trim();
54
+ const fromParts = [given, family].filter(Boolean).join(" ").trim();
55
+ if (fromParts) return fromParts;
56
+ const nickname = ((_h = (_g = p == null ? void 0 : p.nickname) != null ? _g : u == null ? void 0 : u.nickname) != null ? _h : "").trim();
57
+ const legalName = ((_j = (_i = p == null ? void 0 : p.name) != null ? _i : u == null ? void 0 : u.name) != null ? _j : "").trim();
58
+ const legalLower = legalName.toLowerCase();
59
+ if (legalName && legalLower !== emailLower) return legalName;
60
+ if (nickname) return nickname;
61
+ if (legalName) return legalName;
62
+ const local = email.includes("@") ? ((_k = email.split("@")[0]) != null ? _k : "").trim() : "";
63
+ return local || "Account";
64
+ }
65
+ function pickAuthEmail(authUser) {
66
+ var _a, _b, _c;
67
+ const u = authUser;
68
+ return ((_c = (_b = (_a = u == null ? void 0 : u.profile) == null ? void 0 : _a.email) != null ? _b : u == null ? void 0 : u.email) != null ? _c : "").trim();
69
+ }
70
+ function pickAuthPicture(authUser) {
71
+ var _a, _b;
72
+ const u = authUser;
73
+ const pic = (_b = (_a = u == null ? void 0 : u.profile) == null ? void 0 : _a.picture) != null ? _b : u == null ? void 0 : u.picture;
74
+ return typeof pic === "string" && pic.trim() ? pic.trim() : null;
75
+ }
76
+ function DrawerProfileHeader() {
77
+ var _a;
78
+ const authUser = useSelector(userSelector);
79
+ const {
80
+ data: profileData
81
+ } = useAccountProfileQuery({
82
+ fetchPolicy: "cache-first",
83
+ errorPolicy: "all"
84
+ });
85
+ const photoUrl = useMemo(() => {
86
+ var _a2, _b, _c;
87
+ const fromProfile = (_c = (_b = (_a2 = profileData == null ? void 0 : profileData.accountProfile) == null ? void 0 : _a2.photos) == null ? void 0 : _b.find((p) => p == null ? void 0 : p.url)) == null ? void 0 : _c.url;
88
+ if (fromProfile) return fromProfile;
89
+ return pickAuthPicture(authUser);
90
+ }, [(_a = profileData == null ? void 0 : profileData.accountProfile) == null ? void 0 : _a.photos, authUser]);
91
+ const displayName = useMemo(() => pickPrimaryDisplayName(authUser), [authUser]);
92
+ const email = useMemo(() => pickAuthEmail(authUser), [authUser]);
93
+ const subtitle = useMemo(() => {
94
+ var _a2, _b, _c;
95
+ const u = authUser;
96
+ const nick = ((_c = (_b = (_a2 = u == null ? void 0 : u.profile) == null ? void 0 : _a2.nickname) != null ? _b : u == null ? void 0 : u.nickname) != null ? _c : "").trim();
97
+ if (!nick || nick === displayName.trim()) return null;
98
+ return `@${nick.replace(/^@/, "")}`;
99
+ }, [authUser, displayName]);
100
+ return /* @__PURE__ */ jsx(View, { style: styles.profileCard, children: /* @__PURE__ */ jsxs(View, { style: styles.profileCardInner, children: [
101
+ /* @__PURE__ */ jsx(View, { style: styles.avatarOuter, children: photoUrl ? /* @__PURE__ */ jsx(Image, { source: {
102
+ uri: photoUrl
103
+ }, style: styles.avatarImage, resizeMode: "cover" }) : /* @__PURE__ */ jsx(View, { style: styles.avatarPlaceholder, children: /* @__PURE__ */ jsx(Ionicons, { name: "person", size: 28, color: PALETTE.icon }) }) }),
104
+ /* @__PURE__ */ jsxs(View, { style: styles.profileMeta, children: [
105
+ /* @__PURE__ */ jsx(Text, { style: styles.profileName, numberOfLines: 2, children: displayName }),
106
+ subtitle ? /* @__PURE__ */ jsx(Text, { style: styles.profileUsername, numberOfLines: 1, children: subtitle }) : null,
107
+ email ? /* @__PURE__ */ jsx(Text, { style: styles.profileEmail, numberOfLines: 1, children: email }) : null
108
+ ] })
109
+ ] }) });
110
+ }
111
+ function CustomDrawer(props) {
112
+ var _a;
113
+ const {
114
+ state,
115
+ descriptors,
116
+ navigation
117
+ } = props;
118
+ const showLogout = props.logout !== false;
119
+ const dispatch = useDispatch();
120
+ const route = useRoute();
121
+ const insets = useSafeAreaInsets();
122
+ const visibleRoutes = ((_a = state == null ? void 0 : state.routes) != null ? _a : []).filter((r) => isVisibleDrawerRoute(r, descriptors == null ? void 0 : descriptors[r.key]));
123
+ const scrollContentStyle = useMemo(() => [styles.contentWrap, {
124
+ // Drawer scroll views often don't reserve status-bar space reliably — combine inset + breathing room.
125
+ paddingTop: Math.max(insets.top, 14) + 10
126
+ }], [insets.top]);
127
+ const handleLogout = useCallback(() => {
128
+ var _a2;
129
+ (_a2 = navigation == null ? void 0 : navigation.closeDrawer) == null ? void 0 : _a2.call(navigation);
130
+ dispatch(logoutAndRedirect());
131
+ }, [dispatch, navigation]);
132
+ return /* @__PURE__ */ jsx(SafeAreaView, { style: styles.safeArea, edges: ["left", "bottom"], children: /* @__PURE__ */ jsxs(View, { style: styles.drawerColumn, children: [
133
+ /* @__PURE__ */ jsxs(DrawerContentScrollView, __spreadProps(__spreadValues({}, props), { style: styles.scroll, contentContainerStyle: scrollContentStyle, children: [
134
+ /* @__PURE__ */ jsx(View, { style: styles.brandBlock, children: /* @__PURE__ */ jsxs(View, { style: styles.brandStrip, children: [
135
+ /* @__PURE__ */ jsx(Image, { source: APP_ICON, style: styles.brandIconSmall, resizeMode: "contain" }),
136
+ /* @__PURE__ */ jsx(Text, { style: styles.brandStripTitle, children: "Yantra" })
137
+ ] }) }),
138
+ /* @__PURE__ */ jsx(DrawerProfileHeader, {}),
139
+ /* @__PURE__ */ jsx(Text, { style: styles.sectionLabel, children: "Menu" }),
140
+ /* @__PURE__ */ jsx(View, { style: styles.menuGroup, children: visibleRoutes.map((r) => {
141
+ var _a2, _b;
142
+ const descriptor = descriptors == null ? void 0 : descriptors[r.key];
143
+ const focused = (state == null ? void 0 : state.index) === ((_a2 = state == null ? void 0 : state.routes) == null ? void 0 : _a2.findIndex((x) => x.key === r.key));
144
+ const label = routeLabel(descriptor, r);
145
+ const iconFn = (_b = descriptor == null ? void 0 : descriptor.options) == null ? void 0 : _b.drawerIcon;
146
+ return /* @__PURE__ */ jsxs(Pressable, { accessibilityRole: "button", accessibilityState: {
147
+ selected: focused
148
+ }, onPress: () => {
149
+ var _a3;
150
+ const params = ((_a3 = route == null ? void 0 : route.params) == null ? void 0 : _a3.orgName) ? {
151
+ orgName: route.params.orgName
152
+ } : void 0;
153
+ navigation.navigate(r.name, params);
154
+ }, style: ({
155
+ pressed
156
+ }) => [styles.navRow, focused ? styles.navRowFocused : styles.navRowIdle, pressed && styles.navRowPressed], children: [
157
+ /* @__PURE__ */ jsx(View, { style: [styles.navIconCircle, focused ? styles.navIconCircleFocused : styles.navIconCircleIdle], children: typeof iconFn === "function" ? iconFn({
158
+ color: focused ? PALETTE.text : PALETTE.icon,
159
+ size: 22,
160
+ focused
161
+ }) : /* @__PURE__ */ jsx(Ionicons, { name: label.trim().toLowerCase() === "chat" ? "chatbubbles-outline" : "home-outline", size: 22, color: focused ? PALETTE.text : PALETTE.icon }) }),
162
+ /* @__PURE__ */ jsx(Text, { style: [styles.navLabel, focused && styles.navLabelFocused], children: label }),
163
+ /* @__PURE__ */ jsx(Ionicons, { name: "chevron-forward", size: 18, color: "#9ca3af", style: styles.navChevron })
164
+ ] }, r.key);
165
+ }) })
166
+ ] })),
167
+ showLogout ? /* @__PURE__ */ jsx(View, { style: styles.logoutFooter, children: /* @__PURE__ */ jsxs(Pressable, { onPress: handleLogout, accessibilityRole: "button", accessibilityLabel: "Log out", style: ({
168
+ pressed
169
+ }) => [styles.logoutButton, pressed && styles.logoutButtonPressed], children: [
170
+ /* @__PURE__ */ jsx(View, { style: styles.logoutIconCircle, children: /* @__PURE__ */ jsx(Ionicons, { name: "log-out-outline", size: 20, color: "#b91c1c" }) }),
171
+ /* @__PURE__ */ jsx(Text, { style: styles.logoutLabel, children: "Log out" })
172
+ ] }) }) : null
173
+ ] }) });
174
+ }
175
+ const styles = StyleSheet.create({
176
+ safeArea: {
177
+ flex: 1,
178
+ backgroundColor: PALETTE.bg
179
+ },
180
+ drawerColumn: {
181
+ flex: 1
182
+ },
183
+ scroll: {
184
+ flex: 1
185
+ },
186
+ contentWrap: {
187
+ flexGrow: 1,
188
+ paddingBottom: 24,
189
+ paddingHorizontal: 18
190
+ },
191
+ brandBlock: {
192
+ marginBottom: 16,
193
+ paddingBottom: 14,
194
+ borderBottomWidth: StyleSheet.hairlineWidth,
195
+ borderBottomColor: PALETTE.border
196
+ },
197
+ brandStrip: {
198
+ flexDirection: "row",
199
+ alignItems: "center",
200
+ gap: 12
201
+ },
202
+ brandIconSmall: {
203
+ width: 36,
204
+ height: 36,
205
+ borderRadius: 10
206
+ },
207
+ brandStripTitle: {
208
+ color: PALETTE.text,
209
+ fontSize: 22,
210
+ fontWeight: "800",
211
+ letterSpacing: -0.6
212
+ },
213
+ profileCard: {
214
+ borderRadius: 12,
215
+ overflow: "hidden",
216
+ marginBottom: 20,
217
+ backgroundColor: PALETTE.surface,
218
+ borderWidth: StyleSheet.hairlineWidth,
219
+ borderColor: PALETTE.border
220
+ },
221
+ profileCardInner: {
222
+ flexDirection: "row",
223
+ padding: 16,
224
+ gap: 14
225
+ },
226
+ avatarOuter: {
227
+ width: 56,
228
+ height: 56,
229
+ borderRadius: 28,
230
+ overflow: "hidden",
231
+ borderWidth: StyleSheet.hairlineWidth,
232
+ borderColor: PALETTE.border,
233
+ backgroundColor: PALETTE.rowHighlight
234
+ },
235
+ avatarImage: {
236
+ width: "100%",
237
+ height: "100%"
238
+ },
239
+ avatarPlaceholder: {
240
+ flex: 1,
241
+ alignItems: "center",
242
+ justifyContent: "center",
243
+ backgroundColor: PALETTE.rowHighlight
244
+ },
245
+ profileMeta: {
246
+ flex: 1,
247
+ minWidth: 0,
248
+ justifyContent: "center"
249
+ },
250
+ profileName: {
251
+ fontSize: 19,
252
+ fontWeight: "600",
253
+ color: PALETTE.text,
254
+ letterSpacing: -0.3,
255
+ lineHeight: 24
256
+ },
257
+ profileUsername: {
258
+ marginTop: 4,
259
+ fontSize: 14,
260
+ fontWeight: "500",
261
+ color: PALETTE.textSecondary,
262
+ letterSpacing: -0.1
263
+ },
264
+ profileEmail: {
265
+ marginTop: 6,
266
+ fontSize: 13,
267
+ fontWeight: "400",
268
+ color: PALETTE.textSecondary
269
+ },
270
+ sectionLabel: {
271
+ fontSize: 11,
272
+ fontWeight: "600",
273
+ color: "#9ca3af",
274
+ textTransform: "uppercase",
275
+ letterSpacing: 0.6,
276
+ marginBottom: 8,
277
+ marginLeft: 2
278
+ },
279
+ menuGroup: {
280
+ gap: 8
281
+ },
282
+ navRow: {
283
+ flexDirection: "row",
284
+ alignItems: "center",
285
+ paddingVertical: 12,
286
+ paddingHorizontal: 14,
287
+ borderRadius: 10,
288
+ gap: 12
289
+ },
290
+ navRowIdle: {
291
+ backgroundColor: PALETTE.surface
292
+ },
293
+ navRowFocused: {
294
+ backgroundColor: PALETTE.rowHighlight
295
+ },
296
+ navRowPressed: {
297
+ opacity: 0.88
298
+ },
299
+ navIconCircle: {
300
+ width: 40,
301
+ height: 40,
302
+ borderRadius: 12,
303
+ alignItems: "center",
304
+ justifyContent: "center"
305
+ },
306
+ navIconCircleIdle: {
307
+ backgroundColor: "transparent"
308
+ },
309
+ navIconCircleFocused: {
310
+ backgroundColor: "transparent"
311
+ },
312
+ navLabel: {
313
+ flex: 1,
314
+ fontSize: 16,
315
+ fontWeight: "500",
316
+ color: PALETTE.text
317
+ },
318
+ navLabelFocused: {
319
+ fontWeight: "600",
320
+ color: PALETTE.text
321
+ },
322
+ navChevron: {
323
+ marginLeft: "auto"
324
+ },
325
+ logoutFooter: {
326
+ borderTopWidth: StyleSheet.hairlineWidth,
327
+ borderTopColor: PALETTE.border,
328
+ paddingHorizontal: 18,
329
+ paddingTop: 10,
330
+ paddingBottom: 8,
331
+ backgroundColor: PALETTE.surface
332
+ },
333
+ logoutButton: {
334
+ flexDirection: "row",
335
+ alignItems: "center",
336
+ gap: 12,
337
+ paddingVertical: 12,
338
+ paddingHorizontal: 12,
339
+ borderRadius: 14
340
+ },
341
+ logoutIconCircle: {
342
+ width: 40,
343
+ height: 40,
344
+ borderRadius: 12,
345
+ backgroundColor: "#fef2f2",
346
+ alignItems: "center",
347
+ justifyContent: "center"
348
+ },
349
+ logoutButtonPressed: {
350
+ opacity: 0.75,
351
+ backgroundColor: "#fef2f2"
352
+ },
353
+ logoutLabel: {
354
+ fontSize: 16,
355
+ fontWeight: "600",
356
+ color: "#b91c1c"
357
+ }
358
+ });export{CustomDrawer as default};//# sourceMappingURL=CustomDrawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomDrawer.js","sources":["../../src/components/CustomDrawer.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from 'react';\nimport { Image, Pressable, StyleSheet, View } from 'react-native';\nimport { DrawerContentScrollView } from '@react-navigation/drawer';\nimport { Ionicons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { useRoute } from '@react-navigation/native';\nimport { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { useDispatch, useSelector } from 'react-redux';\nimport type { IUserState } from '@adminide-stack/core';\nimport { Store, logoutAndRedirect, userSelector } from '@adminide-stack/user-auth0-client';\nimport { useAccountProfileQuery } from 'common/graphql';\n\nconst APP_ICON = require('../assets/icon.png');\n\n/** Standard neutral drawer (iOS/Material-like): lets the logo stay the only strong color accent. */\nconst PALETTE = {\n bg: '#ffffff',\n surface: '#ffffff',\n border: '#e5e7eb',\n text: '#111827',\n textSecondary: '#6b7280',\n icon: '#4b5563',\n rowHighlight: '#f3f4f6',\n} as const;\n\nfunction routeLabel(descriptor: any, route: any): string {\n const optLabel = descriptor?.options?.drawerLabel;\n if (typeof optLabel === 'string' && optLabel.trim()) return optLabel;\n const title = descriptor?.options?.title;\n if (typeof title === 'string' && title.trim()) return title;\n const tail =\n String(route?.name ?? '')\n .split('.')\n .pop() || 'Route';\n return tail === 'Chat' ? 'Chat' : tail;\n}\n\nfunction isVisibleDrawerRoute(route: any, descriptor: any): boolean {\n const routeName = String(route?.name ?? '');\n const itemStyle = descriptor?.options?.drawerItemStyle as any;\n if (itemStyle && itemStyle.display === 'none') return false;\n return true;\n}\n\n/** Auth0 / Redux user slice exposes OIDC claims under `profile` (see terminal authUser shape). */\ntype Auth0ProfileClaims = {\n email?: string;\n name?: string;\n nickname?: string;\n picture?: string;\n given_name?: string;\n family_name?: string;\n};\n\nfunction pickPrimaryDisplayName(authUser: IUserState | null | undefined): string {\n const u = authUser as IUserState & {\n profile?: Auth0ProfileClaims;\n givenName?: string;\n familyName?: string;\n name?: string;\n nickname?: string;\n email?: string;\n };\n const p = u?.profile;\n const email = (p?.email ?? u?.email ?? '').trim();\n const emailLower = email.toLowerCase();\n\n const given = (p?.given_name ?? u?.givenName ?? '').trim();\n const family = (p?.family_name ?? u?.familyName ?? '').trim();\n /** 1) Full / partial legal name from given + family (given-only counts). */\n const fromParts = [given, family].filter(Boolean).join(' ').trim();\n if (fromParts) return fromParts;\n\n const nickname = (p?.nickname ?? u?.nickname ?? '').trim();\n const legalName = (p?.name ?? u?.name ?? '').trim();\n const legalLower = legalName.toLowerCase();\n\n /** 2) OIDC `name` when it is not just the email (often a proper display name). */\n if (legalName && legalLower !== emailLower) return legalName;\n\n /** 3) Username / nickname. */\n if (nickname) return nickname;\n\n /** 4) Fallback to `name` even when it duplicates email. */\n if (legalName) return legalName;\n\n const local = email.includes('@') ? (email.split('@')[0] ?? '').trim() : '';\n return local || 'Account';\n}\n\nfunction pickAuthEmail(authUser: IUserState | null | undefined): string {\n const u = authUser as IUserState & { profile?: Auth0ProfileClaims; email?: string };\n return (u?.profile?.email ?? u?.email ?? '').trim();\n}\n\nfunction pickAuthPicture(authUser: IUserState | null | undefined): string | null {\n const u = authUser as IUserState & { profile?: Auth0ProfileClaims; picture?: string };\n const pic = u?.profile?.picture ?? u?.picture;\n return typeof pic === 'string' && pic.trim() ? pic.trim() : null;\n}\n\nfunction DrawerProfileHeader() {\n const authUser = useSelector<Store.Auth, IUserState>(userSelector);\n const { data: profileData } = useAccountProfileQuery({\n fetchPolicy: 'cache-first',\n errorPolicy: 'all',\n });\n\n const photoUrl = useMemo(() => {\n const fromProfile = profileData?.accountProfile?.photos?.find((p) => p?.url)?.url;\n if (fromProfile) return fromProfile;\n return pickAuthPicture(authUser);\n }, [profileData?.accountProfile?.photos, authUser]);\n\n const displayName = useMemo(() => pickPrimaryDisplayName(authUser), [authUser]);\n\n const email = useMemo(() => pickAuthEmail(authUser), [authUser]);\n\n const subtitle = useMemo(() => {\n const u = authUser as IUserState & { profile?: Auth0ProfileClaims; nickname?: string };\n const nick = (u?.profile?.nickname ?? u?.nickname ?? '').trim();\n if (!nick || nick === displayName.trim()) return null;\n return `@${nick.replace(/^@/, '')}`;\n }, [authUser, displayName]);\n\n return (\n <View style={styles.profileCard}>\n <View style={styles.profileCardInner}>\n <View style={styles.avatarOuter}>\n {photoUrl ? (\n <Image source={{ uri: photoUrl }} style={styles.avatarImage} resizeMode=\"cover\" />\n ) : (\n <View style={styles.avatarPlaceholder}>\n <Ionicons name=\"person\" size={28} color={PALETTE.icon} />\n </View>\n )}\n </View>\n <View style={styles.profileMeta}>\n <Text style={styles.profileName} numberOfLines={2}>\n {displayName}\n </Text>\n {subtitle ? (\n <Text style={styles.profileUsername} numberOfLines={1}>\n {subtitle}\n </Text>\n ) : null}\n {email ? (\n <Text style={styles.profileEmail} numberOfLines={1}>\n {email}\n </Text>\n ) : null}\n </View>\n </View>\n </View>\n );\n}\n\nexport default function CustomDrawer(props: any) {\n const { state, descriptors, navigation } = props;\n /** Mirrors layout settings from `navigation.js` (`defaultHeaderProps.logout`). */\n const showLogout = props.logout !== false;\n const dispatch = useDispatch();\n const route = useRoute<any>();\n const insets = useSafeAreaInsets();\n const visibleRoutes = (state?.routes ?? []).filter((r: any) => isVisibleDrawerRoute(r, descriptors?.[r.key]));\n\n const scrollContentStyle = useMemo(\n () => [\n styles.contentWrap,\n {\n // Drawer scroll views often don't reserve status-bar space reliably — combine inset + breathing room.\n paddingTop: Math.max(insets.top, 14) + 10,\n },\n ],\n [insets.top],\n );\n\n const handleLogout = useCallback(() => {\n navigation?.closeDrawer?.();\n dispatch(logoutAndRedirect());\n }, [dispatch, navigation]);\n\n return (\n <SafeAreaView style={styles.safeArea} edges={['left', 'bottom']}>\n <View style={styles.drawerColumn}>\n <DrawerContentScrollView {...props} style={styles.scroll} contentContainerStyle={scrollContentStyle}>\n <View style={styles.brandBlock}>\n <View style={styles.brandStrip}>\n <Image source={APP_ICON} style={styles.brandIconSmall} resizeMode=\"contain\" />\n <Text style={styles.brandStripTitle}>Yantra</Text>\n </View>\n </View>\n\n <DrawerProfileHeader />\n\n <Text style={styles.sectionLabel}>Menu</Text>\n <View style={styles.menuGroup}>\n {visibleRoutes.map((r: any) => {\n const descriptor = descriptors?.[r.key];\n const focused = state?.index === state?.routes?.findIndex((x: any) => x.key === r.key);\n const label = routeLabel(descriptor, r);\n const iconFn = descriptor?.options?.drawerIcon;\n\n return (\n <Pressable\n key={r.key}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: focused }}\n onPress={() => {\n const params = route?.params?.orgName\n ? { orgName: route.params.orgName }\n : undefined;\n navigation.navigate(r.name, params);\n }}\n style={({ pressed }) => [\n styles.navRow,\n focused ? styles.navRowFocused : styles.navRowIdle,\n pressed && styles.navRowPressed,\n ]}\n >\n <View\n style={[\n styles.navIconCircle,\n focused ? styles.navIconCircleFocused : styles.navIconCircleIdle,\n ]}\n >\n {typeof iconFn === 'function' ? (\n iconFn({\n color: focused ? PALETTE.text : PALETTE.icon,\n size: 22,\n focused,\n })\n ) : (\n <Ionicons\n name={\n label.trim().toLowerCase() === 'chat'\n ? 'chatbubbles-outline'\n : 'home-outline'\n }\n size={22}\n color={focused ? PALETTE.text : PALETTE.icon}\n />\n )}\n </View>\n <Text style={[styles.navLabel, focused && styles.navLabelFocused]}>{label}</Text>\n <Ionicons\n name=\"chevron-forward\"\n size={18}\n color=\"#9ca3af\"\n style={styles.navChevron}\n />\n </Pressable>\n );\n })}\n </View>\n </DrawerContentScrollView>\n\n {showLogout ? (\n <View style={styles.logoutFooter}>\n <Pressable\n onPress={handleLogout}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Log out\"\n style={({ pressed }) => [styles.logoutButton, pressed && styles.logoutButtonPressed]}\n >\n <View style={styles.logoutIconCircle}>\n <Ionicons name=\"log-out-outline\" size={20} color=\"#b91c1c\" />\n </View>\n <Text style={styles.logoutLabel}>Log out</Text>\n </Pressable>\n </View>\n ) : null}\n </View>\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n safeArea: {\n flex: 1,\n backgroundColor: PALETTE.bg,\n },\n drawerColumn: {\n flex: 1,\n },\n scroll: {\n flex: 1,\n },\n contentWrap: {\n flexGrow: 1,\n paddingBottom: 24,\n paddingHorizontal: 18,\n },\n brandBlock: {\n marginBottom: 16,\n paddingBottom: 14,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: PALETTE.border,\n },\n brandStrip: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n },\n brandIconSmall: {\n width: 36,\n height: 36,\n borderRadius: 10,\n },\n brandStripTitle: {\n color: PALETTE.text,\n fontSize: 22,\n fontWeight: '800',\n letterSpacing: -0.6,\n },\n profileCard: {\n borderRadius: 12,\n overflow: 'hidden',\n marginBottom: 20,\n backgroundColor: PALETTE.surface,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: PALETTE.border,\n },\n profileCardInner: {\n flexDirection: 'row',\n padding: 16,\n gap: 14,\n },\n avatarOuter: {\n width: 56,\n height: 56,\n borderRadius: 28,\n overflow: 'hidden',\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: PALETTE.border,\n backgroundColor: PALETTE.rowHighlight,\n },\n avatarImage: {\n width: '100%',\n height: '100%',\n },\n avatarPlaceholder: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: PALETTE.rowHighlight,\n },\n profileMeta: {\n flex: 1,\n minWidth: 0,\n justifyContent: 'center',\n },\n profileName: {\n fontSize: 19,\n fontWeight: '600',\n color: PALETTE.text,\n letterSpacing: -0.3,\n lineHeight: 24,\n },\n profileUsername: {\n marginTop: 4,\n fontSize: 14,\n fontWeight: '500',\n color: PALETTE.textSecondary,\n letterSpacing: -0.1,\n },\n profileEmail: {\n marginTop: 6,\n fontSize: 13,\n fontWeight: '400',\n color: PALETTE.textSecondary,\n },\n sectionLabel: {\n fontSize: 11,\n fontWeight: '600',\n color: '#9ca3af',\n textTransform: 'uppercase',\n letterSpacing: 0.6,\n marginBottom: 8,\n marginLeft: 2,\n },\n menuGroup: {\n gap: 8,\n },\n navRow: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n paddingHorizontal: 14,\n borderRadius: 10,\n gap: 12,\n },\n navRowIdle: {\n backgroundColor: PALETTE.surface,\n },\n navRowFocused: {\n backgroundColor: PALETTE.rowHighlight,\n },\n navRowPressed: {\n opacity: 0.88,\n },\n navIconCircle: {\n width: 40,\n height: 40,\n borderRadius: 12,\n alignItems: 'center',\n justifyContent: 'center',\n },\n navIconCircleIdle: {\n backgroundColor: 'transparent',\n },\n navIconCircleFocused: {\n backgroundColor: 'transparent',\n },\n navLabel: {\n flex: 1,\n fontSize: 16,\n fontWeight: '500',\n color: PALETTE.text,\n },\n navLabelFocused: {\n fontWeight: '600',\n color: PALETTE.text,\n },\n navChevron: {\n marginLeft: 'auto',\n },\n logoutFooter: {\n borderTopWidth: StyleSheet.hairlineWidth,\n borderTopColor: PALETTE.border,\n paddingHorizontal: 18,\n paddingTop: 10,\n paddingBottom: 8,\n backgroundColor: PALETTE.surface,\n },\n logoutButton: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n paddingVertical: 12,\n paddingHorizontal: 12,\n borderRadius: 14,\n },\n logoutIconCircle: {\n width: 40,\n height: 40,\n borderRadius: 12,\n backgroundColor: '#fef2f2',\n alignItems: 'center',\n justifyContent: 'center',\n },\n logoutButtonPressed: {\n opacity: 0.75,\n backgroundColor: '#fef2f2',\n },\n logoutLabel: {\n fontSize: 16,\n fontWeight: '600',\n color: '#b91c1c',\n },\n});\n"],"names":["_a"],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import {jsx,jsxs}from'react/jsx-runtime';import {View,StyleSheet,Pressable,ActivityIndicator,Text}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';function toneStyles(status, tone) {
2
+ if (tone === "provisioning") {
3
+ return {
4
+ bg: "#e0efff",
5
+ border: "#93c5fd",
6
+ text: "#1d4ed8"
7
+ };
8
+ }
9
+ if (tone === "workspace-error") {
10
+ return {
11
+ bg: "#fee2e2",
12
+ border: "#fecaca",
13
+ text: "#b91c1c"
14
+ };
15
+ }
16
+ if (status === "connected") return {
17
+ bg: "#ecfdf5",
18
+ border: "#6ee7b7",
19
+ text: "#047857"
20
+ };
21
+ if (status === "connecting") return {
22
+ bg: "#fffbeb",
23
+ border: "#fcd34d",
24
+ text: "#b45309"
25
+ };
26
+ if (status === "error") return {
27
+ bg: "#fef2f2",
28
+ border: "#fecaca",
29
+ text: "#b91c1c"
30
+ };
31
+ return {
32
+ bg: "#f4f4f5",
33
+ border: "#d4d4d8",
34
+ text: "#3f3f46"
35
+ };
36
+ }
37
+ function GatewayToolbarButtonMobile({
38
+ gatewayStatus,
39
+ gatewayError,
40
+ onToggleGateway,
41
+ disabled,
42
+ statusLabel,
43
+ tone = "default"
44
+ }) {
45
+ const colors = toneStyles(gatewayStatus, tone);
46
+ const mainTitle = gatewayStatus === "connected" ? "Disconnect gateway" : gatewayError || "Connect to workspace gateway";
47
+ return /* @__PURE__ */ jsx(View, { style: styles.wrap, children: /* @__PURE__ */ jsxs(Pressable, { onPress: onToggleGateway, disabled, accessibilityLabel: mainTitle, style: ({
48
+ pressed
49
+ }) => [styles.mainBtn, {
50
+ backgroundColor: colors.bg,
51
+ borderColor: colors.border
52
+ }, pressed && styles.pressed, disabled && styles.disabled], children: [
53
+ gatewayStatus === "connecting" ? /* @__PURE__ */ jsx(ActivityIndicator, { size: "small", color: colors.text }) : /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: gatewayStatus === "connected" ? "wifi" : "wifi-off", size: 18, color: colors.text }),
54
+ /* @__PURE__ */ jsx(Text, { style: [styles.label, {
55
+ color: colors.text
56
+ }], children: statusLabel != null ? statusLabel : "Gateway" })
57
+ ] }) });
58
+ }
59
+ const styles = StyleSheet.create({
60
+ wrap: {
61
+ marginRight: 6
62
+ },
63
+ mainBtn: {
64
+ flexDirection: "row",
65
+ alignItems: "center",
66
+ gap: 6,
67
+ height: 34,
68
+ paddingHorizontal: 8,
69
+ borderRadius: 8,
70
+ borderWidth: 1,
71
+ minWidth: 86,
72
+ justifyContent: "flex-start"
73
+ },
74
+ pressed: {
75
+ opacity: 0.75
76
+ },
77
+ disabled: {
78
+ opacity: 0.45
79
+ },
80
+ label: {
81
+ fontSize: 12,
82
+ fontWeight: "600"
83
+ }
84
+ });export{GatewayToolbarButtonMobile};//# sourceMappingURL=GatewayToolbarButtonMobile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GatewayToolbarButtonMobile.js","sources":["../../src/components/GatewayToolbarButtonMobile.tsx"],"sourcesContent":["/**\n * Connect/disconnect + gateway provider picker — mirrors web\n * `GatewayToolbarButton` for React Native header usage.\n */\n\nimport React from 'react';\nimport { ActivityIndicator, Pressable, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\n\nexport type GatewayToolbarMobileStatus = 'connected' | 'connecting' | 'disconnected' | 'error';\n\nexport interface GatewayToolbarButtonMobileProps {\n gatewayStatus: GatewayToolbarMobileStatus;\n gatewayError?: string | null;\n onToggleGateway: () => void;\n disabled?: boolean;\n /** Replaces the \"Gateway\" label, e.g. \"Setting up...\" */\n statusLabel?: string;\n /** Visual override when workspace (not link status) is provisioning / error */\n tone?: 'default' | 'provisioning' | 'workspace-error';\n}\n\nfunction toneStyles(status: GatewayToolbarMobileStatus, tone: GatewayToolbarButtonMobileProps['tone']) {\n if (tone === 'provisioning') {\n return { bg: '#e0efff', border: '#93c5fd', text: '#1d4ed8' };\n }\n if (tone === 'workspace-error') {\n return { bg: '#fee2e2', border: '#fecaca', text: '#b91c1c' };\n }\n if (status === 'connected') return { bg: '#ecfdf5', border: '#6ee7b7', text: '#047857' };\n if (status === 'connecting') return { bg: '#fffbeb', border: '#fcd34d', text: '#b45309' };\n if (status === 'error') return { bg: '#fef2f2', border: '#fecaca', text: '#b91c1c' };\n return { bg: '#f4f4f5', border: '#d4d4d8', text: '#3f3f46' };\n}\n\nexport function GatewayToolbarButtonMobile({\n gatewayStatus,\n gatewayError,\n onToggleGateway,\n disabled,\n statusLabel,\n tone = 'default',\n}: GatewayToolbarButtonMobileProps) {\n const colors = toneStyles(gatewayStatus, tone);\n\n const mainTitle =\n gatewayStatus === 'connected' ? 'Disconnect gateway' : gatewayError || 'Connect to workspace gateway';\n\n return (\n <View style={styles.wrap}>\n <Pressable\n onPress={onToggleGateway}\n disabled={disabled}\n accessibilityLabel={mainTitle}\n style={({ pressed }) => [\n styles.mainBtn,\n { backgroundColor: colors.bg, borderColor: colors.border },\n pressed && styles.pressed,\n disabled && styles.disabled,\n ]}\n >\n {gatewayStatus === 'connecting' ? (\n <ActivityIndicator size=\"small\" color={colors.text} />\n ) : (\n <MaterialCommunityIcons\n name={gatewayStatus === 'connected' ? 'wifi' : 'wifi-off'}\n size={18}\n color={colors.text}\n />\n )}\n <Text style={[styles.label, { color: colors.text }]}>{statusLabel ?? 'Gateway'}</Text>\n </Pressable>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: { marginRight: 6 },\n mainBtn: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n height: 34,\n paddingHorizontal: 8,\n borderRadius: 8,\n borderWidth: 1,\n minWidth: 86,\n justifyContent: 'flex-start',\n },\n pressed: { opacity: 0.75 },\n disabled: { opacity: 0.45 },\n label: { fontSize: 12, fontWeight: '600' },\n});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {useRef,useMemo,useEffect}from'react';import {Animated,Easing,View,StyleSheet,Image}from'react-native';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
+ const ICON = require("../assets/icon.png");
21
+ const YANTRA_LOADER_SIZE_DEFAULT = 72;
22
+ const YANTRA_LOADER_SIZE_COMPACT = 40;
23
+ const BASE = YANTRA_LOADER_SIZE_DEFAULT;
24
+ const RING = 62;
25
+ const ICON_SZ = 34;
26
+ function YantraBrandLoader({
27
+ size = BASE
28
+ }) {
29
+ const spin = useRef(new Animated.Value(0)).current;
30
+ const scale = size / BASE;
31
+ const ringLayout = useMemo(() => {
32
+ const ringSize2 = RING * scale;
33
+ const inset2 = (size - ringSize2) / 2;
34
+ return {
35
+ ringSize: ringSize2,
36
+ inset: inset2
37
+ };
38
+ }, [size, scale]);
39
+ useEffect(() => {
40
+ const loop = Animated.loop(Animated.timing(spin, {
41
+ toValue: 1,
42
+ duration: 1100,
43
+ easing: Easing.linear,
44
+ useNativeDriver: true
45
+ }));
46
+ loop.start();
47
+ return () => loop.stop();
48
+ }, [spin]);
49
+ const rotate = spin.interpolate({
50
+ inputRange: [0, 1],
51
+ outputRange: ["0deg", "360deg"]
52
+ });
53
+ const {
54
+ ringSize,
55
+ inset
56
+ } = ringLayout;
57
+ const ringBorder = Math.max(2, Math.round(3 * scale));
58
+ return /* @__PURE__ */ jsxs(View, { style: [styles.wrap, {
59
+ width: size,
60
+ height: size
61
+ }], children: [
62
+ /* @__PURE__ */ jsx(Animated.View, { style: [styles.ring, {
63
+ width: ringSize,
64
+ height: ringSize,
65
+ borderRadius: ringSize / 2,
66
+ borderWidth: ringBorder,
67
+ top: inset,
68
+ left: inset,
69
+ transform: [{
70
+ rotate
71
+ }]
72
+ }] }),
73
+ /* @__PURE__ */ jsx(View, { style: styles.iconWrap, children: /* @__PURE__ */ jsx(Image, { source: ICON, style: {
74
+ width: ICON_SZ * scale,
75
+ height: ICON_SZ * scale
76
+ }, resizeMode: "contain", accessibilityIgnoresInvertColors: true }) })
77
+ ] });
78
+ }
79
+ const styles = StyleSheet.create({
80
+ wrap: {
81
+ alignItems: "center",
82
+ justifyContent: "center"
83
+ },
84
+ ring: {
85
+ position: "absolute",
86
+ borderColor: "#e5e7eb",
87
+ borderTopColor: "#111827",
88
+ borderRightColor: "#6b7280"
89
+ },
90
+ iconWrap: __spreadProps(__spreadValues({}, StyleSheet.absoluteFillObject), {
91
+ alignItems: "center",
92
+ justifyContent: "center"
93
+ })
94
+ });export{YANTRA_LOADER_SIZE_COMPACT,YANTRA_LOADER_SIZE_DEFAULT,YantraBrandLoader};//# sourceMappingURL=YantraBrandLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YantraBrandLoader.js","sources":["../../src/components/YantraBrandLoader.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef } from 'react';\nimport { Animated, Easing, Image, StyleSheet, View } from 'react-native';\n\nconst ICON = require('../assets/icon.png');\n\n/** Default outer size for full-screen / landing loaders */\nexport const YANTRA_LOADER_SIZE_DEFAULT = 72;\n/** Compact size for composer “sending…” overlay */\nexport const YANTRA_LOADER_SIZE_COMPACT = 40;\n\nconst BASE = YANTRA_LOADER_SIZE_DEFAULT;\nconst RING = 62;\nconst ICON_SZ = 34;\n\nexport interface YantraBrandLoaderProps {\n /** Outer container width/height in px */\n size?: number;\n}\n\n/**\n * Indeterminate circular ring with Yantra icon centered (brand splash / gate screens).\n */\nexport function YantraBrandLoader({ size = BASE }: YantraBrandLoaderProps) {\n const spin = useRef(new Animated.Value(0)).current;\n const scale = size / BASE;\n\n const ringLayout = useMemo(() => {\n const ringSize = RING * scale;\n const inset = (size - ringSize) / 2;\n return { ringSize, inset };\n }, [size, scale]);\n\n useEffect(() => {\n const loop = Animated.loop(\n Animated.timing(spin, {\n toValue: 1,\n duration: 1100,\n easing: Easing.linear,\n useNativeDriver: true,\n }),\n );\n loop.start();\n return () => loop.stop();\n }, [spin]);\n\n const rotate = spin.interpolate({\n inputRange: [0, 1],\n outputRange: ['0deg', '360deg'],\n });\n\n const { ringSize, inset } = ringLayout;\n const ringBorder = Math.max(2, Math.round(3 * scale));\n\n return (\n <View style={[styles.wrap, { width: size, height: size }]}>\n <Animated.View\n style={[\n styles.ring,\n {\n width: ringSize,\n height: ringSize,\n borderRadius: ringSize / 2,\n borderWidth: ringBorder,\n top: inset,\n left: inset,\n transform: [{ rotate }],\n },\n ]}\n />\n <View style={styles.iconWrap}>\n <Image\n source={ICON}\n style={{ width: ICON_SZ * scale, height: ICON_SZ * scale }}\n resizeMode=\"contain\"\n accessibilityIgnoresInvertColors\n />\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n ring: {\n position: 'absolute',\n borderColor: '#e5e7eb',\n borderTopColor: '#111827',\n borderRightColor: '#6b7280',\n },\n iconWrap: {\n ...StyleSheet.absoluteFillObject,\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n"],"names":["ringSize","inset"],"mappings":"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"}