@adminide-stack/yantra-mobile 12.0.28-alpha.8 → 12.0.28-alpha.81

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 (85) hide show
  1. package/lib/api/stt.js +54 -0
  2. package/lib/api/stt.js.map +1 -0
  3. package/lib/assets/icon.png +0 -0
  4. package/lib/components/CustomDrawer.js +479 -0
  5. package/lib/components/CustomDrawer.js.map +1 -0
  6. package/lib/components/GatewayConnector/GatewayConnector.js +18 -0
  7. package/lib/components/GatewayConnector/GatewayConnector.js.map +1 -0
  8. package/lib/components/GatewayToolbarButtonMobile.js +84 -0
  9. package/lib/components/GatewayToolbarButtonMobile.js.map +1 -0
  10. package/lib/components/NavigationHeader/NavigationHeader.js +214 -0
  11. package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -0
  12. package/lib/components/ThinkingIndicator.js +55 -0
  13. package/lib/components/ThinkingIndicator.js.map +1 -0
  14. package/lib/components/YantraBrandLoader.js +94 -0
  15. package/lib/components/YantraBrandLoader.js.map +1 -0
  16. package/lib/compute.js +114 -5
  17. package/lib/compute.js.map +1 -1
  18. package/lib/config/constants.js +18 -0
  19. package/lib/config/constants.js.map +1 -0
  20. package/lib/config/env-config.js +75 -19
  21. package/lib/config/env-config.js.map +1 -1
  22. package/lib/contexts/CdecliConnectionContext.js +47 -0
  23. package/lib/contexts/CdecliConnectionContext.js.map +1 -0
  24. package/lib/contexts/GatewayContext.js +77 -0
  25. package/lib/contexts/GatewayContext.js.map +1 -0
  26. package/lib/features/audio-input/AudioRecorderPanel.js +220 -0
  27. package/lib/features/audio-input/AudioRecorderPanel.js.map +1 -0
  28. package/lib/features/audio-input/MicErrorBoundary.js +34 -0
  29. package/lib/features/audio-input/MicErrorBoundary.js.map +1 -0
  30. package/lib/features/audio-input/useAudioPermission.js +24 -0
  31. package/lib/features/audio-input/useAudioPermission.js.map +1 -0
  32. package/lib/graphql/agentGatewayDocuments.js +53 -0
  33. package/lib/graphql/agentGatewayDocuments.js.map +1 -0
  34. package/lib/hooks/useAccountDefaultSettings.js +38 -0
  35. package/lib/hooks/useAccountDefaultSettings.js.map +1 -0
  36. package/lib/hooks/useCdecliAutoConnect.js +244 -0
  37. package/lib/hooks/useCdecliAutoConnect.js.map +1 -0
  38. package/lib/hooks/useCdecliChannel.js +161 -0
  39. package/lib/hooks/useCdecliChannel.js.map +1 -0
  40. package/lib/hooks/useChatApi.js +390 -171
  41. package/lib/hooks/useChatApi.js.map +1 -1
  42. package/lib/hooks/useChatStream.js +179 -137
  43. package/lib/hooks/useChatStream.js.map +1 -1
  44. package/lib/hooks/useGatewayConnection.js +123 -0
  45. package/lib/hooks/useGatewayConnection.js.map +1 -0
  46. package/lib/hooks/useGatewayRegistry.js +28 -0
  47. package/lib/hooks/useGatewayRegistry.js.map +1 -0
  48. package/lib/hooks/usePrerequisiteIds.js +209 -0
  49. package/lib/hooks/usePrerequisiteIds.js.map +1 -0
  50. package/lib/hooks/useWorkspaceProvisioner.js +236 -0
  51. package/lib/hooks/useWorkspaceProvisioner.js.map +1 -0
  52. package/lib/index.js +1 -1
  53. package/lib/index.js.map +1 -1
  54. package/lib/routes.json +120 -5
  55. package/lib/screens/Chat/index.js +409 -0
  56. package/lib/screens/Chat/index.js.map +1 -0
  57. package/lib/screens/ChatHistory/index.js +56 -0
  58. package/lib/screens/ChatHistory/index.js.map +1 -0
  59. package/lib/screens/Home/HomeScreen.js +364 -144
  60. package/lib/screens/Home/HomeScreen.js.map +1 -1
  61. package/lib/screens/Home/components/ChatHistoryLanding.js +487 -0
  62. package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -0
  63. package/lib/screens/Home/components/DeepSearchModal.js +349 -0
  64. package/lib/screens/Home/components/DeepSearchModal.js.map +1 -0
  65. package/lib/screens/Home/deepSearchUtils.js +41 -0
  66. package/lib/screens/Home/deepSearchUtils.js.map +1 -0
  67. package/lib/screens/NewChat/index.js +43 -0
  68. package/lib/screens/NewChat/index.js.map +1 -0
  69. package/lib/services/agentSessionManager.js +451 -0
  70. package/lib/services/agentSessionManager.js.map +1 -0
  71. package/lib/services/gatewayApiKeyBridge.js +4 -0
  72. package/lib/services/gatewayApiKeyBridge.js.map +1 -0
  73. package/lib/services/gatewayClient.js +470 -0
  74. package/lib/services/gatewayClient.js.map +1 -0
  75. package/lib/theme/mobileTokens.js +18 -0
  76. package/lib/theme/mobileTokens.js.map +1 -0
  77. package/lib/utils/cdecodeUri.js +68 -0
  78. package/lib/utils/cdecodeUri.js.map +1 -0
  79. package/lib/utils/gatewaySelectionStorage.js +21 -0
  80. package/lib/utils/gatewaySelectionStorage.js.map +1 -0
  81. package/lib/utils/syncMobileOrgRouteContext.js +61 -0
  82. package/lib/utils/syncMobileOrgRouteContext.js.map +1 -0
  83. package/package.json +7 -3
  84. package/lib/api/chatApi.js +0 -102
  85. package/lib/api/chatApi.js.map +0 -1
