@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.
@@ -1,101 +1,109 @@
1
- import {DEFAULT_PRODUCTION_TAG_ID}from'@adminide-stack/core/lib/constants/defaultIds.js';import {useSettings}from'@adminide-stack/platform-client';import {ContributionSchemaId}from'common';import {useGetContextDataQuery,useAccountProfileQuery,useGetProjectsLazyQuery,useQuickCreateProjectForAccountBkMutation,useCreateVaultMutation}from'common/graphql';import {useState,useRef,useEffect}from'react';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 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
- const FALLBACK_SETTINGS_URI = {
21
- scheme: "cdecode",
22
- authority: "default",
23
- path: "/",
24
- fragment: "settings"
25
- };
26
- function toUriInput(value) {
27
- const uri = value;
28
- if (uri && typeof uri.scheme === "string" && typeof uri.path === "string") {
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
- const parsed = new URL(uri.external);
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 __spreadValues({}, FALLBACK_SETTINGS_URI);
16
+ return void 0;
47
17
  }
48
18
  }
49
- return __spreadValues({}, FALLBACK_SETTINGS_URI);
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
- settings: accountDefaultSettings,
67
- loading: accountSettingsLoading
68
- } = useSettings({
69
- resourceUri: settingsResourceUri,
70
- options: {
71
- schemaId: ContributionSchemaId.Configuration,
72
- configKey: "account.default",
73
- includeMarketplace: true
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 settingsLoading = contextLoading || accountSettingsLoading;
77
- const accountDefault = typeof accountDefaultSettings === "string" ? (() => {
78
- try {
79
- return JSON.parse(accountDefaultSettings);
80
- } catch (e) {
81
- return void 0;
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
- })() : accountDefaultSettings;
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 = !settingsLoading && !!orgName && !rawSettingsProjectId && !projectId;
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 isLoading = settingsLoading || isInitializingProject || !rawSettingsProjectId && !projectId && (userLoading || projectCreating);
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 {useAudioPermission}from'../../features/audio-input/useAudioPermission.js';const COMPOSER_SCROLL_RESERVE_PX = 164;
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 cdecliSelected = cdecli.cdecliSelected;
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(() => cdecliConnected ? {
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 (cdecliSelected && cdecli.status !== "connected" && cdecli.status !== "error") return;
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, cdecliSelected, cdecli.status, isDeepSearchMode]);
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
- if (!micReady) {
140
- setVoiceError(micPermError || "Microphone is not available.");
141
- return;
142
- }
143
- setShowAudioRecorder(true);
144
- }, [hasQuery, micReady, micPermError]);
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 && cdecliSelected && cdecli.status !== "connected" && cdecli.status !== "error";
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: {