@adminide-stack/yantra-mobile 12.0.28-alpha.73 → 12.0.28-alpha.75
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/config/constants.js +3 -1
- package/lib/config/constants.js.map +1 -1
- package/lib/config/env-config.js +2 -1
- package/lib/config/env-config.js.map +1 -1
- package/lib/features/audio-input/AudioRecorderPanel.js.map +1 -1
- package/lib/features/audio-input/useAudioPermission.js +23 -35
- package/lib/features/audio-input/useAudioPermission.js.map +1 -1
- package/lib/hooks/useCdecliAutoConnect.js +4 -2
- package/lib/hooks/useCdecliAutoConnect.js.map +1 -1
- package/lib/hooks/useCdecliChannel.js +18 -83
- package/lib/hooks/useCdecliChannel.js.map +1 -1
- package/lib/hooks/useChatApi.js +102 -50
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useChatStream.js +66 -241
- package/lib/hooks/useChatStream.js.map +1 -1
- package/lib/hooks/usePrerequisiteIds.js +87 -75
- package/lib/hooks/usePrerequisiteIds.js.map +1 -1
- package/lib/screens/Chat/index.js +19 -22
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js +49 -94
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/NewChat/index.js +8 -44
- package/lib/screens/NewChat/index.js.map +1 -1
- package/lib/utils/cdecodeUri.js +69 -0
- package/lib/utils/cdecodeUri.js.map +1 -0
- package/lib/utils/syncMobileOrgRouteContext.js +61 -0
- package/lib/utils/syncMobileOrgRouteContext.js.map +1 -0
- package/package.json +3 -3
- package/lib/api/chatApi.js +0 -102
- package/lib/api/chatApi.js.map +0 -1
|
@@ -1,101 +1,109 @@
|
|
|
1
|
-
import {DEFAULT_PRODUCTION_TAG_ID}from'@adminide-stack/core/lib/constants/defaultIds.js';import {
|
|
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 uuidToObjectId = (uuid) => uuid.replace(/-/g, "").substring(0, 24);
|
|
1
|
+
import {DEFAULT_PRODUCTION_TAG_ID}from'@adminide-stack/core/lib/constants/defaultIds.js';import {ContributionSchemaId}from'common';import {useGetContextDataQuery,useAccountProfileQuery,useGetUserOrganizationsWithDetailsQuery,useGetPageSettingsQuery,useGetProjectsLazyQuery,useQuickCreateProjectForAccountBkMutation,useCreateVaultMutation}from'common/graphql';import {useMemo,useEffect,useState,useRef}from'react';import {isUnhydratedCdecodeUri,toUriInput,settingsUriForOrg}from'../utils/cdecodeUri.js';const uuidToObjectId = (uuid) => uuid.replace(/-/g, "").substring(0, 24);
|
|
18
2
|
const PROJECT_NAME = "DEFAULT_YANTRA_PROJECT";
|
|
19
3
|
const TAG_ID = uuidToObjectId(DEFAULT_PRODUCTION_TAG_ID);
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
function
|
|
27
|
-
|
|
28
|
-
if (
|
|
29
|
-
return {
|
|
30
|
-
scheme: uri.scheme,
|
|
31
|
-
authority: typeof uri.authority === "string" ? uri.authority : "default",
|
|
32
|
-
path: uri.path || "/",
|
|
33
|
-
fragment: typeof uri.fragment === "string" ? uri.fragment : "settings"
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
if (uri && typeof uri.external === "string") {
|
|
4
|
+
function getProjectValue(value) {
|
|
5
|
+
if (!value) return "";
|
|
6
|
+
if (typeof value.project === "string") return value.project.trim();
|
|
7
|
+
if (typeof value.projectId === "string") return value.projectId.trim();
|
|
8
|
+
return "";
|
|
9
|
+
}
|
|
10
|
+
function parseAccountDefaultSettings(settings) {
|
|
11
|
+
if (settings == null) return void 0;
|
|
12
|
+
if (typeof settings === "string") {
|
|
37
13
|
try {
|
|
38
|
-
|
|
39
|
-
return {
|
|
40
|
-
scheme: parsed.protocol.replace(":", "") || "cdecode",
|
|
41
|
-
authority: parsed.hostname || "default",
|
|
42
|
-
path: parsed.pathname || "/",
|
|
43
|
-
fragment: parsed.hash ? parsed.hash.replace("#", "") : "settings"
|
|
44
|
-
};
|
|
14
|
+
return JSON.parse(settings);
|
|
45
15
|
} catch (e) {
|
|
46
|
-
return
|
|
16
|
+
return void 0;
|
|
47
17
|
}
|
|
48
18
|
}
|
|
49
|
-
|
|
19
|
+
if (typeof settings === "object") {
|
|
20
|
+
return settings;
|
|
21
|
+
}
|
|
22
|
+
return void 0;
|
|
23
|
+
}
|
|
24
|
+
function pickDefaultOrgSlug(orgs) {
|
|
25
|
+
var _a, _b;
|
|
26
|
+
if (!(orgs == null ? void 0 : orgs.length)) return null;
|
|
27
|
+
const first = orgs.find((o) => typeof (o == null ? void 0 : o.name) === "string" && o.name.trim().length > 0);
|
|
28
|
+
return (_b = (_a = first == null ? void 0 : first.name) == null ? void 0 : _a.trim()) != null ? _b : null;
|
|
50
29
|
}
|
|
51
30
|
function usePrerequisiteIds() {
|
|
52
31
|
var _a, _b, _c;
|
|
53
|
-
const getProjectValue = (value) => {
|
|
54
|
-
if (!value) return "";
|
|
55
|
-
if (typeof value.project === "string") return value.project.trim();
|
|
56
|
-
if (typeof value.projectId === "string") return value.projectId.trim();
|
|
57
|
-
return "";
|
|
58
|
-
};
|
|
59
32
|
const {
|
|
60
33
|
data: contextData,
|
|
61
|
-
loading: contextLoading
|
|
34
|
+
loading: contextLoading,
|
|
35
|
+
refetch: refetchContext
|
|
62
36
|
} = useGetContextDataQuery();
|
|
63
37
|
const cdecodeUri = (_a = contextData == null ? void 0 : contextData.getContextData) == null ? void 0 : _a.cdecodeUri;
|
|
64
|
-
const settingsResourceUri = toUriInput(cdecodeUri);
|
|
65
38
|
const {
|
|
66
|
-
|
|
67
|
-
loading:
|
|
68
|
-
} =
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
39
|
+
data: accountProfileData,
|
|
40
|
+
loading: userLoading
|
|
41
|
+
} = useAccountProfileQuery();
|
|
42
|
+
const userId = (_c = (_b = accountProfileData == null ? void 0 : accountProfileData.accountProfile) == null ? void 0 : _b.user) == null ? void 0 : _c.id;
|
|
43
|
+
const {
|
|
44
|
+
data: orgsData,
|
|
45
|
+
loading: orgsLoading,
|
|
46
|
+
refetch: refetchOrgs
|
|
47
|
+
} = useGetUserOrganizationsWithDetailsQuery({
|
|
48
|
+
skip: !userId,
|
|
49
|
+
fetchPolicy: "cache-and-network"
|
|
75
50
|
});
|
|
76
|
-
const
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
51
|
+
const orgFromMembership = useMemo(() => pickDefaultOrgSlug(orgsData == null ? void 0 : orgsData.getUserOrganizationsWithDetails), [orgsData]);
|
|
52
|
+
const orgFromContextPath = useMemo(() => {
|
|
53
|
+
var _a2;
|
|
54
|
+
if (isUnhydratedCdecodeUri(cdecodeUri)) return null;
|
|
55
|
+
const path = toUriInput(cdecodeUri).path;
|
|
56
|
+
const match = path.match(/^\/([^/]+)\//);
|
|
57
|
+
return ((_a2 = match == null ? void 0 : match[1]) == null ? void 0 : _a2.trim()) || null;
|
|
58
|
+
}, [cdecodeUri]);
|
|
59
|
+
const resolvedOrgSlug = orgFromMembership || orgFromContextPath || null;
|
|
60
|
+
const settingsResourceUri = useMemo(() => {
|
|
61
|
+
if (resolvedOrgSlug) {
|
|
62
|
+
return settingsUriForOrg(resolvedOrgSlug);
|
|
82
63
|
}
|
|
83
|
-
|
|
64
|
+
return null;
|
|
65
|
+
}, [resolvedOrgSlug]);
|
|
66
|
+
const {
|
|
67
|
+
data: pageSettingsData,
|
|
68
|
+
loading: pageSettingsLoading
|
|
69
|
+
} = useGetPageSettingsQuery({
|
|
70
|
+
variables: {
|
|
71
|
+
resourceUri: settingsResourceUri,
|
|
72
|
+
options: {
|
|
73
|
+
schemaId: ContributionSchemaId.Configuration,
|
|
74
|
+
configKey: "account.default",
|
|
75
|
+
includeMarketplace: true
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
skip: !settingsResourceUri,
|
|
79
|
+
fetchPolicy: "cache-and-network"
|
|
80
|
+
});
|
|
81
|
+
const accountDefault = useMemo(() => {
|
|
82
|
+
var _a2;
|
|
83
|
+
return parseAccountDefaultSettings((_a2 = pageSettingsData == null ? void 0 : pageSettingsData.pageSettings) == null ? void 0 : _a2.settings);
|
|
84
|
+
}, [pageSettingsData]);
|
|
84
85
|
const orgFromSettings = typeof (accountDefault == null ? void 0 : accountDefault.organization) === "string" ? accountDefault.organization.trim() : "";
|
|
85
86
|
const projectFromSettings = getProjectValue(accountDefault);
|
|
86
|
-
const orgName = orgFromSettings || null;
|
|
87
|
+
const orgName = orgFromSettings || resolvedOrgSlug || null;
|
|
87
88
|
const rawSettingsProjectId = projectFromSettings || null;
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
if (!orgName) return;
|
|
91
|
+
refetchContext().catch(() => void 0);
|
|
92
|
+
}, [orgName, refetchContext]);
|
|
93
|
+
useEffect(() => {
|
|
94
|
+
if (orgFromMembership) return;
|
|
95
|
+
if (!userId) return;
|
|
96
|
+
const timer = setInterval(() => {
|
|
97
|
+
refetchOrgs().catch(() => void 0);
|
|
98
|
+
}, 2e3);
|
|
99
|
+
return () => clearInterval(timer);
|
|
100
|
+
}, [orgFromMembership, userId, refetchOrgs]);
|
|
88
101
|
const settingsProjectId = rawSettingsProjectId;
|
|
89
102
|
const [resolvedProjectId, setResolvedProjectId] = useState(null);
|
|
90
103
|
const [isInitializingProject, setIsInitializingProject] = useState(false);
|
|
91
104
|
const isCreatingRef = useRef(false);
|
|
92
105
|
const projectId = settingsProjectId || resolvedProjectId;
|
|
93
|
-
const needsProjectCreation =
|
|
94
|
-
const {
|
|
95
|
-
data: accountProfileData,
|
|
96
|
-
loading: userLoading
|
|
97
|
-
} = useAccountProfileQuery();
|
|
98
|
-
const userId = (_c = (_b = accountProfileData == null ? void 0 : accountProfileData.accountProfile) == null ? void 0 : _b.user) == null ? void 0 : _c.id;
|
|
106
|
+
const needsProjectCreation = !!orgName && !rawSettingsProjectId && !projectId;
|
|
99
107
|
const [fetchProjects] = useGetProjectsLazyQuery();
|
|
100
108
|
const [createProject, {
|
|
101
109
|
error: createError,
|
|
@@ -166,13 +174,17 @@ function usePrerequisiteIds() {
|
|
|
166
174
|
}
|
|
167
175
|
});
|
|
168
176
|
}, [createProject, createVault, fetchProjects, needsProjectCreation, orgName, userId, userLoading]);
|
|
169
|
-
const
|
|
177
|
+
const isOrgLoading = !orgName && (userLoading || orgsLoading);
|
|
178
|
+
const isProjectLoading = !!orgName && !rawSettingsProjectId && !projectId && (isInitializingProject || projectCreating);
|
|
179
|
+
const isLoading = isOrgLoading || isProjectLoading;
|
|
170
180
|
return {
|
|
171
181
|
projectId,
|
|
172
182
|
orgName,
|
|
173
183
|
accountUserId: userId != null ? userId : null,
|
|
174
184
|
tagId: TAG_ID,
|
|
175
185
|
loading: isLoading,
|
|
186
|
+
/** True while org slug is still unknown (Home should wait before syncing route). */
|
|
187
|
+
orgLoading: isOrgLoading,
|
|
176
188
|
errors: {
|
|
177
189
|
createError,
|
|
178
190
|
vaultCreateError
|
|
@@ -1 +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 { useSettings } from '@adminide-stack/platform-client';\nimport { ContributionSchemaId } from 'common';\nimport {\n useAccountProfileQuery,\n useCreateVaultMutation,\n useGetContextDataQuery,\n useGetProjectsLazyQuery,\n useQuickCreateProjectForAccountBkMutation,\n} from 'common/graphql';\nimport { useEffect, useRef, useState } from 'react';\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);\nconst FALLBACK_SETTINGS_URI = {\n scheme: 'cdecode',\n authority: 'default',\n path: '/',\n fragment: 'settings',\n} as const;\n\ntype UriLike = {\n scheme?: unknown;\n authority?: unknown;\n path?: unknown;\n fragment?: unknown;\n external?: unknown;\n};\n\nfunction toUriInput(value: unknown): { scheme: string; authority: string; path: string; fragment: string } {\n const uri = value as UriLike | undefined;\n if (uri && typeof uri.scheme === 'string' && typeof uri.path === 'string') {\n return {\n scheme: uri.scheme,\n authority: typeof uri.authority === 'string' ? uri.authority : 'default',\n path: uri.path || '/',\n fragment: typeof uri.fragment === 'string' ? uri.fragment : 'settings',\n };\n }\n\n if (uri && typeof uri.external === 'string') {\n try {\n const parsed = new URL(uri.external);\n return {\n scheme: parsed.protocol.replace(':', '') || 'cdecode',\n authority: parsed.hostname || 'default',\n path: parsed.pathname || '/',\n fragment: parsed.hash ? parsed.hash.replace('#', '') : 'settings',\n };\n } catch {\n return { ...FALLBACK_SETTINGS_URI };\n }\n }\n\n return { ...FALLBACK_SETTINGS_URI };\n}\n\n/**\n * Same data as web: org + project public UUID from `account.default`, loaded via\n * `useSettings` (Apollo page settings). On mobile we use `useGetContextDataQuery`\n * for `cdecodeUri` instead of Remix loader data (useSettingsLoader is web-oriented).\n */\nexport function usePrerequisiteIds() {\n const getProjectValue = (value: { project?: unknown; projectId?: unknown } | undefined): string => {\n if (!value) return '';\n if (typeof value.project === 'string') return value.project.trim();\n if (typeof value.projectId === 'string') return value.projectId.trim();\n return '';\n };\n\n const { data: contextData, loading: contextLoading } = useGetContextDataQuery();\n const cdecodeUri = contextData?.getContextData?.cdecodeUri;\n const settingsResourceUri = toUriInput(cdecodeUri);\n\n /**\n * `useSettings({configKey})` from `@adminide-stack/platform-client` returns\n * `data` via `get(pageSettings.settings, configKey)`, which doesn't match the\n * mobile/Apollo response shape: the backend already filters by `configKey`\n * and returns the flat value as `pageSettings.settings` (e.g.\n * `{organization, project}`). So `data` is always `undefined` for\n * `account.default` here. Read the raw `settings` field instead — that's the\n * value of `account.default` directly. (Web uses `useSettingsLoader` which\n * returns the value through Remix loader data, hence its different access.)\n */\n const { settings: accountDefaultSettings, loading: accountSettingsLoading } = useSettings({\n resourceUri: settingsResourceUri as never,\n options: {\n schemaId: ContributionSchemaId.Configuration,\n configKey: 'account.default',\n includeMarketplace: true,\n },\n });\n\n const settingsLoading = contextLoading || accountSettingsLoading;\n\n const accountDefault =\n typeof accountDefaultSettings === 'string'\n ? (() => {\n try {\n return JSON.parse(accountDefaultSettings) as {\n organization?: unknown;\n project?: unknown;\n projectId?: unknown;\n };\n } catch {\n return undefined;\n }\n })()\n : (accountDefaultSettings as\n | { organization?: unknown; project?: unknown; projectId?: unknown }\n | undefined);\n\n const orgFromSettings = typeof accountDefault?.organization === 'string' ? accountDefault.organization.trim() : '';\n const projectFromSettings = getProjectValue(accountDefault);\n\n const orgName = orgFromSettings || null;\n const rawSettingsProjectId = projectFromSettings || null;\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 = !settingsLoading && !!orgName && !rawSettingsProjectId && !projectId;\n\n const { data: accountProfileData, loading: userLoading } = useAccountProfileQuery();\n const userId = accountProfileData?.accountProfile?.user?.id;\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 || !userId || userLoading) {\n return;\n }\n\n isCreatingRef.current = true;\n setIsInitializingProject(true);\n\n createProject({\n variables: {\n input: {\n accountId: userId,\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, userId, userLoading]);\n\n const isLoading =\n settingsLoading ||\n isInitializingProject ||\n (!rawSettingsProjectId && !projectId && (userLoading || projectCreating));\n\n return {\n projectId,\n orgName,\n accountUserId: userId ?? null,\n tagId: TAG_ID,\n loading: isLoading,\n errors: { createError, vaultCreateError },\n };\n}\n"],"names":["_a"],"mappings":"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"}
|
|
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 { ContributionSchemaId } from 'common';\nimport {\n useAccountProfileQuery,\n useCreateVaultMutation,\n useGetContextDataQuery,\n useGetPageSettingsQuery,\n useGetProjectsLazyQuery,\n useGetUserOrganizationsWithDetailsQuery,\n useQuickCreateProjectForAccountBkMutation,\n} from 'common/graphql';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { isUnhydratedCdecodeUri, settingsUriForOrg, 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\nfunction getProjectValue(value: { project?: unknown; projectId?: unknown } | undefined): string {\n if (!value) return '';\n if (typeof value.project === 'string') return value.project.trim();\n if (typeof value.projectId === 'string') return value.projectId.trim();\n return '';\n}\n\nfunction parseAccountDefaultSettings(settings: unknown):\n | {\n organization?: unknown;\n project?: unknown;\n projectId?: unknown;\n }\n | undefined {\n if (settings == null) return undefined;\n if (typeof settings === 'string') {\n try {\n return JSON.parse(settings) as {\n organization?: unknown;\n project?: unknown;\n projectId?: unknown;\n };\n } catch {\n return undefined;\n }\n }\n if (typeof settings === 'object') {\n return settings as { organization?: unknown; project?: unknown; projectId?: unknown };\n }\n return undefined;\n}\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 * After verify-user, `account.default` at `cdecode://default/#settings` fails with\n * \"resourceId is missing\". The user's org slug is resolved from\n * `getUserOrganizationsWithDetails` first, then `pageSettings` is queried at\n * `cdecode://default/{org}/#settings`.\n */\nexport function usePrerequisiteIds() {\n const { data: contextData, loading: contextLoading, refetch: refetchContext } = useGetContextDataQuery();\n const cdecodeUri = contextData?.getContextData?.cdecodeUri;\n\n const { data: accountProfileData, loading: userLoading } = useAccountProfileQuery();\n const userId = accountProfileData?.accountProfile?.user?.id;\n\n const {\n data: orgsData,\n loading: orgsLoading,\n refetch: refetchOrgs,\n } = useGetUserOrganizationsWithDetailsQuery({\n skip: !userId,\n fetchPolicy: 'cache-and-network',\n });\n\n const orgFromMembership = useMemo(() => pickDefaultOrgSlug(orgsData?.getUserOrganizationsWithDetails), [orgsData]);\n\n const orgFromContextPath = useMemo(() => {\n if (isUnhydratedCdecodeUri(cdecodeUri)) return null;\n const path = toUriInput(cdecodeUri).path;\n const match = path.match(/^\\/([^/]+)\\//);\n return match?.[1]?.trim() || null;\n }, [cdecodeUri]);\n\n const resolvedOrgSlug = orgFromMembership || orgFromContextPath || null;\n\n const settingsResourceUri = useMemo(() => {\n if (resolvedOrgSlug) {\n return settingsUriForOrg(resolvedOrgSlug);\n }\n return null;\n }, [resolvedOrgSlug]);\n\n const { data: pageSettingsData, loading: pageSettingsLoading } = useGetPageSettingsQuery({\n variables: {\n resourceUri: settingsResourceUri as never,\n options: {\n schemaId: ContributionSchemaId.Configuration,\n configKey: 'account.default',\n includeMarketplace: true,\n },\n },\n skip: !settingsResourceUri,\n fetchPolicy: 'cache-and-network',\n });\n\n const accountDefault = useMemo(\n () => parseAccountDefaultSettings(pageSettingsData?.pageSettings?.settings),\n [pageSettingsData],\n );\n\n const orgFromSettings = typeof accountDefault?.organization === 'string' ? accountDefault.organization.trim() : '';\n const projectFromSettings = getProjectValue(accountDefault);\n\n const orgName = orgFromSettings || resolvedOrgSlug || null;\n const rawSettingsProjectId = projectFromSettings || null;\n\n useEffect(() => {\n if (!orgName) return;\n refetchContext().catch(() => undefined);\n }, [orgName, refetchContext]);\n\n useEffect(() => {\n if (orgFromMembership) return;\n if (!userId) return;\n const timer = setInterval(() => {\n refetchOrgs().catch(() => undefined);\n }, 2000);\n return () => clearInterval(timer);\n }, [orgFromMembership, userId, refetchOrgs]);\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 || !userId || userLoading) {\n return;\n }\n\n isCreatingRef.current = true;\n setIsInitializingProject(true);\n\n createProject({\n variables: {\n input: {\n accountId: userId,\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, userId, userLoading]);\n\n const isOrgLoading = !orgName && (userLoading || orgsLoading);\n const isProjectLoading =\n !!orgName && !rawSettingsProjectId && !projectId && (isInitializingProject || projectCreating);\n\n const isLoading = isOrgLoading || isProjectLoading;\n\n return {\n projectId,\n orgName,\n accountUserId: userId ?? 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"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsxs,jsx}from'react/jsx-runtime';import {useMemo,useState,useEffect,useRef,useCallback}from'react';import {useColorScheme,useWindowDimensions,Platform,Keyboard,TouchableWithoutFeedback,StyleSheet,View}from'react-native';import {getDefaultLeftItems,getDefaultRightItems,Box,Text,InputToolBar}from'@admin-layout/gluestack-ui-mobile';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {useNavigation,useRoute}from'@react-navigation/native';import {MessagesContainerUI}from'@messenger-box/platform-mobile';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatStream}from'../../hooks/useChatStream.js';import {YantraBrandLoader,YANTRA_LOADER_SIZE_COMPACT}from'../../components/YantraBrandLoader.js';import ThinkingIndicator from'../../components/ThinkingIndicator.js';import {mobileTokens}from'../../theme/mobileTokens.js';import DeepSearchModal from'../Home/components/DeepSearchModal.js';import {normalizeSummaryText,extractDeepSearchSources}from'../Home/deepSearchUtils.js';import {AudioRecorderPanel}from'../../features/audio-input/AudioRecorderPanel.js';import {MicErrorBoundary}from'../../features/audio-input/MicErrorBoundary.js';import {
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {useMemo,useState,useEffect,useRef,useCallback}from'react';import {useColorScheme,useWindowDimensions,Platform,Keyboard,TouchableWithoutFeedback,StyleSheet,View}from'react-native';import {getDefaultLeftItems,getDefaultRightItems,Box,Text,InputToolBar}from'@admin-layout/gluestack-ui-mobile';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {useNavigation,useRoute}from'@react-navigation/native';import {MessagesContainerUI}from'@messenger-box/platform-mobile';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatStream}from'../../hooks/useChatStream.js';import {YantraBrandLoader,YANTRA_LOADER_SIZE_COMPACT}from'../../components/YantraBrandLoader.js';import ThinkingIndicator from'../../components/ThinkingIndicator.js';import {mobileTokens}from'../../theme/mobileTokens.js';import DeepSearchModal from'../Home/components/DeepSearchModal.js';import {normalizeSummaryText,extractDeepSearchSources}from'../Home/deepSearchUtils.js';import {AudioRecorderPanel}from'../../features/audio-input/AudioRecorderPanel.js';import {MicErrorBoundary}from'../../features/audio-input/MicErrorBoundary.js';import {requestMicPermission}from'../../features/audio-input/useAudioPermission.js';const COMPOSER_SCROLL_RESERVE_PX = 164;
|
|
2
2
|
const SENDING_LOADER_COMPOSER_RESERVE_PX = 156;
|
|
3
3
|
function ChatScreen() {
|
|
4
4
|
var _a, _b;
|
|
@@ -52,9 +52,7 @@ function ChatScreen() {
|
|
|
52
52
|
};
|
|
53
53
|
}, []);
|
|
54
54
|
const cdecli = useCdecliConnection();
|
|
55
|
-
const
|
|
56
|
-
const cdecliConnected = cdecliSelected && cdecli.channelConnected;
|
|
57
|
-
const effectivePersistenceMode = (_b = cdecli.persistenceMode) != null ? _b : "frontend";
|
|
55
|
+
const effectivePersistenceMode = (_b = cdecli.persistenceMode) != null ? _b : "backend";
|
|
58
56
|
useEffect(() => {
|
|
59
57
|
if (!channelId) return void 0;
|
|
60
58
|
cdecli.setActiveChannelId(channelId);
|
|
@@ -62,14 +60,11 @@ function ChatScreen() {
|
|
|
62
60
|
cdecli.setActiveChannelId(void 0);
|
|
63
61
|
};
|
|
64
62
|
}, [channelId, cdecli.setActiveChannelId]);
|
|
65
|
-
const chatRouting = useMemo(() =>
|
|
66
|
-
kind: "cdecli",
|
|
63
|
+
const chatRouting = useMemo(() => ({
|
|
67
64
|
channelConnected: cdecli.channelConnected,
|
|
68
65
|
accountId: cdecli.accountId,
|
|
69
66
|
persistenceMode: effectivePersistenceMode
|
|
70
|
-
}
|
|
71
|
-
kind: "groq"
|
|
72
|
-
}, [cdecliConnected, cdecli.channelConnected, cdecli.accountId, effectivePersistenceMode]);
|
|
67
|
+
}), [cdecli.channelConnected, cdecli.accountId, effectivePersistenceMode]);
|
|
73
68
|
const chat = useChatStream(channelId, chatRouting);
|
|
74
69
|
const {
|
|
75
70
|
messages,
|
|
@@ -95,15 +90,11 @@ function ChatScreen() {
|
|
|
95
90
|
const isDeepSearchMode = activeMode === "deep-search";
|
|
96
91
|
const [showAudioRecorder, setShowAudioRecorder] = useState(false);
|
|
97
92
|
const [voiceError, setVoiceError] = useState(null);
|
|
98
|
-
const {
|
|
99
|
-
micReady,
|
|
100
|
-
micError: micPermError
|
|
101
|
-
} = useAudioPermission();
|
|
102
93
|
const autoFiredRef = useRef(false);
|
|
103
94
|
useEffect(() => {
|
|
104
95
|
if (autoFiredRef.current) return;
|
|
105
96
|
if (!channelId || !initialQuery) return;
|
|
106
|
-
if (
|
|
97
|
+
if (cdecli.status !== "connected" && cdecli.status !== "error") return;
|
|
107
98
|
autoFiredRef.current = true;
|
|
108
99
|
if (isDeepSearchMode) {
|
|
109
100
|
setIsDeepSearchModalOpen(true);
|
|
@@ -116,7 +107,7 @@ function ChatScreen() {
|
|
|
116
107
|
});
|
|
117
108
|
} catch (e) {
|
|
118
109
|
}
|
|
119
|
-
}, [channelId, initialQuery, initialAttachments, sendMessage, navigation,
|
|
110
|
+
}, [channelId, initialQuery, initialAttachments, sendMessage, navigation, cdecli.status, isDeepSearchMode]);
|
|
120
111
|
const handleSend = useCallback((text) => {
|
|
121
112
|
var _a2;
|
|
122
113
|
const t = (text != null ? text : valueRef.current).trim();
|
|
@@ -136,12 +127,18 @@ function ChatScreen() {
|
|
|
136
127
|
if (hasQuery) return;
|
|
137
128
|
setVoiceError(null);
|
|
138
129
|
Keyboard.dismiss();
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
130
|
+
void (async () => {
|
|
131
|
+
const {
|
|
132
|
+
granted,
|
|
133
|
+
error
|
|
134
|
+
} = await requestMicPermission();
|
|
135
|
+
if (!granted) {
|
|
136
|
+
setVoiceError(error || "Microphone is not available.");
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
setShowAudioRecorder(true);
|
|
140
|
+
})();
|
|
141
|
+
}, [hasQuery]);
|
|
145
142
|
const handleTranscriptionComplete = useCallback((text) => {
|
|
146
143
|
const cleaned = (text != null ? text : "").trim();
|
|
147
144
|
setShowAudioRecorder(false);
|
|
@@ -258,7 +255,7 @@ function ChatScreen() {
|
|
|
258
255
|
onStop: isStreaming ? cancel : void 0
|
|
259
256
|
}), [canSubmit, handleSend, handleMicPress, isLoading, channelId, isStreaming, cancel]);
|
|
260
257
|
const isHydrating = messagesLoading && messages.length === 0 && !response;
|
|
261
|
-
const isWaitingForGateway = !autoFiredRef.current && !!channelId && !!initialQuery &&
|
|
258
|
+
const isWaitingForGateway = !autoFiredRef.current && !!channelId && !!initialQuery && cdecli.status !== "connected" && cdecli.status !== "error";
|
|
262
259
|
const showSendingLoader = waitingForAssistant;
|
|
263
260
|
const pinSendingLoaderNearComposer = messages.length > 0 || Boolean((response != null ? response : "").trim());
|
|
264
261
|
return /* @__PURE__ */ jsxs(SafeAreaView, { edges: ["left", "right", "bottom"], style: {
|