@adminide-stack/yantra-mobile 12.0.54-alpha.1 → 12.0.54-alpha.11
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/components/CustomDrawer.js +28 -19
- package/lib/components/CustomDrawer.js.map +1 -1
- package/lib/components/NavigationHeader/HeaderMoreMenu.js +7 -4
- package/lib/components/NavigationHeader/HeaderMoreMenu.js.map +1 -1
- package/lib/components/NavigationHeader/HeaderSkillsButton.js +5 -2
- package/lib/components/NavigationHeader/HeaderSkillsButton.js.map +1 -1
- package/lib/components/NavigationHeader/HeaderTasksButton.js +4 -1
- package/lib/components/NavigationHeader/HeaderTasksButton.js.map +1 -1
- package/lib/components/NavigationHeader/NavigationHeader.js +7 -5
- package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
- package/lib/compute.js +57 -7
- package/lib/compute.js.map +1 -1
- package/lib/features/agent-chat/NativeAgentChat.js +393 -0
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -0
- package/lib/features/apps/AppsCatalog.js +10 -0
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/apps/mobileAppCatalog.js +7 -0
- package/lib/features/apps/mobileAppCatalog.js.map +1 -1
- package/lib/features/attachments/displayUserMessageText.js +3 -2
- package/lib/features/attachments/displayUserMessageText.js.map +1 -1
- package/lib/features/attachments/useImageAttachments.js +9 -7
- package/lib/features/attachments/useImageAttachments.js.map +1 -1
- package/lib/features/canvas/withRemoteSafeArea.js +46 -0
- package/lib/features/canvas/withRemoteSafeArea.js.map +1 -0
- package/lib/features/chat/ChatTranscript.js +23 -15
- package/lib/features/chat/ChatTranscript.js.map +1 -1
- package/lib/features/chat/toolActivity.js +42 -6
- package/lib/features/chat/toolActivity.js.map +1 -1
- package/lib/features/chat/transcriptGroups.js +11 -2
- package/lib/features/chat/transcriptGroups.js.map +1 -1
- package/lib/features/shopping/chat/homeShoppingIntent.js +58 -0
- package/lib/features/shopping/chat/homeShoppingIntent.js.map +1 -0
- package/lib/features/shopping/chat/openShopNative.js +60 -0
- package/lib/features/shopping/chat/openShopNative.js.map +1 -0
- package/lib/features/travel/nativeTravelRegistry.js +15 -0
- package/lib/features/travel/nativeTravelRegistry.js.map +1 -0
- package/lib/graphql/typePolicies.js +35 -1
- package/lib/graphql/typePolicies.js.map +1 -1
- package/lib/hooks/useCdecliChannel.js +10 -8
- package/lib/hooks/useCdecliChannel.js.map +1 -1
- package/lib/hooks/useChatStream.js +13 -6
- package/lib/hooks/useChatStream.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/routes.json +58 -3
- package/lib/screens/CanvasBoard/index.js +6 -1
- package/lib/screens/CanvasBoard/index.js.map +1 -1
- package/lib/screens/Chat/index.js +44 -5
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js +58 -21
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/ShoppingNative/index.js +23 -2
- package/lib/screens/ShoppingNative/index.js.map +1 -1
- package/lib/screens/ShoppingNative/useShoppingHostChat.js +66 -0
- package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -0
- package/lib/screens/TravelNative/index.js +70 -0
- package/lib/screens/TravelNative/index.js.map +1 -0
- package/lib/screens/TravelNative/useTravelHostChat.js +66 -0
- package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -0
- package/lib/services/brainQuickReply.js +72 -2
- package/lib/services/brainQuickReply.js.map +1 -1
- package/lib/utils/drawerNavigation.js +42 -0
- package/lib/utils/drawerNavigation.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTravelHostChat.js","sources":["../../../src/screens/TravelNative/useTravelHostChat.ts"],"sourcesContent":["/**\n * Host chat lane for native Travel Agent — same role as web `services.hostChat`.\n * Lives on the Travel screen (MF host), not in the travel remote.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useRoute } from '@react-navigation/native';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { useChatStream, type MessageAttachment, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport type { AgentChatMessage } from '../../features/agent-chat';\nimport type { TravelHostChat } from '../../features/travel/hostChat';\n\nconst TESTING_PROJECT_UUID = '9a8ac704-1040-4836-9b72-48b771ca91b1';\n\nexport function useTravelHostChat(): TravelHostChat {\n const route = useRoute<any>();\n const routeOrg = typeof route?.params?.orgName === 'string' ? route.params.orgName.trim() : '';\n const { orgName, projectId } = usePrerequisiteIds();\n const effectiveOrg = routeOrg || orgName || '';\n const submitProjectId = projectId || TESTING_PROJECT_UUID;\n\n const [channelId] = useState(() => uuidv4());\n const createdRef = useRef(false);\n const { createChannel } = useChatMutations();\n\n const cdecli = useCdecliConnection();\n useEffect(() => {\n cdecli.setActiveChannelId(channelId);\n return undefined;\n }, [channelId, cdecli.setActiveChannelId]);\n\n useEffect(() => {\n if (createdRef.current || !effectiveOrg) return;\n createdRef.current = true;\n void createChannel({\n id: channelId,\n title: `chat-channel-${channelId}`,\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName: effectiveOrg,\n projectId: submitProjectId,\n } as never).catch((err) => {\n console.error('[TravelNative] createChannel failed:', err);\n });\n }, [channelId, createChannel, effectiveOrg, submitProjectId]);\n\n const persistenceMode = cdecli.persistenceMode ?? 'backend';\n const chatRouting: UseChatStreamRouting = useMemo(\n () => ({\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode,\n recoverAgentAuth: cdecli.recoverAgentAuth,\n }),\n [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode],\n );\n\n const chat = useChatStream(channelId, chatRouting);\n\n const messages: AgentChatMessage[] = useMemo(\n () =>\n chat.messages.map((m, index) => ({\n id: `${m.role}-${index}`,\n role: m.role,\n content: m.content,\n attachments: m.attachments,\n })),\n [chat.messages],\n );\n\n const send = useCallback(\n (text: string, attachments?: MessageAttachment[]) => {\n void chat.sendMessage(text, attachments, channelId);\n },\n [chat, channelId],\n );\n\n return useMemo(\n () => ({\n messages,\n streaming: chat.response || null,\n busy: chat.isLoading || chat.isStreaming,\n error: chat.error,\n connected: cdecli.channelConnected,\n send,\n clear: chat.clearMessages,\n }),\n [\n messages,\n chat.response,\n chat.isLoading,\n chat.isStreaming,\n chat.error,\n cdecli.channelConnected,\n send,\n chat.clearMessages,\n ],\n );\n}\n"],"names":["uuidv4"],"mappings":"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"}
|
|
@@ -1,4 +1,20 @@
|
|
|
1
|
-
import {config}from'../config/env-config.js';
|
|
1
|
+
import {config}from'../config/env-config.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
|
+
const BRAIN_PATH = "/resources/yantra-brain-classify";
|
|
2
18
|
const DEFAULT_TIMEOUT_MS = 15e3;
|
|
3
19
|
function brainEndpoint() {
|
|
4
20
|
const base = (config.CLIENT_URL || "").trim().replace(/\/+$/, "");
|
|
@@ -38,4 +54,58 @@ async function quickReplyViaBrain(text, opts = {}) {
|
|
|
38
54
|
} finally {
|
|
39
55
|
clearTimeout(timeout);
|
|
40
56
|
}
|
|
41
|
-
}
|
|
57
|
+
}
|
|
58
|
+
const CLASSIFY_TIMEOUT_MS = 2e3;
|
|
59
|
+
async function postBrainJson(text, extra, timeoutMs, signal) {
|
|
60
|
+
const trimmed = (text || "").trim();
|
|
61
|
+
const endpoint = brainEndpoint();
|
|
62
|
+
if (!trimmed || !endpoint) return null;
|
|
63
|
+
const controller = new AbortController();
|
|
64
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
65
|
+
if (signal) {
|
|
66
|
+
if (signal.aborted) controller.abort();
|
|
67
|
+
else signal.addEventListener("abort", () => controller.abort(), {
|
|
68
|
+
once: true
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
const res = await fetch(endpoint, {
|
|
73
|
+
method: "POST",
|
|
74
|
+
headers: {
|
|
75
|
+
"Content-Type": "application/json"
|
|
76
|
+
},
|
|
77
|
+
body: JSON.stringify(__spreadValues({
|
|
78
|
+
text: trimmed.slice(0, 4e3)
|
|
79
|
+
}, extra)),
|
|
80
|
+
signal: controller.signal
|
|
81
|
+
});
|
|
82
|
+
if (!res.ok) return null;
|
|
83
|
+
return await res.json();
|
|
84
|
+
} catch (e) {
|
|
85
|
+
return null;
|
|
86
|
+
} finally {
|
|
87
|
+
clearTimeout(timeout);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function classifyIntentViaBrain(text, opts = {}) {
|
|
91
|
+
var _a;
|
|
92
|
+
const data = await postBrainJson(text, {}, (_a = opts.timeoutMs) != null ? _a : CLASSIFY_TIMEOUT_MS, opts.signal);
|
|
93
|
+
const intent = typeof (data == null ? void 0 : data.intent) === "string" ? data.intent.trim().toLowerCase() : "";
|
|
94
|
+
if (!intent) return null;
|
|
95
|
+
return {
|
|
96
|
+
intent,
|
|
97
|
+
confidence: typeof (data == null ? void 0 : data.confidence) === "number" ? data.confidence : void 0
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
async function parseShoppingViaBrain(text, opts = {}) {
|
|
101
|
+
var _a;
|
|
102
|
+
const data = await postBrainJson(text, {
|
|
103
|
+
task: "shopping"
|
|
104
|
+
}, (_a = opts.timeoutMs) != null ? _a : CLASSIFY_TIMEOUT_MS, opts.signal);
|
|
105
|
+
const payload = data == null ? void 0 : data.intent;
|
|
106
|
+
if (!payload || typeof payload !== "object") return null;
|
|
107
|
+
const query = typeof payload.query === "string" ? payload.query.trim() : "";
|
|
108
|
+
return query ? {
|
|
109
|
+
query
|
|
110
|
+
} : null;
|
|
111
|
+
}export{brainEndpoint,classifyIntentViaBrain,parseShoppingViaBrain,quickReplyViaBrain};//# sourceMappingURL=brainQuickReply.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brainQuickReply.js","sources":["../../src/services/brainQuickReply.ts"],"sourcesContent":["/**\n * brainQuickReply - a fast first answer from `yantra-brain` while the real agent works.\n *\n * On mobile the first turn of a session is the slow one: the agent session has to\n * bootstrap (sandbox, connectors, memory) before a single delta arrives, and on a\n * cold pod that can run to minutes. The web client only reaches for the brain after\n * the full 300s stall budget expires; mobile did not reach for it at all, so a user\n * saw nothing, then an error. This asks the brain the SAME question in parallel and\n * paints its answer as a provisional reply the moment it lands. When the agent's\n * stream starts, that provisional text is replaced in place - the brain fills the\n * silence, it never wins over the real answer.\n *\n * The brain proxy is the web app's same-origin Remix resource route\n * (`/resources/yantra-brain-classify`, `task: 'assist'`). Mobile has no same\n * origin, so it targets the web app's public URL (CLIENT_URL) explicitly. The\n * route holds the model, prompt and secret server-side - the phone still never\n * sees a provider key.\n *\n * Best-effort and never throws: null on timeout, network error or empty answer.\n */\nimport { config } from '../config/env-config';\n\nconst BRAIN_PATH = '/resources/yantra-brain-classify';\n\n// Server-side upstream cap is ASSIST_TIMEOUT_MS (12s); give the phone headroom\n// past it so a slow-but-successful answer is not aborted at the same instant.\nconst DEFAULT_TIMEOUT_MS = 15000;\n\n/** The web app origin that serves the brain proxy, or '' when unconfigured. */\nexport function brainEndpoint(): string {\n const base = (config.CLIENT_URL || '').trim().replace(/\\/+$/, '');\n return base ? `${base}${BRAIN_PATH}` : '';\n}\n\nexport async function quickReplyViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<string | null> {\n const trimmed = (text || '').trim();\n const endpoint = brainEndpoint();\n if (!trimmed || !endpoint) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), opts.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n if (opts.signal) {\n if (opts.signal.aborted) controller.abort();\n else opts.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text: trimmed.slice(0, 4000), task: 'assist' }),\n signal: controller.signal,\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { answer?: string | null };\n const answer = typeof data?.answer === 'string' ? data.answer.trim() : '';\n return answer || null;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"brainQuickReply.js","sources":["../../src/services/brainQuickReply.ts"],"sourcesContent":["/**\n * brainQuickReply - a fast first answer from `yantra-brain` while the real agent works.\n *\n * On mobile the first turn of a session is the slow one: the agent session has to\n * bootstrap (sandbox, connectors, memory) before a single delta arrives, and on a\n * cold pod that can run to minutes. The web client only reaches for the brain after\n * the full 300s stall budget expires; mobile did not reach for it at all, so a user\n * saw nothing, then an error. This asks the brain the SAME question in parallel and\n * paints its answer as a provisional reply the moment it lands. When the agent's\n * stream starts, that provisional text is replaced in place - the brain fills the\n * silence, it never wins over the real answer.\n *\n * The brain proxy is the web app's same-origin Remix resource route\n * (`/resources/yantra-brain-classify`, `task: 'assist'`). Mobile has no same\n * origin, so it targets the web app's public URL (CLIENT_URL) explicitly. The\n * route holds the model, prompt and secret server-side - the phone still never\n * sees a provider key.\n *\n * Best-effort and never throws: null on timeout, network error or empty answer.\n */\nimport { config } from '../config/env-config';\n\nconst BRAIN_PATH = '/resources/yantra-brain-classify';\n\n// Server-side upstream cap is ASSIST_TIMEOUT_MS (12s); give the phone headroom\n// past it so a slow-but-successful answer is not aborted at the same instant.\nconst DEFAULT_TIMEOUT_MS = 15000;\n\n/** The web app origin that serves the brain proxy, or '' when unconfigured. */\nexport function brainEndpoint(): string {\n const base = (config.CLIENT_URL || '').trim().replace(/\\/+$/, '');\n return base ? `${base}${BRAIN_PATH}` : '';\n}\n\nexport async function quickReplyViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<string | null> {\n const trimmed = (text || '').trim();\n const endpoint = brainEndpoint();\n if (!trimmed || !endpoint) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), opts.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n if (opts.signal) {\n if (opts.signal.aborted) controller.abort();\n else opts.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text: trimmed.slice(0, 4000), task: 'assist' }),\n signal: controller.signal,\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { answer?: string | null };\n const answer = typeof data?.answer === 'string' ? data.answer.trim() : '';\n return answer || null;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport interface BrainIntent {\n intent: string;\n confidence?: number;\n}\n\nconst CLASSIFY_TIMEOUT_MS = 2000;\n\nasync function postBrainJson(\n text: string,\n extra: Record<string, unknown>,\n timeoutMs: number,\n signal?: AbortSignal,\n): Promise<Record<string, unknown> | null> {\n const trimmed = (text || '').trim();\n const endpoint = brainEndpoint();\n if (!trimmed || !endpoint) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n if (signal) {\n if (signal.aborted) controller.abort();\n else signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text: trimmed.slice(0, 4000), ...extra }),\n signal: controller.signal,\n });\n if (!res.ok) return null;\n return (await res.json()) as Record<string, unknown>;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/** cdecli yantra-brain classify — same default task as web intentRouter. */\nexport async function classifyIntentViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<BrainIntent | null> {\n const data = await postBrainJson(text, {}, opts.timeoutMs ?? CLASSIFY_TIMEOUT_MS, opts.signal);\n const intent = typeof data?.intent === 'string' ? data.intent.trim().toLowerCase() : '';\n if (!intent) return null;\n return {\n intent,\n confidence: typeof data?.confidence === 'number' ? data.confidence : undefined,\n };\n}\n\n/** cdecli shopping parse — `task: 'shopping'`. */\nexport async function parseShoppingViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<{ query: string } | null> {\n const data = await postBrainJson(text, { task: 'shopping' }, opts.timeoutMs ?? CLASSIFY_TIMEOUT_MS, opts.signal);\n const payload = data?.intent;\n if (!payload || typeof payload !== 'object') return null;\n const query =\n typeof (payload as { query?: unknown }).query === 'string' ? (payload as { query: string }).query.trim() : '';\n return query ? { query } : null;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import {DrawerActions}from'@react-navigation/native';function findDrawerNavigation(navigation) {
|
|
2
|
+
var _a, _b, _c;
|
|
3
|
+
let current = navigation;
|
|
4
|
+
for (let i = 0; i < 12 && current; i += 1) {
|
|
5
|
+
if (typeof current.openDrawer === "function" || ((_b = (_a = current.getState) == null ? void 0 : _a.call(current)) == null ? void 0 : _b.type) === "drawer") {
|
|
6
|
+
return current;
|
|
7
|
+
}
|
|
8
|
+
current = (_c = current.getParent) == null ? void 0 : _c.call(current);
|
|
9
|
+
}
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
function dispatchDrawerAction(navigation, action) {
|
|
13
|
+
var _a, _b, _c;
|
|
14
|
+
const drawer = findDrawerNavigation(navigation);
|
|
15
|
+
if (!drawer) return;
|
|
16
|
+
if (action === "open" && typeof drawer.openDrawer === "function") {
|
|
17
|
+
drawer.openDrawer();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (action === "close" && typeof drawer.closeDrawer === "function") {
|
|
21
|
+
drawer.closeDrawer();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (action === "toggle" && typeof drawer.toggleDrawer === "function") {
|
|
25
|
+
drawer.toggleDrawer();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (((_b = (_a = drawer.getState) == null ? void 0 : _a.call(drawer)) == null ? void 0 : _b.type) !== "drawer") return;
|
|
29
|
+
const creator = action === "open" ? DrawerActions.openDrawer : action === "close" ? DrawerActions.closeDrawer : DrawerActions.toggleDrawer;
|
|
30
|
+
(_c = drawer.dispatch) == null ? void 0 : _c.call(drawer, creator());
|
|
31
|
+
}
|
|
32
|
+
function resetDrawerClosed(navigation) {
|
|
33
|
+
dispatchDrawerAction(navigation, "close");
|
|
34
|
+
requestAnimationFrame(() => {
|
|
35
|
+
dispatchDrawerAction(navigation, "close");
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function afterNativeModalClose(run) {
|
|
39
|
+
requestAnimationFrame(() => {
|
|
40
|
+
setTimeout(run, 40);
|
|
41
|
+
});
|
|
42
|
+
}export{afterNativeModalClose,dispatchDrawerAction,findDrawerNavigation,resetDrawerClosed};//# sourceMappingURL=drawerNavigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drawerNavigation.js","sources":["../../src/utils/drawerNavigation.ts"],"sourcesContent":["import { DrawerActions } from '@react-navigation/native';\n\ntype NavLike = {\n openDrawer?: () => void;\n closeDrawer?: () => void;\n toggleDrawer?: () => void;\n getState?: () => { type?: string; history?: Array<{ type?: string }> } | undefined;\n getParent?: () => NavLike | undefined;\n dispatch?: (action: unknown) => void;\n};\n\nexport type DrawerAction = 'open' | 'close' | 'toggle';\n\n/**\n * Home / Chat live inside the workspace drawer; Canvas, Apps, and Shop are\n * nested (or sibling) routes. After those screens, `DrawerActions.openDrawer()`\n * on the focused navigator is a no-op, and a half-closed drawer leaves a\n * left-edge overlay that eats hamburger taps.\n */\nexport function findDrawerNavigation(navigation: NavLike | null | undefined): NavLike | null {\n let current: NavLike | null | undefined = navigation;\n for (let i = 0; i < 12 && current; i += 1) {\n if (typeof current.openDrawer === 'function' || current.getState?.()?.type === 'drawer') {\n return current;\n }\n current = current.getParent?.();\n }\n return null;\n}\n\n/** React Navigation records an open drawer as `{ type: 'drawer' }` in history. */\nexport function isDrawerOpen(navigation: NavLike | null | undefined): boolean {\n const history = findDrawerNavigation(navigation)?.getState?.()?.history;\n return Array.isArray(history) && history.some((entry) => entry?.type === 'drawer');\n}\n\nexport function dispatchDrawerAction(navigation: NavLike | null | undefined, action: DrawerAction): void {\n const drawer = findDrawerNavigation(navigation);\n // Apps / Canvas / Shop sit on the root stack (`/:orgName/apps`), not inside\n // `main_drawer`. Dispatching CLOSE_DRAWER there logs \"not handled by any\n // navigator\" and does not reset the leftover overlay.\n if (!drawer) return;\n if (action === 'open' && typeof drawer.openDrawer === 'function') {\n drawer.openDrawer();\n return;\n }\n if (action === 'close' && typeof drawer.closeDrawer === 'function') {\n drawer.closeDrawer();\n return;\n }\n if (action === 'toggle' && typeof drawer.toggleDrawer === 'function') {\n drawer.toggleDrawer();\n return;\n }\n if (drawer.getState?.()?.type !== 'drawer') return;\n const creator =\n action === 'open'\n ? DrawerActions.openDrawer\n : action === 'close'\n ? DrawerActions.closeDrawer\n : DrawerActions.toggleDrawer;\n drawer.dispatch?.(creator());\n}\n\n/**\n * Close twice: once now, once after the current frame. Interrupted drawer\n * animations (Canvas / video editor on top of the drawer) often leave a\n * sliver overlay that a single closeDrawer() does not clear.\n */\nexport function resetDrawerClosed(navigation: NavLike | null | undefined): void {\n dispatchDrawerAction(navigation, 'close');\n requestAnimationFrame(() => {\n dispatchDrawerAction(navigation, 'close');\n });\n}\n\n/** Navigate after RN Modal `visible` has gone false (avoids iOS overlay leaks). */\nexport function afterNativeModalClose(run: () => void): void {\n requestAnimationFrame(() => {\n setTimeout(run, 40);\n });\n}\n"],"names":[],"mappings":"qDAsBO,SAAS,qBAAqB,UAAwD,EAAA;AAtB7F,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAuBE,EAAA,IAAI,OAAsC,GAAA,UAAA;AAC1C,EAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,EAAM,IAAA,OAAA,EAAS,KAAK,CAAG,EAAA;AACzC,IAAI,IAAA,OAAO,QAAQ,UAAe,KAAA,UAAA,IAAA,CAAA,CAAc,mBAAQ,QAAR,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,OAAA,CAAA,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAsB,UAAS,QAAU,EAAA;AACvF,MAAO,OAAA,OAAA;AAAA;AAET,IAAA,OAAA,GAAA,CAAU,aAAQ,SAAR,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,OAAA,CAAA;AAAA;AAEZ,EAAO,OAAA,IAAA;AACT;AAOgB,SAAA,oBAAA,CAAqB,YAAwC,MAA4B,EAAA;AAtCzG,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAuCE,EAAM,MAAA,MAAA,GAAS,qBAAqB,UAAU,CAAA;AAI9C,EAAA,IAAI,CAAC,MAAQ,EAAA;AACb,EAAA,IAAI,MAAW,KAAA,MAAA,IAAU,OAAO,MAAA,CAAO,eAAe,UAAY,EAAA;AAChE,IAAA,MAAA,CAAO,UAAW,EAAA;AAClB,IAAA;AAAA;AAEF,EAAA,IAAI,MAAW,KAAA,OAAA,IAAW,OAAO,MAAA,CAAO,gBAAgB,UAAY,EAAA;AAClE,IAAA,MAAA,CAAO,WAAY,EAAA;AACnB,IAAA;AAAA;AAEF,EAAA,IAAI,MAAW,KAAA,QAAA,IAAY,OAAO,MAAA,CAAO,iBAAiB,UAAY,EAAA;AACpE,IAAA,MAAA,CAAO,YAAa,EAAA;AACpB,IAAA;AAAA;AAEF,EAAA,IAAA,CAAA,CAAI,EAAO,GAAA,CAAA,EAAA,GAAA,MAAA,CAAA,QAAA,KAAP,IAAqB,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,MAAA,CAAA,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,MAAS,QAAU,EAAA;AAC5C,EAAM,MAAA,OAAA,GAAU,WAAW,MAAS,GAAA,aAAA,CAAc,aAAa,MAAW,KAAA,OAAA,GAAU,aAAc,CAAA,WAAA,GAAc,aAAc,CAAA,YAAA;AAC9H,EAAO,CAAA,EAAA,GAAA,MAAA,CAAA,QAAA,KAAP,gCAAkB,OAAQ,EAAA,CAAA;AAC5B;AAOO,SAAS,kBAAkB,UAA8C,EAAA;AAC9E,EAAA,oBAAA,CAAqB,YAAY,OAAO,CAAA;AACxC,EAAA,qBAAA,CAAsB,MAAM;AAC1B,IAAA,oBAAA,CAAqB,YAAY,OAAO,CAAA;AAAA,GACzC,CAAA;AACH;AAGO,SAAS,sBAAsB,GAAuB,EAAA;AAC3D,EAAA,qBAAA,CAAsB,MAAM;AAC1B,IAAA,UAAA,CAAW,KAAK,EAAE,CAAA;AAAA,GACnB,CAAA;AACH"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminide-stack/yantra-mobile",
|
|
3
|
-
"version": "12.0.54-alpha.
|
|
3
|
+
"version": "12.0.54-alpha.11",
|
|
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.54-alpha.
|
|
28
|
+
"common": "12.0.54-alpha.11"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
31
31
|
"@admin-layout/gluestack-ui-mobile": "*",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"@messenger-box/platform-mobile": "*",
|
|
42
42
|
"@react-native-async-storage/async-storage": "*",
|
|
43
43
|
"@react-navigation/native": "*",
|
|
44
|
-
"common": "12.0.54-alpha.
|
|
44
|
+
"common": "12.0.54-alpha.7",
|
|
45
45
|
"expo-constants": "*",
|
|
46
46
|
"expo-secure-store": "*",
|
|
47
47
|
"lodash": "*",
|
|
@@ -57,5 +57,5 @@
|
|
|
57
57
|
"typescript": {
|
|
58
58
|
"definition": "lib/index.d.ts"
|
|
59
59
|
},
|
|
60
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "5153878e1e0cfc6d62ae294441e0e2cede668879"
|
|
61
61
|
}
|