@@ -0,0 +1,123 @@
1
+ import {useApolloClient}from'@apollo/client/index.js';import {useState,useRef,useCallback,useEffect}from'react';import {config}from'../config/env-config.js';import {OPENCLAW_CHAT_CONNECTION_QUERY}from'../graphql/agentGatewayDocuments.js';import {agentSessionManager}from'../services/agentSessionManager.js';import {GatewayClient}from'../services/gatewayClient.js';function isInstanceNotFoundError(error) {
2
+ if (!error) return false;
3
+ return error.includes("Instance not found") || error.includes("is the workspace running");
4
+ }
5
+ const MAX_CONNECT_RETRIES = 6;
6
+ const RETRY_BASE_DELAY_MS = 2e3;
7
+ const MAX_RETRY_DELAY_MS = 8e3;
8
+ function isTransientConnectionError(msg) {
9
+ return msg.includes("connection closed before handshake") || msg.includes("WebSocket connection error") || msg.includes("Failed to fetch") || msg.includes("Gateway GraphQL request failed: 5");
10
+ }
11
+ function useGatewayConnection(projectId, userId) {
12
+ var _a;
13
+ const client = useApolloClient();
14
+ const [status, setStatus] = useState(() => {
15
+ var _a2;
16
+ return ((_a2 = agentSessionManager.getClient()) == null ? void 0 : _a2.connected) ? "connected" : "disconnected";
17
+ });
18
+ const [error, setError] = useState(null);
19
+ const clientRef = useRef((_a = agentSessionManager.getClient()) != null ? _a : null);
20
+ const connectingRef = useRef(false);
21
+ const fetchGatewayConnection = useCallback(async (pid, uid) => {
22
+ var _a2;
23
+ const res = await client.query({
24
+ query: OPENCLAW_CHAT_CONNECTION_QUERY,
25
+ variables: {
26
+ projectId: pid,
27
+ userId: uid
28
+ },
29
+ fetchPolicy: "network-only"
30
+ });
31
+ if ((_a2 = res.errors) == null ? void 0 : _a2.length) throw new Error(res.errors[0].message);
32
+ const data = res.data;
33
+ const conn = data == null ? void 0 : data.openclawChatConnection;
34
+ if (!conn) throw new Error("No openclawChatConnection in response");
35
+ return conn;
36
+ }, [client]);
37
+ const disconnect = useCallback(() => {
38
+ if (clientRef.current) {
39
+ clientRef.current.close();
40
+ clientRef.current = null;
41
+ }
42
+ agentSessionManager.detachGateway();
43
+ setStatus("disconnected");
44
+ setError(null);
45
+ connectingRef.current = false;
46
+ }, []);
47
+ const connect = useCallback(async () => {
48
+ var _a2;
49
+ if (connectingRef.current) {
50
+ console.log("[Gateway] Connection already in progress, skipping");
51
+ return;
52
+ }
53
+ if ((_a2 = agentSessionManager.getClient()) == null ? void 0 : _a2.connected) {
54
+ clientRef.current = agentSessionManager.getClient();
55
+ setStatus("connected");
56
+ return;
57
+ }
58
+ if (!projectId || !userId) {
59
+ console.warn("[Gateway] Cannot connect \u2014 projectId or userId is not available yet");
60
+ return;
61
+ }
62
+ connectingRef.current = true;
63
+ console.log("[Gateway] Connecting to gateway...");
64
+ if (clientRef.current) {
65
+ clientRef.current.close();
66
+ clientRef.current = null;
67
+ agentSessionManager.detachGateway();
68
+ }
69
+ setStatus("connecting");
70
+ setError(null);
71
+ let lastError = null;
72
+ for (let attempt = 1; attempt <= MAX_CONNECT_RETRIES; attempt++) {
73
+ try {
74
+ const conn = await fetchGatewayConnection(projectId, userId);
75
+ if (!(conn == null ? void 0 : conn.proxyToken)) {
76
+ throw new Error("No gateway connection available \u2014 is the workspace running?");
77
+ }
78
+ console.log(`[Gateway] Connecting (attempt ${attempt}/${MAX_CONNECT_RETRIES}): wsUrl=${conn.wsUrl} url=${conn.url} proxyWs=${config.AGENT_GATEWAY_WS_URL}`);
79
+ const wsUrl = config.AGENT_GATEWAY_WS_URL;
80
+ const wsClient = new GatewayClient(wsUrl, conn.token, conn.proxyToken);
81
+ clientRef.current = wsClient;
82
+ const hello = await wsClient.connect();
83
+ await agentSessionManager.attachGateway(wsClient, hello);
84
+ console.log("[Gateway] Connected successfully");
85
+ setStatus("connected");
86
+ connectingRef.current = false;
87
+ wsClient.on("disconnect", () => {
88
+ setStatus("disconnected");
89
+ connectingRef.current = false;
90
+ });
91
+ return;
92
+ } catch (err) {
93
+ const msg = err instanceof Error ? err.message : String(err);
94
+ lastError = msg;
95
+ if (clientRef.current) {
96
+ clientRef.current.close();
97
+ clientRef.current = null;
98
+ }
99
+ if (!isTransientConnectionError(msg) || attempt >= MAX_CONNECT_RETRIES) {
100
+ break;
101
+ }
102
+ const retryDelay = Math.min(RETRY_BASE_DELAY_MS * 2 ** (attempt - 1), MAX_RETRY_DELAY_MS);
103
+ console.warn(`[Gateway] Transient failure (attempt ${attempt}/${MAX_CONNECT_RETRIES}): ${msg} \u2014 retrying in ${retryDelay / 1e3}s`);
104
+ await new Promise((r) => {
105
+ setTimeout(r, retryDelay);
106
+ });
107
+ }
108
+ }
109
+ console.error(`[Gateway] Connection failed after ${MAX_CONNECT_RETRIES} attempts: ${lastError} (projectId=${projectId}, userId=${userId}, wsUrl=${config.AGENT_GATEWAY_WS_URL})`);
110
+ setStatus("error");
111
+ setError(lastError);
112
+ connectingRef.current = false;
113
+ }, [projectId, userId, fetchGatewayConnection]);
114
+ useEffect(() => () => {
115
+ connectingRef.current = false;
116
+ }, []);
117
+ return {
118
+ status,
119
+ error,
120
+ connect,
121
+ disconnect
122
+ };
123
+ }export{isInstanceNotFoundError,useGatewayConnection};//# sourceMappingURL=useGatewayConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGatewayConnection.js","sources":["../../src/hooks/useGatewayConnection.ts"],"sourcesContent":["/**\n * OpenClaw gateway WebSocket — same flow as account/browser, using Apollo\n * for `openclawChatConnection` so mobile gets the same auth as other operations.\n */\n\nimport { useApolloClient } from '@apollo/client';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { config } from '../config/env-config';\nimport { OPENCLAW_CHAT_CONNECTION_QUERY } from '../graphql/agentGatewayDocuments';\nimport { GatewayClient, agentSessionManager, resetGatewayApiKeyBridge } from '../services';\n\nexport type GatewayConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'error';\n\nexport interface UseGatewayConnectionResult {\n status: GatewayConnectionStatus;\n error: string | null;\n connect: () => Promise<void>;\n disconnect: () => void;\n}\n\nexport function isInstanceNotFoundError(error: string | null): boolean {\n if (!error) return false;\n return error.includes('Instance not found') || error.includes('is the workspace running');\n}\n\nconst MAX_CONNECT_RETRIES = 6;\nconst RETRY_BASE_DELAY_MS = 2000;\nconst MAX_RETRY_DELAY_MS = 8000;\n\nfunction isTransientConnectionError(msg: string): boolean {\n return (\n msg.includes('connection closed before handshake') ||\n msg.includes('WebSocket connection error') ||\n msg.includes('Failed to fetch') ||\n msg.includes('Gateway GraphQL request failed: 5')\n );\n}\n\nexport function useGatewayConnection(projectId: string | null, userId: string | null): UseGatewayConnectionResult {\n const client = useApolloClient();\n const [status, setStatus] = useState<GatewayConnectionStatus>(() =>\n agentSessionManager.getClient()?.connected ? 'connected' : 'disconnected',\n );\n const [error, setError] = useState<string | null>(null);\n const clientRef = useRef<GatewayClient | null>(agentSessionManager.getClient() ?? null);\n const connectingRef = useRef(false);\n\n const fetchGatewayConnection = useCallback(\n async (\n pid: string,\n uid: string,\n ): Promise<{ wsUrl: string; token: string; url: string; proxyToken: string; expiresAt: string }> => {\n const res = await client.query({\n query: OPENCLAW_CHAT_CONNECTION_QUERY,\n variables: { projectId: pid, userId: uid },\n fetchPolicy: 'network-only',\n });\n if (res.errors?.length) throw new Error(res.errors[0].message);\n const data = res.data as {\n openclawChatConnection: {\n wsUrl: string;\n token: string;\n url: string;\n proxyToken: string;\n expiresAt: string;\n };\n };\n const conn = data?.openclawChatConnection;\n if (!conn) throw new Error('No openclawChatConnection in response');\n return conn;\n },\n [client],\n );\n\n const disconnect = useCallback(() => {\n if (clientRef.current) {\n clientRef.current.close();\n clientRef.current = null;\n }\n agentSessionManager.detachGateway();\n resetGatewayApiKeyBridge();\n setStatus('disconnected');\n setError(null);\n connectingRef.current = false;\n }, []);\n\n const connect = useCallback(async () => {\n if (connectingRef.current) {\n console.log('[Gateway] Connection already in progress, skipping');\n return;\n }\n if (agentSessionManager.getClient()?.connected) {\n clientRef.current = agentSessionManager.getClient();\n setStatus('connected');\n return;\n }\n if (!projectId || !userId) {\n console.warn('[Gateway] Cannot connect — projectId or userId is not available yet');\n return;\n }\n connectingRef.current = true;\n console.log('[Gateway] Connecting to gateway...');\n\n if (clientRef.current) {\n clientRef.current.close();\n clientRef.current = null;\n agentSessionManager.detachGateway();\n }\n\n setStatus('connecting');\n setError(null);\n\n let lastError: string | null = null;\n\n for (let attempt = 1; attempt <= MAX_CONNECT_RETRIES; attempt++) {\n try {\n const conn = await fetchGatewayConnection(projectId, userId);\n if (!conn?.proxyToken) {\n throw new Error('No gateway connection available — is the workspace running?');\n }\n console.log(\n `[Gateway] Connecting (attempt ${attempt}/${MAX_CONNECT_RETRIES}): wsUrl=${conn.wsUrl} url=${conn.url} proxyWs=${config.AGENT_GATEWAY_WS_URL}`,\n );\n\n const wsUrl = config.AGENT_GATEWAY_WS_URL;\n const wsClient = new GatewayClient(wsUrl, conn.token, conn.proxyToken);\n clientRef.current = wsClient;\n\n const hello = await wsClient.connect();\n await agentSessionManager.attachGateway(wsClient, hello);\n\n console.log('[Gateway] Connected successfully');\n setStatus('connected');\n connectingRef.current = false;\n\n wsClient.on('disconnect', () => {\n setStatus('disconnected');\n connectingRef.current = false;\n });\n return;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n lastError = msg;\n\n if (clientRef.current) {\n clientRef.current.close();\n clientRef.current = null;\n }\n\n if (!isTransientConnectionError(msg) || attempt >= MAX_CONNECT_RETRIES) {\n break;\n }\n\n const retryDelay = Math.min(RETRY_BASE_DELAY_MS * 2 ** (attempt - 1), MAX_RETRY_DELAY_MS);\n console.warn(\n `[Gateway] Transient failure (attempt ${attempt}/${MAX_CONNECT_RETRIES}): ${msg} — retrying in ${retryDelay / 1000}s`,\n );\n await new Promise<void>((r) => {\n setTimeout(r, retryDelay);\n });\n }\n }\n\n console.error(\n `[Gateway] Connection failed after ${MAX_CONNECT_RETRIES} attempts: ${lastError} (projectId=${projectId}, userId=${userId}, wsUrl=${config.AGENT_GATEWAY_WS_URL})`,\n );\n setStatus('error');\n setError(lastError);\n connectingRef.current = false;\n }, [projectId, userId, fetchGatewayConnection]);\n\n useEffect(\n () => () => {\n connectingRef.current = false;\n },\n [],\n );\n\n return { status, error, connect, disconnect };\n}\n"],"names":["_a"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import {useMemo}from'react';import {BUILTIN_MOBILE_GATEWAYS}from'../config/constants.js';var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __spreadValues = (a, b) => {
7
+ for (var prop in b || (b = {}))
8
+ if (__hasOwnProp.call(b, prop))
9
+ __defNormalProp(a, prop, b[prop]);
10
+ if (__getOwnPropSymbols)
11
+ for (var prop of __getOwnPropSymbols(b)) {
12
+ if (__propIsEnum.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ }
15
+ return a;
16
+ };
17
+ function useGatewayRegistry() {
18
+ const gateways = useMemo(() => __spreadValues({}, BUILTIN_MOBILE_GATEWAYS), []);
19
+ const gatewayList = useMemo(() => Object.entries(gateways).map(([id, entry]) => __spreadValues({
20
+ id
21
+ }, entry)).sort((a, b) => b.priority - a.priority), [gateways]);
22
+ return {
23
+ gateways,
24
+ gatewayList,
25
+ loading: false,
26
+ error: false
27
+ };
28
+ }export{useGatewayRegistry};//# sourceMappingURL=useGatewayRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGatewayRegistry.js","sources":["../../src/hooks/useGatewayRegistry.ts"],"sourcesContent":["/** Mobile gateway registry. Uses built-ins to avoid settings shape issues in RN runtime. */\n\nimport { useMemo } from 'react';\nimport { BUILTIN_MOBILE_GATEWAYS, type GatewayEntry } from '../config/constants';\n\nexport interface UseGatewayRegistryReturn {\n gateways: Record<string, GatewayEntry>;\n gatewayList: Array<{ id: string } & GatewayEntry>;\n loading: boolean;\n error: boolean;\n}\n\nexport function useGatewayRegistry(): UseGatewayRegistryReturn {\n const gateways = useMemo(() => ({ ...BUILTIN_MOBILE_GATEWAYS }), []);\n\n const gatewayList = useMemo(\n () =>\n Object.entries(gateways)\n .map(([id, entry]) => ({ id, ...entry }))\n .sort((a, b) => b.priority - a.priority),\n [gateways],\n );\n\n return { gateways, gatewayList, loading: false, error: false };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAYO,SAAS,kBAA+C,GAAA;AAC7D,EAAA,MAAM,WAAW,OAAQ,CAAA,MAAO,cAC3B,CAAA,EAAA,EAAA,uBAAA,CAAA,EACD,EAAE,CAAA;AACN,EAAA,MAAM,WAAc,GAAA,OAAA,CAAQ,MAAM,MAAA,CAAO,OAAQ,CAAA,QAAQ,CAAE,CAAA,GAAA,CAAI,CAAC,CAAC,EAAI,EAAA,KAAK,CAAO,KAAA,cAAA,CAAA;AAAA,IAC/E;AAAA,GAAA,EACG,KACH,CAAA,CAAA,CAAE,IAAK,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAE,CAAA,QAAA,GAAW,CAAE,CAAA,QAAQ,CAAG,EAAA,CAAC,QAAQ,CAAC,CAAA;AACvD,EAAO,OAAA;AAAA,IACL,QAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAS,EAAA,KAAA;AAAA,IACT,KAAO,EAAA;AAAA,GACT;AACF"}
@@ -0,0 +1,209 @@
1
+ import {DEFAULT_PRODUCTION_TAG_ID}from'@adminide-stack/core/lib/constants/defaultIds.js';import {isAuthenticatedSelector}from'@adminide-stack/user-auth0-client';import {useGetContextDataQuery,useAccountProfileQuery,useGetUserOrganizationsWithDetailsQuery,useGetUserOrganizationsQuery,useGetProjectsLazyQuery,useQuickCreateProjectForAccountBkMutation,useCreateVaultMutation}from'common/graphql';import {useMemo,useEffect,useState,useRef}from'react';import {useSelector}from'react-redux';import {useAccountDefaultSettings}from'./useAccountDefaultSettings.js';import {isUnhydratedCdecodeUri,toUriInput,settingsUriForAccount}from'../utils/cdecodeUri.js';const uuidToObjectId = (uuid) => uuid.replace(/-/g, "").substring(0, 24);
2
+ const PROJECT_NAME = "DEFAULT_YANTRA_PROJECT";
3
+ const TAG_ID = uuidToObjectId(DEFAULT_PRODUCTION_TAG_ID);
4
+ const ORG_RESOLVE_POLL_MS = 2e3;
5
+ const PROFILE_POLL_MS = 1500;
6
+ function pickDefaultOrgSlug(orgs) {
7
+ var _a, _b;
8
+ if (!(orgs == null ? void 0 : orgs.length)) return null;
9
+ const first = orgs.find((o) => typeof (o == null ? void 0 : o.name) === "string" && o.name.trim().length > 0);
10
+ return (_b = (_a = first == null ? void 0 : first.name) == null ? void 0 : _a.trim()) != null ? _b : null;
11
+ }
12
+ function usePrerequisiteIds() {
13
+ var _a, _b, _c, _d, _e, _f;
14
+ const isAuthenticated = useSelector(isAuthenticatedSelector);
15
+ const {
16
+ data: contextData,
17
+ loading: contextLoading,
18
+ refetch: refetchContext
19
+ } = useGetContextDataQuery();
20
+ const cdecodeUri = (_a = contextData == null ? void 0 : contextData.getContextData) == null ? void 0 : _a.cdecodeUri;
21
+ const contextUserId = (_c = (_b = contextData == null ? void 0 : contextData.getContextData) == null ? void 0 : _b.userId) != null ? _c : null;
22
+ const contextResourceUri = useMemo(() => {
23
+ if (isUnhydratedCdecodeUri(cdecodeUri)) return void 0;
24
+ return toUriInput(cdecodeUri);
25
+ }, [cdecodeUri]);
26
+ const {
27
+ data: accountProfileData,
28
+ loading: userLoading,
29
+ refetch: refetchProfile
30
+ } = useAccountProfileQuery({
31
+ fetchPolicy: "cache-and-network",
32
+ errorPolicy: "all",
33
+ skip: !isAuthenticated
34
+ });
35
+ const profileUserId = (_f = (_e = (_d = accountProfileData == null ? void 0 : accountProfileData.accountProfile) == null ? void 0 : _d.user) == null ? void 0 : _e.id) != null ? _f : null;
36
+ const effectiveUserId = isAuthenticated ? profileUserId || contextUserId : null;
37
+ useEffect(() => {
38
+ if (!isAuthenticated || profileUserId) return;
39
+ const timer = setInterval(() => {
40
+ refetchProfile().catch(() => void 0);
41
+ }, PROFILE_POLL_MS);
42
+ return () => clearInterval(timer);
43
+ }, [isAuthenticated, profileUserId, refetchProfile]);
44
+ const {
45
+ organization: orgFromContextSettings,
46
+ project: projectFromContextSettings,
47
+ loading: contextSettingsLoading,
48
+ refetch: refetchContextSettings
49
+ } = useAccountDefaultSettings({
50
+ resourceUri: contextResourceUri,
51
+ skip: !isAuthenticated || !contextResourceUri
52
+ });
53
+ const accountResourceUri = useMemo(() => {
54
+ if (!effectiveUserId || orgFromContextSettings) return void 0;
55
+ return settingsUriForAccount(effectiveUserId);
56
+ }, [effectiveUserId, orgFromContextSettings]);
57
+ const {
58
+ organization: orgFromAccountSettings,
59
+ project: projectFromAccountSettings,
60
+ loading: accountSettingsLoading,
61
+ refetch: refetchAccountSettings
62
+ } = useAccountDefaultSettings({
63
+ resourceUri: accountResourceUri,
64
+ skip: !isAuthenticated || !accountResourceUri
65
+ });
66
+ const {
67
+ data: orgsData,
68
+ loading: orgsLoading,
69
+ refetch: refetchOrgs
70
+ } = useGetUserOrganizationsWithDetailsQuery({
71
+ skip: !isAuthenticated || !effectiveUserId,
72
+ fetchPolicy: "cache-and-network"
73
+ });
74
+ const {
75
+ data: orgsByUserData,
76
+ loading: orgsByUserLoading,
77
+ refetch: refetchOrgsByUser
78
+ } = useGetUserOrganizationsQuery({
79
+ variables: {
80
+ userId: effectiveUserId != null ? effectiveUserId : void 0
81
+ },
82
+ skip: !isAuthenticated || !effectiveUserId,
83
+ fetchPolicy: "cache-and-network"
84
+ });
85
+ const orgFromMembership = useMemo(() => {
86
+ const fromDetails = pickDefaultOrgSlug(orgsData == null ? void 0 : orgsData.getUserOrganizationsWithDetails);
87
+ if (fromDetails) return fromDetails;
88
+ return pickDefaultOrgSlug(orgsByUserData == null ? void 0 : orgsByUserData.getUserOrganizations);
89
+ }, [orgsData, orgsByUserData]);
90
+ const orgFromContextPath = useMemo(() => {
91
+ var _a2;
92
+ if (isUnhydratedCdecodeUri(cdecodeUri)) return null;
93
+ const {
94
+ path
95
+ } = toUriInput(cdecodeUri);
96
+ const match = path.match(/^\/([^/]+)\//);
97
+ return ((_a2 = match == null ? void 0 : match[1]) == null ? void 0 : _a2.trim()) || null;
98
+ }, [cdecodeUri]);
99
+ const orgName = orgFromContextSettings || orgFromAccountSettings || orgFromMembership || orgFromContextPath || null;
100
+ const rawSettingsProjectId = projectFromContextSettings || projectFromAccountSettings || null;
101
+ useEffect(() => {
102
+ if (!orgName) return;
103
+ refetchContext().catch(() => void 0);
104
+ }, [orgName, refetchContext]);
105
+ useEffect(() => {
106
+ if (!isAuthenticated || orgName || !effectiveUserId) return;
107
+ const timer = setInterval(() => {
108
+ var _a2, _b2;
109
+ (_a2 = refetchContextSettings == null ? void 0 : refetchContextSettings()) == null ? void 0 : _a2.catch(() => void 0);
110
+ (_b2 = refetchAccountSettings == null ? void 0 : refetchAccountSettings()) == null ? void 0 : _b2.catch(() => void 0);
111
+ refetchOrgs().catch(() => void 0);
112
+ refetchOrgsByUser().catch(() => void 0);
113
+ }, ORG_RESOLVE_POLL_MS);
114
+ return () => clearInterval(timer);
115
+ }, [isAuthenticated, orgName, effectiveUserId, refetchContextSettings, refetchAccountSettings, refetchOrgs, refetchOrgsByUser]);
116
+ const settingsProjectId = rawSettingsProjectId;
117
+ const [resolvedProjectId, setResolvedProjectId] = useState(null);
118
+ const [isInitializingProject, setIsInitializingProject] = useState(false);
119
+ const isCreatingRef = useRef(false);
120
+ const projectId = settingsProjectId || resolvedProjectId;
121
+ const needsProjectCreation = !!orgName && !rawSettingsProjectId && !projectId;
122
+ const [fetchProjects] = useGetProjectsLazyQuery();
123
+ const [createProject, {
124
+ error: createError,
125
+ loading: projectCreating
126
+ }] = useQuickCreateProjectForAccountBkMutation();
127
+ const [createVault, {
128
+ error: vaultCreateError
129
+ }] = useCreateVaultMutation();
130
+ useEffect(() => {
131
+ if (!needsProjectCreation || isCreatingRef.current || !effectiveUserId || userLoading) {
132
+ return;
133
+ }
134
+ isCreatingRef.current = true;
135
+ setIsInitializingProject(true);
136
+ createProject({
137
+ variables: {
138
+ input: {
139
+ accountId: effectiveUserId,
140
+ projectName: PROJECT_NAME
141
+ }
142
+ },
143
+ onCompleted: (data) => {
144
+ var _a2;
145
+ const newMongoProjectId = (_a2 = data.quickCreateProjectForAccount) == null ? void 0 : _a2.id;
146
+ if (!newMongoProjectId) {
147
+ isCreatingRef.current = false;
148
+ setIsInitializingProject(false);
149
+ console.error("[usePrerequisiteIds] Project creation returned no id");
150
+ return;
151
+ }
152
+ fetchProjects({
153
+ variables: {
154
+ orgName,
155
+ limit: 50
156
+ }
157
+ }).then(({
158
+ data: projectsData
159
+ }) => {
160
+ var _a3;
161
+ const createdProject = (((_a3 = projectsData == null ? void 0 : projectsData.getProjects) == null ? void 0 : _a3.data) || []).find((project) => (project == null ? void 0 : project.id) === newMongoProjectId);
162
+ if (createdProject == null ? void 0 : createdProject.projectId) {
163
+ setResolvedProjectId(createdProject.projectId);
164
+ }
165
+ }).catch((error) => {
166
+ console.error("[usePrerequisiteIds] Failed to resolve created project UUID:", error.message);
167
+ }).finally(() => {
168
+ setIsInitializingProject(false);
169
+ });
170
+ createVault({
171
+ variables: {
172
+ input: {
173
+ orgName,
174
+ projectId: newMongoProjectId
175
+ }
176
+ },
177
+ onCompleted: () => {
178
+ console.log("[usePrerequisiteIds] Vault created for project:", newMongoProjectId);
179
+ },
180
+ onError: (error) => {
181
+ console.error("[usePrerequisiteIds] Vault creation failed:", error.message);
182
+ }
183
+ });
184
+ },
185
+ onError: (error) => {
186
+ console.error("[usePrerequisiteIds] Project creation failed:", error.message);
187
+ isCreatingRef.current = false;
188
+ setIsInitializingProject(false);
189
+ }
190
+ });
191
+ }, [createProject, createVault, fetchProjects, needsProjectCreation, orgName, effectiveUserId, userLoading]);
192
+ const settingsLoading = contextSettingsLoading || accountSettingsLoading;
193
+ const isOrgLoading = isAuthenticated && !orgName && (userLoading || contextLoading || settingsLoading || orgsLoading || orgsByUserLoading || Boolean(effectiveUserId));
194
+ const isProjectLoading = !!orgName && !rawSettingsProjectId && !projectId && (isInitializingProject || projectCreating);
195
+ const isLoading = isOrgLoading || isProjectLoading;
196
+ return {
197
+ projectId,
198
+ orgName,
199
+ accountUserId: effectiveUserId != null ? effectiveUserId : null,
200
+ tagId: TAG_ID,
201
+ loading: isLoading,
202
+ /** True while org slug is still unknown (Home should wait before syncing route). */
203
+ orgLoading: isOrgLoading,
204
+ errors: {
205
+ createError,
206
+ vaultCreateError
207
+ }
208
+ };
209
+ }export{usePrerequisiteIds};//# sourceMappingURL=usePrerequisiteIds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePrerequisiteIds.js","sources":["../../src/hooks/usePrerequisiteIds.ts"],"sourcesContent":["import { DEFAULT_PRODUCTION_TAG_ID } from '@adminide-stack/core/lib/constants/defaultIds.js';\nimport { isAuthenticatedSelector } from '@adminide-stack/user-auth0-client';\nimport {\n useAccountProfileQuery,\n useCreateVaultMutation,\n useGetContextDataQuery,\n useGetProjectsLazyQuery,\n useGetUserOrganizationsQuery,\n useGetUserOrganizationsWithDetailsQuery,\n useQuickCreateProjectForAccountBkMutation,\n} from 'common/graphql';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useAccountDefaultSettings } from './useAccountDefaultSettings';\nimport { isUnhydratedCdecodeUri, settingsUriForAccount, toUriInput } from '../utils/cdecodeUri';\n\nconst uuidToObjectId = (uuid: string) => uuid.replace(/-/g, '').substring(0, 24);\n\nconst PROJECT_NAME = 'DEFAULT_YANTRA_PROJECT';\nconst TAG_ID = uuidToObjectId(DEFAULT_PRODUCTION_TAG_ID);\n\nconst ORG_RESOLVE_POLL_MS = 2000;\nconst PROFILE_POLL_MS = 1500;\n\nfunction pickDefaultOrgSlug(\n orgs: Array<{ name?: string | null; title?: string | null } | null | undefined> | null | undefined,\n): string | null {\n if (!orgs?.length) return null;\n const first = orgs.find((o) => typeof o?.name === 'string' && o.name.trim().length > 0);\n return first?.name?.trim() ?? null;\n}\n\n/**\n * Org + project prerequisites for mobile (parity with browser `usePrerequisiteIds`).\n *\n * Settings use the same `account.default` config as web (`useSettingsLoader` → `useSettings` on mobile).\n * After verify-user, account-level settings (`//accounts/{id}#settings`) and org membership are polled\n * until `organization` is available, then route context is synced on Home.\n */\nexport function usePrerequisiteIds() {\n const isAuthenticated = useSelector(isAuthenticatedSelector);\n\n const { data: contextData, loading: contextLoading, refetch: refetchContext } = useGetContextDataQuery();\n const cdecodeUri = contextData?.getContextData?.cdecodeUri;\n const contextUserId = contextData?.getContextData?.userId ?? null;\n\n const contextResourceUri = useMemo(() => {\n if (isUnhydratedCdecodeUri(cdecodeUri)) return undefined;\n return toUriInput(cdecodeUri);\n }, [cdecodeUri]);\n\n const {\n data: accountProfileData,\n loading: userLoading,\n refetch: refetchProfile,\n } = useAccountProfileQuery({\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'all',\n skip: !isAuthenticated,\n });\n const profileUserId = accountProfileData?.accountProfile?.user?.id ?? null;\n const effectiveUserId = isAuthenticated ? profileUserId || contextUserId : null;\n\n useEffect(() => {\n if (!isAuthenticated || profileUserId) return;\n const timer = setInterval(() => {\n refetchProfile().catch(() => undefined);\n }, PROFILE_POLL_MS);\n return () => clearInterval(timer);\n }, [isAuthenticated, profileUserId, refetchProfile]);\n\n // Step 1 (web): account.default via settings loader — context cdecodeUri when hydrated\n const {\n organization: orgFromContextSettings,\n project: projectFromContextSettings,\n loading: contextSettingsLoading,\n refetch: refetchContextSettings,\n } = useAccountDefaultSettings({\n resourceUri: contextResourceUri,\n skip: !isAuthenticated || !contextResourceUri,\n });\n\n const accountResourceUri = useMemo(() => {\n if (!effectiveUserId || orgFromContextSettings) return undefined;\n return settingsUriForAccount(effectiveUserId);\n }, [effectiveUserId, orgFromContextSettings]);\n\n // Mobile bootstrap: read account.default from account document before org is on the route\n const {\n organization: orgFromAccountSettings,\n project: projectFromAccountSettings,\n loading: accountSettingsLoading,\n refetch: refetchAccountSettings,\n } = useAccountDefaultSettings({\n resourceUri: accountResourceUri,\n skip: !isAuthenticated || !accountResourceUri,\n });\n\n const {\n data: orgsData,\n loading: orgsLoading,\n refetch: refetchOrgs,\n } = useGetUserOrganizationsWithDetailsQuery({\n skip: !isAuthenticated || !effectiveUserId,\n fetchPolicy: 'cache-and-network',\n });\n\n const {\n data: orgsByUserData,\n loading: orgsByUserLoading,\n refetch: refetchOrgsByUser,\n } = useGetUserOrganizationsQuery({\n variables: { userId: effectiveUserId ?? undefined },\n skip: !isAuthenticated || !effectiveUserId,\n fetchPolicy: 'cache-and-network',\n });\n\n const orgFromMembership = useMemo(() => {\n const fromDetails = pickDefaultOrgSlug(orgsData?.getUserOrganizationsWithDetails);\n if (fromDetails) return fromDetails;\n return pickDefaultOrgSlug(orgsByUserData?.getUserOrganizations);\n }, [orgsData, orgsByUserData]);\n\n const orgFromContextPath = useMemo(() => {\n if (isUnhydratedCdecodeUri(cdecodeUri)) return null;\n const { path } = toUriInput(cdecodeUri);\n const match = path.match(/^\\/([^/]+)\\//);\n return match?.[1]?.trim() || null;\n }, [cdecodeUri]);\n\n const orgName = orgFromContextSettings || orgFromAccountSettings || orgFromMembership || orgFromContextPath || null;\n\n const rawSettingsProjectId = projectFromContextSettings || projectFromAccountSettings || null;\n\n useEffect(() => {\n if (!orgName) return;\n refetchContext().catch(() => undefined);\n }, [orgName, refetchContext]);\n\n useEffect(() => {\n if (!isAuthenticated || orgName || !effectiveUserId) return;\n const timer = setInterval(() => {\n refetchContextSettings?.()?.catch(() => undefined);\n refetchAccountSettings?.()?.catch(() => undefined);\n refetchOrgs().catch(() => undefined);\n refetchOrgsByUser().catch(() => undefined);\n }, ORG_RESOLVE_POLL_MS);\n return () => clearInterval(timer);\n }, [\n isAuthenticated,\n orgName,\n effectiveUserId,\n refetchContextSettings,\n refetchAccountSettings,\n refetchOrgs,\n refetchOrgsByUser,\n ]);\n\n const settingsProjectId = rawSettingsProjectId;\n\n const [resolvedProjectId, setResolvedProjectId] = useState<string | null>(null);\n const [isInitializingProject, setIsInitializingProject] = useState(false);\n const isCreatingRef = useRef(false);\n\n const projectId = settingsProjectId || resolvedProjectId;\n const needsProjectCreation = !!orgName && !rawSettingsProjectId && !projectId;\n\n const [fetchProjects] = useGetProjectsLazyQuery();\n const [createProject, { error: createError, loading: projectCreating }] =\n useQuickCreateProjectForAccountBkMutation();\n const [createVault, { error: vaultCreateError }] = useCreateVaultMutation();\n\n useEffect(() => {\n if (!needsProjectCreation || isCreatingRef.current || !effectiveUserId || userLoading) {\n return;\n }\n\n isCreatingRef.current = true;\n setIsInitializingProject(true);\n\n createProject({\n variables: {\n input: {\n accountId: effectiveUserId,\n projectName: PROJECT_NAME,\n },\n },\n onCompleted: (data) => {\n const newMongoProjectId = data.quickCreateProjectForAccount?.id;\n if (!newMongoProjectId) {\n isCreatingRef.current = false;\n setIsInitializingProject(false);\n console.error('[usePrerequisiteIds] Project creation returned no id');\n return;\n }\n\n fetchProjects({\n variables: { orgName: orgName!, limit: 50 },\n })\n .then(({ data: projectsData }) => {\n const createdProject = (projectsData?.getProjects?.data || []).find(\n (project) => project?.id === newMongoProjectId,\n );\n if (createdProject?.projectId) {\n setResolvedProjectId(createdProject.projectId);\n }\n })\n .catch((error) => {\n console.error('[usePrerequisiteIds] Failed to resolve created project UUID:', error.message);\n })\n .finally(() => {\n setIsInitializingProject(false);\n });\n\n createVault({\n variables: {\n input: {\n orgName: orgName!,\n projectId: newMongoProjectId,\n },\n },\n onCompleted: () => {\n console.log('[usePrerequisiteIds] Vault created for project:', newMongoProjectId);\n },\n onError: (error) => {\n console.error('[usePrerequisiteIds] Vault creation failed:', error.message);\n },\n });\n },\n onError: (error) => {\n console.error('[usePrerequisiteIds] Project creation failed:', error.message);\n isCreatingRef.current = false;\n setIsInitializingProject(false);\n },\n });\n }, [createProject, createVault, fetchProjects, needsProjectCreation, orgName, effectiveUserId, userLoading]);\n\n const settingsLoading = contextSettingsLoading || accountSettingsLoading;\n\n const isOrgLoading =\n isAuthenticated &&\n !orgName &&\n (userLoading ||\n contextLoading ||\n settingsLoading ||\n orgsLoading ||\n orgsByUserLoading ||\n Boolean(effectiveUserId));\n\n const isProjectLoading =\n !!orgName && !rawSettingsProjectId && !projectId && (isInitializingProject || projectCreating);\n\n const isLoading = isOrgLoading || isProjectLoading;\n\n return {\n projectId,\n orgName,\n accountUserId: effectiveUserId ?? null,\n tagId: TAG_ID,\n loading: isLoading,\n /** True while org slug is still unknown (Home should wait before syncing route). */\n orgLoading: isOrgLoading,\n errors: { createError, vaultCreateError },\n };\n}\n"],"names":["_a","_b"],"mappings":"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"}