@adminide-stack/yantra-mobile 12.0.39-alpha.2 → 12.0.39-alpha.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/lib/components/AppsMenu/AppsMenu.js +285 -0
  2. package/lib/components/AppsMenu/AppsMenu.js.map +1 -0
  3. package/lib/components/GatewayConnector/GatewayConnector.js +5 -2
  4. package/lib/components/GatewayConnector/GatewayConnector.js.map +1 -1
  5. package/lib/components/GatewayToolbarButtonMobile.js +25 -53
  6. package/lib/components/GatewayToolbarButtonMobile.js.map +1 -1
  7. package/lib/components/NavigationHeader/NavigationHeader.js +19 -11
  8. package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
  9. package/lib/compute.js +2 -0
  10. package/lib/compute.js.map +1 -1
  11. package/lib/config/constants.js +2 -2
  12. package/lib/config/constants.js.map +1 -1
  13. package/lib/contexts/GatewayContext.js +1 -1
  14. package/lib/features/apps/mobileAppCatalog.js +153 -0
  15. package/lib/features/apps/mobileAppCatalog.js.map +1 -0
  16. package/lib/features/templates/__tests__/buildTemplateCards.test.ts +57 -0
  17. package/lib/features/templates/buildTemplateCards.js +28 -2
  18. package/lib/features/templates/buildTemplateCards.js.map +1 -1
  19. package/lib/features/templates/buildTemplateCards.ts +44 -1
  20. package/lib/hooks/mintSurfaceSystemToken.js +78 -38
  21. package/lib/hooks/mintSurfaceSystemToken.js.map +1 -1
  22. package/lib/hooks/useMarketplaceTemplateCards.js +5 -2
  23. package/lib/hooks/useMarketplaceTemplateCards.js.map +1 -1
  24. package/lib/hooks/useMarketplaceTemplateGroups.js +9 -2
  25. package/lib/hooks/useMarketplaceTemplateGroups.js.map +1 -1
  26. package/lib/hooks/useObtainSystemToken.js +36 -28
  27. package/lib/hooks/useObtainSystemToken.js.map +1 -1
  28. package/lib/hooks/usePrerequisiteIds.js +34 -20
  29. package/lib/hooks/usePrerequisiteIds.js.map +1 -1
  30. package/lib/routes.json +2 -0
  31. package/lib/screens/Home/HomeScreen.js +44 -150
  32. package/lib/screens/Home/HomeScreen.js.map +1 -1
  33. package/lib/screens/Home/components/BuildTemplatesSection.js +142 -87
  34. package/lib/screens/Home/components/BuildTemplatesSection.js.map +1 -1
  35. package/lib/screens/Home/components/ChooseTemplateModal.js +261 -0
  36. package/lib/screens/Home/components/ChooseTemplateModal.js.map +1 -0
  37. package/lib/screens/Home/components/HomeSuggestions.js +109 -0
  38. package/lib/screens/Home/components/HomeSuggestions.js.map +1 -0
  39. package/lib/screens/Home/components/TemplateBrowserModal.js +237 -0
  40. package/lib/screens/Home/components/TemplateBrowserModal.js.map +1 -0
  41. package/lib/screens/WebBuilder/WebViewWithNavigation.js +1 -8
  42. package/lib/screens/WebBuilder/WebViewWithNavigation.js.map +1 -1
  43. package/lib/screens/WebBuilder/index.js +11 -7
  44. package/lib/screens/WebBuilder/index.js.map +1 -1
  45. package/lib/screens/WebBuilder/webbuilderWarmCache.js +6 -1
  46. package/lib/screens/WebBuilder/webbuilderWarmCache.js.map +1 -1
  47. package/lib/theme/mobileTokens.js +0 -5
  48. package/lib/theme/mobileTokens.js.map +1 -1
  49. package/package.json +4 -4
@@ -108,7 +108,8 @@ function usePrerequisiteIds() {
108
108
  return ((_a2 = match == null ? void 0 : match[1]) == null ? void 0 : _a2.trim()) || null;
109
109
  }, [cdecodeUri]);
110
110
  const orgName = orgFromContextSettings || orgFromAccountSettings || orgFromMembership || orgFromContextPath || null;
111
- const rawSettingsProjectId = projectFromContextSettings || projectFromAccountSettings || null;
111
+ const rawSettingsProjectIdRaw = projectFromContextSettings || projectFromAccountSettings || null;
112
+ const rawSettingsProjectId = !__DEV__ && rawSettingsProjectIdRaw === TESTING_PROJECT_UUID ? null : rawSettingsProjectIdRaw;
112
113
  useEffect(() => {
113
114
  if (!isAuthenticated || orgName || !effectiveUserId) return;
114
115
  const timer = setInterval(() => {
@@ -218,7 +219,10 @@ function usePrerequisiteIds() {
218
219
  limit: 50
219
220
  }
220
221
  });
221
- projectUuid = (_k = (_j = (((_i = (_h = after.data) == null ? void 0 : _h.getProjects) == null ? void 0 : _i.data) || []).find((p) => (p == null ? void 0 : p.id) === newMongoProjectId)) == null ? void 0 : _j.projectId) != null ? _k : void 0;
222
+ projectUuid = (_k = (_j = (((_i = (_h = after.data) == null ? void 0 : _h.getProjects) == null ? void 0 : _i.data) || []).find((p) => (p == null ? void 0 : p.id) === newMongoProjectId)) == null ? void 0 : _j.projectId) != null ? _k : (
223
+ // createSecretApiToken accepts Mongo ObjectId directly when no UUID dashes.
224
+ newMongoProjectId
225
+ );
222
226
  await createVault({
223
227
  variables: {
224
228
  input: {
@@ -228,12 +232,18 @@ function usePrerequisiteIds() {
228
232
  }
229
233
  }).catch((error) => console.error("[usePrerequisiteIds] Vault creation failed:", error == null ? void 0 : error.message));
230
234
  } else {
231
- console.warn("[usePrerequisiteIds] Project creation returned no id \u2014 using TESTING_PROJECT_UUID");
235
+ console.warn("[usePrerequisiteIds] Project creation returned no id");
232
236
  }
233
237
  }
234
238
  if (!projectUuid) {
235
- console.warn(`[usePrerequisiteIds] Could not resolve a project UUID \u2014 using testing project ${TESTING_PROJECT_UUID}`);
236
- projectUuid = TESTING_PROJECT_UUID;
239
+ if (__DEV__) {
240
+ console.warn(`[usePrerequisiteIds] Could not resolve a project UUID \u2014 using testing project ${TESTING_PROJECT_UUID}`);
241
+ projectUuid = TESTING_PROJECT_UUID;
242
+ } else {
243
+ console.error("[usePrerequisiteIds] Could not resolve a project UUID \u2014 refusing testing fallback outside __DEV__");
244
+ projectFixInFlight = false;
245
+ return;
246
+ }
237
247
  }
238
248
  setResolvedProjectId(projectUuid);
239
249
  publishSharedResolvedProjectId(projectUuid);
@@ -248,21 +258,25 @@ function usePrerequisiteIds() {
248
258
  await refetchDefaults();
249
259
  } catch (error) {
250
260
  console.error("[usePrerequisiteIds] Project bootstrap failed:", error == null ? void 0 : error.message);
251
- console.warn(`[usePrerequisiteIds] Falling back to testing project ${TESTING_PROJECT_UUID} after bootstrap error`);
252
- setResolvedProjectId(TESTING_PROJECT_UUID);
253
- publishSharedResolvedProjectId(TESTING_PROJECT_UUID);
254
- try {
255
- await persistDefaults(orgName, TESTING_PROJECT_UUID);
256
- dispatch(orgChangeAction({
257
- orgName,
258
- userId: effectiveUserId
259
- }));
260
- dispatch(resourceGroupChangeAction({
261
- resourceGroup: TESTING_PROJECT_UUID
262
- }));
263
- await refetchDefaults();
264
- } catch (persistError) {
265
- console.error("[usePrerequisiteIds] Testing fallback persist failed:", persistError == null ? void 0 : persistError.message);
261
+ if (__DEV__) {
262
+ console.warn(`[usePrerequisiteIds] Falling back to testing project ${TESTING_PROJECT_UUID} after bootstrap error`);
263
+ setResolvedProjectId(TESTING_PROJECT_UUID);
264
+ publishSharedResolvedProjectId(TESTING_PROJECT_UUID);
265
+ try {
266
+ await persistDefaults(orgName, TESTING_PROJECT_UUID);
267
+ dispatch(orgChangeAction({
268
+ orgName,
269
+ userId: effectiveUserId
270
+ }));
271
+ dispatch(resourceGroupChangeAction({
272
+ resourceGroup: TESTING_PROJECT_UUID
273
+ }));
274
+ await refetchDefaults();
275
+ } catch (persistError) {
276
+ console.error("[usePrerequisiteIds] Testing fallback persist failed:", persistError == null ? void 0 : persistError.message);
277
+ projectFixInFlight = false;
278
+ }
279
+ } else {
266
280
  projectFixInFlight = false;
267
281
  }
268
282
  } finally {
@@ -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 { useContextData } from '@adminide-stack/platform-client/lib/hooks/useContextData.js';\nimport {\n orgChangeAction,\n resourceGroupChangeAction,\n} from '@adminide-stack/platform-client/lib/redux/actions/org-action.js';\nimport { isAuthenticatedSelector } from '@adminide-stack/user-auth0-client';\nimport { ConfigurationTarget, ContributionSchemaId } from 'common';\nimport {\n useAccountProfileQuery,\n useCreateVaultMutation,\n useGetProjectsLazyQuery,\n useGetUserOrganizationsQuery,\n useGetUserOrganizationsWithDetailsQuery,\n useQuickCreateProjectForAccountBkMutation,\n useWriteSettingsMutation,\n} from 'common/graphql';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useAccountDefaultSettings } from './useAccountDefaultSettings';\nimport { isUnhydratedCdecodeUri, settingsUriForAccount, toUriInput } from '../utils/cdecodeUri';\n\nconst uuidToObjectId = (uuid: string) => uuid.replace(/-/g, '').substring(0, 24);\n\nconst PROJECT_NAME = 'DEFAULT_YANTRA_PROJECT';\nconst TAG_ID = uuidToObjectId(DEFAULT_PRODUCTION_TAG_ID);\n/** SystemContributionExtensionNames.Account — owns `account.default.*`. */\nconst ACCOUNT_EXTENSION = 'account';\n\n/**\n * TESTING ONLY — known working project UUID for local mobile bootstrap when create/list\n * cannot resolve `projectId`. Remove once org billing + project minting work for new accounts.\n */\nconst TESTING_PROJECT_UUID = '9a8ac704-1040-4836-9b72-48b771ca91b1';\n\nconst ORG_RESOLVE_POLL_MS = 2000;\nconst PROFILE_POLL_MS = 1500;\n\n// ── Module-level project fix (parity with browser) ───────────────────────────\n// Several screens/hooks mount `usePrerequisiteIds` at once. Per-instance refs race\n// and can create multiple orphan projects. Keep a single-flight guard + user id so\n// adopt/create/persist runs once per account session.\n// Resolved project must also be shared — otherwise WebBuilderPrewarm can \"win\" the\n// flight and HomeScreen never sees projectId (submit stuck on \"not ready\").\nlet projectFixInFlight = false;\nlet projectFixUserId: string | null = null;\nlet sharedResolvedProjectId: string | null = null;\nconst sharedProjectListeners = new Set<() => void>();\n\nfunction publishSharedResolvedProjectId(projectUuid: string): void {\n sharedResolvedProjectId = projectUuid;\n sharedProjectListeners.forEach((listener) => listener());\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 * Settings use the same `account.default` config as web (`useSettingsLoader` → `useSettings` on mobile).\n * After verify-user, account-level settings (`//accounts/{id}#settings`) and org membership are polled\n * until `organization` is available, then route context is synced on Home.\n *\n * Scenario: org set but no `account.default.project` → adopt an existing project in the org\n * (or create one), persist settings, and bind resourceGroup — same as browser Scenario 2.\n */\nexport function usePrerequisiteIds() {\n const dispatch = useDispatch();\n const isAuthenticated = useSelector(isAuthenticatedSelector);\n\n const { data: contextData, complete: contextComplete } = useContextData();\n const contextLoading = !contextComplete;\n const cdecodeUri = contextData?.cdecodeUri;\n const contextUserId = contextData?.userId ?? null;\n\n const contextResourceUri = useMemo(() => {\n if (isUnhydratedCdecodeUri(cdecodeUri)) return undefined;\n return toUriInput(cdecodeUri);\n }, [cdecodeUri]);\n\n const {\n data: accountProfileData,\n loading: userLoading,\n refetch: refetchProfile,\n } = useAccountProfileQuery({\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'all',\n skip: !isAuthenticated,\n });\n const profileUserId = accountProfileData?.accountProfile?.user?.id ?? null;\n const effectiveUserId = isAuthenticated ? profileUserId || contextUserId : null;\n\n useEffect(() => {\n if (!isAuthenticated || profileUserId) return;\n const timer = setInterval(() => {\n refetchProfile().catch(() => undefined);\n }, PROFILE_POLL_MS);\n return () => clearInterval(timer);\n }, [isAuthenticated, profileUserId, refetchProfile]);\n\n // Step 1 (web): account.default via settings loader — context cdecodeUri when hydrated\n const {\n organization: orgFromContextSettings,\n project: projectFromContextSettings,\n loading: contextSettingsLoading,\n refetch: refetchContextSettings,\n } = useAccountDefaultSettings({\n resourceUri: contextResourceUri,\n skip: !isAuthenticated || !contextResourceUri,\n });\n\n const accountResourceUri = useMemo(() => {\n if (!effectiveUserId || orgFromContextSettings) return undefined;\n return settingsUriForAccount(effectiveUserId);\n }, [effectiveUserId, orgFromContextSettings]);\n\n // Mobile bootstrap: read account.default from account document before org is on the route\n const {\n organization: orgFromAccountSettings,\n project: projectFromAccountSettings,\n loading: accountSettingsLoading,\n refetch: refetchAccountSettings,\n } = useAccountDefaultSettings({\n resourceUri: accountResourceUri,\n skip: !isAuthenticated || !accountResourceUri,\n });\n\n const {\n data: orgsData,\n loading: orgsLoading,\n refetch: refetchOrgs,\n } = useGetUserOrganizationsWithDetailsQuery({\n skip: !isAuthenticated || !effectiveUserId,\n fetchPolicy: 'cache-and-network',\n });\n\n const {\n data: orgsByUserData,\n loading: orgsByUserLoading,\n refetch: refetchOrgsByUser,\n } = useGetUserOrganizationsQuery({\n variables: { userId: effectiveUserId ?? undefined },\n skip: !isAuthenticated || !effectiveUserId,\n fetchPolicy: 'cache-and-network',\n });\n\n const orgFromMembership = useMemo(() => {\n const fromDetails = pickDefaultOrgSlug(orgsData?.getUserOrganizationsWithDetails);\n if (fromDetails) return fromDetails;\n return pickDefaultOrgSlug(orgsByUserData?.getUserOrganizations);\n }, [orgsData, orgsByUserData]);\n\n const orgFromContextPath = useMemo(() => {\n if (isUnhydratedCdecodeUri(cdecodeUri)) return null;\n const { path } = toUriInput(cdecodeUri);\n const match = path.match(/^\\/([^/]+)\\//);\n return match?.[1]?.trim() || null;\n }, [cdecodeUri]);\n\n const orgName = orgFromContextSettings || orgFromAccountSettings || orgFromMembership || orgFromContextPath || null;\n\n const rawSettingsProjectId = projectFromContextSettings || projectFromAccountSettings || null;\n\n useEffect(() => {\n if (!isAuthenticated || orgName || !effectiveUserId) return;\n const timer = setInterval(() => {\n refetchContextSettings?.()?.catch(() => undefined);\n refetchAccountSettings?.()?.catch(() => undefined);\n refetchOrgs().catch(() => undefined);\n refetchOrgsByUser().catch(() => undefined);\n }, ORG_RESOLVE_POLL_MS);\n return () => clearInterval(timer);\n }, [\n isAuthenticated,\n orgName,\n effectiveUserId,\n refetchContextSettings,\n refetchAccountSettings,\n refetchOrgs,\n refetchOrgsByUser,\n ]);\n\n const settingsProjectId = rawSettingsProjectId;\n\n const [resolvedProjectId, setResolvedProjectId] = useState<string | null>(() => sharedResolvedProjectId);\n const [isInitializingProject, setIsInitializingProject] = useState(false);\n\n // Cross-instance sync: when another hook wins the project bootstrap, adopt it.\n useEffect(() => {\n const onShared = () => {\n if (sharedResolvedProjectId) setResolvedProjectId(sharedResolvedProjectId);\n };\n sharedProjectListeners.add(onShared);\n onShared();\n return () => {\n sharedProjectListeners.delete(onShared);\n };\n }, []);\n\n // New account session → clear shared fallback so we don't leak another user's project.\n useEffect(() => {\n if (!effectiveUserId) return;\n if (projectFixUserId && projectFixUserId !== effectiveUserId) {\n sharedResolvedProjectId = null;\n projectFixInFlight = false;\n setResolvedProjectId(null);\n }\n }, [effectiveUserId]);\n\n const projectId = settingsProjectId || resolvedProjectId || sharedResolvedProjectId;\n const settingsLoading = contextSettingsLoading || accountSettingsLoading;\n // Wait for settings to settle so we don't create before an existing default loads.\n const needsProjectCreation = !settingsLoading && !!orgName && !rawSettingsProjectId && !projectId;\n\n const [fetchProjects] = useGetProjectsLazyQuery();\n const [createProject, { error: createError, loading: projectCreating }] =\n useQuickCreateProjectForAccountBkMutation();\n const [createVault, { error: vaultCreateError }] = useCreateVaultMutation();\n const [writeSettings] = useWriteSettingsMutation();\n\n const accountSettingsUri = useMemo(() => {\n if (!effectiveUserId) return null;\n return settingsUriForAccount(effectiveUserId);\n }, [effectiveUserId]);\n\n const persistDefaults = useCallback(\n async (orgToSet: string, projectUuid: string) => {\n if (!accountSettingsUri) return;\n await writeSettings({\n variables: {\n editingUri: accountSettingsUri,\n settings: {\n 'account.default.organization': orgToSet,\n 'account.default.project': projectUuid,\n },\n target: ConfigurationTarget.USER,\n schemaId: ContributionSchemaId.Configuration,\n extensionName: ACCOUNT_EXTENSION,\n },\n });\n },\n [accountSettingsUri, writeSettings],\n );\n\n const refetchDefaults = useCallback(async () => {\n await Promise.all([\n refetchContextSettings?.()?.catch(() => undefined) ?? Promise.resolve(),\n refetchAccountSettings?.()?.catch(() => undefined) ?? Promise.resolve(),\n ]);\n }, [refetchContextSettings, refetchAccountSettings]);\n\n // Scenario 2: default org present but no project → adopt existing (or create once),\n // then persist so reload / other mounts do not create orphan projects.\n useEffect(() => {\n if (!needsProjectCreation || !effectiveUserId || userLoading || !orgName) {\n return;\n }\n\n if (projectFixUserId !== effectiveUserId) {\n projectFixUserId = effectiveUserId;\n projectFixInFlight = false;\n sharedResolvedProjectId = null;\n }\n\n if (projectFixInFlight) {\n return;\n }\n\n projectFixInFlight = true;\n setIsInitializingProject(true);\n\n (async () => {\n try {\n const existing = await fetchProjects({ variables: { orgName, limit: 50 } });\n let projectUuid =\n (existing.data?.getProjects?.data || []).find((p) => p?.projectId)?.projectId ?? undefined;\n let newMongoProjectId: string | undefined;\n\n if (!projectUuid) {\n const created = await createProject({\n variables: {\n input: {\n accountId: effectiveUserId,\n projectName: PROJECT_NAME,\n },\n },\n });\n newMongoProjectId = created.data?.quickCreateProjectForAccount?.id ?? undefined;\n if (newMongoProjectId) {\n const after = await fetchProjects({ variables: { orgName, limit: 50 } });\n projectUuid =\n (after.data?.getProjects?.data || []).find((p) => p?.id === newMongoProjectId)?.projectId ??\n undefined;\n await createVault({\n variables: {\n input: {\n orgName,\n projectId: newMongoProjectId,\n },\n },\n }).catch((error) =>\n console.error('[usePrerequisiteIds] Vault creation failed:', error?.message),\n );\n } else {\n console.warn(\n '[usePrerequisiteIds] Project creation returned no id — using TESTING_PROJECT_UUID',\n );\n }\n }\n\n if (!projectUuid) {\n // TESTING ONLY: unblock Home/Chat/Build when mint/list cannot map projectId.\n console.warn(\n `[usePrerequisiteIds] Could not resolve a project UUID — using testing project ${TESTING_PROJECT_UUID}`,\n );\n projectUuid = TESTING_PROJECT_UUID;\n }\n\n setResolvedProjectId(projectUuid);\n publishSharedResolvedProjectId(projectUuid);\n await persistDefaults(orgName, projectUuid);\n dispatch(orgChangeAction({ orgName, userId: effectiveUserId }));\n dispatch(resourceGroupChangeAction({ resourceGroup: projectUuid }));\n await refetchDefaults();\n } catch (error) {\n console.error('[usePrerequisiteIds] Project bootstrap failed:', (error as Error)?.message);\n // TESTING ONLY — still bind a known project so the app is usable locally.\n console.warn(\n `[usePrerequisiteIds] Falling back to testing project ${TESTING_PROJECT_UUID} after bootstrap error`,\n );\n setResolvedProjectId(TESTING_PROJECT_UUID);\n publishSharedResolvedProjectId(TESTING_PROJECT_UUID);\n try {\n await persistDefaults(orgName, TESTING_PROJECT_UUID);\n dispatch(orgChangeAction({ orgName, userId: effectiveUserId }));\n dispatch(resourceGroupChangeAction({ resourceGroup: TESTING_PROJECT_UUID }));\n await refetchDefaults();\n // Keep projectFixInFlight=true — same as happy path — so we don't re-loop.\n } catch (persistError) {\n console.error(\n '[usePrerequisiteIds] Testing fallback persist failed:',\n (persistError as Error)?.message,\n );\n projectFixInFlight = false;\n }\n } finally {\n setIsInitializingProject(false);\n }\n })();\n }, [\n createProject,\n createVault,\n dispatch,\n fetchProjects,\n needsProjectCreation,\n orgName,\n persistDefaults,\n refetchDefaults,\n effectiveUserId,\n userLoading,\n ]);\n\n const isOrgLoading =\n isAuthenticated &&\n !orgName &&\n (userLoading ||\n contextLoading ||\n settingsLoading ||\n orgsLoading ||\n orgsByUserLoading ||\n Boolean(effectiveUserId));\n\n const isProjectLoading =\n !!orgName &&\n !rawSettingsProjectId &&\n !projectId &&\n (isInitializingProject || projectCreating || settingsLoading);\n\n const isLoading = isOrgLoading || isProjectLoading;\n\n return {\n projectId,\n orgName,\n accountUserId: effectiveUserId ?? null,\n tagId: TAG_ID,\n loading: isLoading,\n /** True while org slug is still unknown (Home should wait before syncing route). */\n orgLoading: isOrgLoading,\n errors: { createError, vaultCreateError },\n };\n}\n"],"names":["_a","_b","_c","_d"],"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 { useContextData } from '@adminide-stack/platform-client/lib/hooks/useContextData.js';\nimport {\n orgChangeAction,\n resourceGroupChangeAction,\n} from '@adminide-stack/platform-client/lib/redux/actions/org-action.js';\nimport { isAuthenticatedSelector } from '@adminide-stack/user-auth0-client';\nimport { ConfigurationTarget, ContributionSchemaId } from 'common';\nimport {\n useAccountProfileQuery,\n useCreateVaultMutation,\n useGetProjectsLazyQuery,\n useGetUserOrganizationsQuery,\n useGetUserOrganizationsWithDetailsQuery,\n useQuickCreateProjectForAccountBkMutation,\n useWriteSettingsMutation,\n} from 'common/graphql';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useAccountDefaultSettings } from './useAccountDefaultSettings';\nimport { isUnhydratedCdecodeUri, settingsUriForAccount, toUriInput } from '../utils/cdecodeUri';\n\nconst uuidToObjectId = (uuid: string) => uuid.replace(/-/g, '').substring(0, 24);\n\nconst PROJECT_NAME = 'DEFAULT_YANTRA_PROJECT';\nconst TAG_ID = uuidToObjectId(DEFAULT_PRODUCTION_TAG_ID);\n/** SystemContributionExtensionNames.Account — owns `account.default.*`. */\nconst ACCOUNT_EXTENSION = 'account';\n\n/**\n * DEV ONLY — known working project UUID for local mobile bootstrap when create/list\n * cannot resolve `projectId`. Never use on staging/prod: createSecretApiToken needs a\n * real project that resolves to a Mongo ObjectId (unknown UUID → ObjectId cast 400).\n */\nconst TESTING_PROJECT_UUID = '9a8ac704-1040-4836-9b72-48b771ca91b1';\n\nconst ORG_RESOLVE_POLL_MS = 2000;\nconst PROFILE_POLL_MS = 1500;\n\n// ── Module-level project fix (parity with browser) ───────────────────────────\n// Several screens/hooks mount `usePrerequisiteIds` at once. Per-instance refs race\n// and can create multiple orphan projects. Keep a single-flight guard + user id so\n// adopt/create/persist runs once per account session.\n// Resolved project must also be shared — otherwise WebBuilderPrewarm can \"win\" the\n// flight and HomeScreen never sees projectId (submit stuck on \"not ready\").\nlet projectFixInFlight = false;\nlet projectFixUserId: string | null = null;\nlet sharedResolvedProjectId: string | null = null;\nconst sharedProjectListeners = new Set<() => void>();\n\nfunction publishSharedResolvedProjectId(projectUuid: string): void {\n sharedResolvedProjectId = projectUuid;\n sharedProjectListeners.forEach((listener) => listener());\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 * Settings use the same `account.default` config as web (`useSettingsLoader` → `useSettings` on mobile).\n * After verify-user, account-level settings (`//accounts/{id}#settings`) and org membership are polled\n * until `organization` is available, then route context is synced on Home.\n *\n * Scenario: org set but no `account.default.project` → adopt an existing project in the org\n * (or create one), persist settings, and bind resourceGroup — same as browser Scenario 2.\n */\nexport function usePrerequisiteIds() {\n const dispatch = useDispatch();\n const isAuthenticated = useSelector(isAuthenticatedSelector);\n\n const { data: contextData, complete: contextComplete } = useContextData();\n const contextLoading = !contextComplete;\n const cdecodeUri = contextData?.cdecodeUri;\n const contextUserId = contextData?.userId ?? null;\n\n const contextResourceUri = useMemo(() => {\n if (isUnhydratedCdecodeUri(cdecodeUri)) return undefined;\n return toUriInput(cdecodeUri);\n }, [cdecodeUri]);\n\n const {\n data: accountProfileData,\n loading: userLoading,\n refetch: refetchProfile,\n } = useAccountProfileQuery({\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'all',\n skip: !isAuthenticated,\n });\n const profileUserId = accountProfileData?.accountProfile?.user?.id ?? null;\n const effectiveUserId = isAuthenticated ? profileUserId || contextUserId : null;\n\n useEffect(() => {\n if (!isAuthenticated || profileUserId) return;\n const timer = setInterval(() => {\n refetchProfile().catch(() => undefined);\n }, PROFILE_POLL_MS);\n return () => clearInterval(timer);\n }, [isAuthenticated, profileUserId, refetchProfile]);\n\n // Step 1 (web): account.default via settings loader — context cdecodeUri when hydrated\n const {\n organization: orgFromContextSettings,\n project: projectFromContextSettings,\n loading: contextSettingsLoading,\n refetch: refetchContextSettings,\n } = useAccountDefaultSettings({\n resourceUri: contextResourceUri,\n skip: !isAuthenticated || !contextResourceUri,\n });\n\n const accountResourceUri = useMemo(() => {\n if (!effectiveUserId || orgFromContextSettings) return undefined;\n return settingsUriForAccount(effectiveUserId);\n }, [effectiveUserId, orgFromContextSettings]);\n\n // Mobile bootstrap: read account.default from account document before org is on the route\n const {\n organization: orgFromAccountSettings,\n project: projectFromAccountSettings,\n loading: accountSettingsLoading,\n refetch: refetchAccountSettings,\n } = useAccountDefaultSettings({\n resourceUri: accountResourceUri,\n skip: !isAuthenticated || !accountResourceUri,\n });\n\n const {\n data: orgsData,\n loading: orgsLoading,\n refetch: refetchOrgs,\n } = useGetUserOrganizationsWithDetailsQuery({\n skip: !isAuthenticated || !effectiveUserId,\n fetchPolicy: 'cache-and-network',\n });\n\n const {\n data: orgsByUserData,\n loading: orgsByUserLoading,\n refetch: refetchOrgsByUser,\n } = useGetUserOrganizationsQuery({\n variables: { userId: effectiveUserId ?? undefined },\n skip: !isAuthenticated || !effectiveUserId,\n fetchPolicy: 'cache-and-network',\n });\n\n const orgFromMembership = useMemo(() => {\n const fromDetails = pickDefaultOrgSlug(orgsData?.getUserOrganizationsWithDetails);\n if (fromDetails) return fromDetails;\n return pickDefaultOrgSlug(orgsByUserData?.getUserOrganizations);\n }, [orgsData, orgsByUserData]);\n\n const orgFromContextPath = useMemo(() => {\n if (isUnhydratedCdecodeUri(cdecodeUri)) return null;\n const { path } = toUriInput(cdecodeUri);\n const match = path.match(/^\\/([^/]+)\\//);\n return match?.[1]?.trim() || null;\n }, [cdecodeUri]);\n\n const orgName = orgFromContextSettings || orgFromAccountSettings || orgFromMembership || orgFromContextPath || null;\n\n const rawSettingsProjectIdRaw = projectFromContextSettings || projectFromAccountSettings || null;\n // Staging may have persisted the local testing UUID; treat it as unset so bootstrap can mint a real project.\n const rawSettingsProjectId =\n !__DEV__ && rawSettingsProjectIdRaw === TESTING_PROJECT_UUID ? null : rawSettingsProjectIdRaw;\n\n useEffect(() => {\n if (!isAuthenticated || orgName || !effectiveUserId) return;\n const timer = setInterval(() => {\n refetchContextSettings?.()?.catch(() => undefined);\n refetchAccountSettings?.()?.catch(() => undefined);\n refetchOrgs().catch(() => undefined);\n refetchOrgsByUser().catch(() => undefined);\n }, ORG_RESOLVE_POLL_MS);\n return () => clearInterval(timer);\n }, [\n isAuthenticated,\n orgName,\n effectiveUserId,\n refetchContextSettings,\n refetchAccountSettings,\n refetchOrgs,\n refetchOrgsByUser,\n ]);\n\n const settingsProjectId = rawSettingsProjectId;\n\n const [resolvedProjectId, setResolvedProjectId] = useState<string | null>(() => sharedResolvedProjectId);\n const [isInitializingProject, setIsInitializingProject] = useState(false);\n\n // Cross-instance sync: when another hook wins the project bootstrap, adopt it.\n useEffect(() => {\n const onShared = () => {\n if (sharedResolvedProjectId) setResolvedProjectId(sharedResolvedProjectId);\n };\n sharedProjectListeners.add(onShared);\n onShared();\n return () => {\n sharedProjectListeners.delete(onShared);\n };\n }, []);\n\n // New account session → clear shared fallback so we don't leak another user's project.\n useEffect(() => {\n if (!effectiveUserId) return;\n if (projectFixUserId && projectFixUserId !== effectiveUserId) {\n sharedResolvedProjectId = null;\n projectFixInFlight = false;\n setResolvedProjectId(null);\n }\n }, [effectiveUserId]);\n\n const projectId = settingsProjectId || resolvedProjectId || sharedResolvedProjectId;\n const settingsLoading = contextSettingsLoading || accountSettingsLoading;\n // Wait for settings to settle so we don't create before an existing default loads.\n const needsProjectCreation = !settingsLoading && !!orgName && !rawSettingsProjectId && !projectId;\n\n const [fetchProjects] = useGetProjectsLazyQuery();\n const [createProject, { error: createError, loading: projectCreating }] =\n useQuickCreateProjectForAccountBkMutation();\n const [createVault, { error: vaultCreateError }] = useCreateVaultMutation();\n const [writeSettings] = useWriteSettingsMutation();\n\n const accountSettingsUri = useMemo(() => {\n if (!effectiveUserId) return null;\n return settingsUriForAccount(effectiveUserId);\n }, [effectiveUserId]);\n\n const persistDefaults = useCallback(\n async (orgToSet: string, projectUuid: string) => {\n if (!accountSettingsUri) return;\n await writeSettings({\n variables: {\n editingUri: accountSettingsUri,\n settings: {\n 'account.default.organization': orgToSet,\n 'account.default.project': projectUuid,\n },\n target: ConfigurationTarget.USER,\n schemaId: ContributionSchemaId.Configuration,\n extensionName: ACCOUNT_EXTENSION,\n },\n });\n },\n [accountSettingsUri, writeSettings],\n );\n\n const refetchDefaults = useCallback(async () => {\n await Promise.all([\n refetchContextSettings?.()?.catch(() => undefined) ?? Promise.resolve(),\n refetchAccountSettings?.()?.catch(() => undefined) ?? Promise.resolve(),\n ]);\n }, [refetchContextSettings, refetchAccountSettings]);\n\n // Scenario 2: default org present but no project → adopt existing (or create once),\n // then persist so reload / other mounts do not create orphan projects.\n useEffect(() => {\n if (!needsProjectCreation || !effectiveUserId || userLoading || !orgName) {\n return;\n }\n\n if (projectFixUserId !== effectiveUserId) {\n projectFixUserId = effectiveUserId;\n projectFixInFlight = false;\n sharedResolvedProjectId = null;\n }\n\n if (projectFixInFlight) {\n return;\n }\n\n projectFixInFlight = true;\n setIsInitializingProject(true);\n\n (async () => {\n try {\n const existing = await fetchProjects({ variables: { orgName, limit: 50 } });\n let projectUuid =\n (existing.data?.getProjects?.data || []).find((p) => p?.projectId)?.projectId ?? undefined;\n let newMongoProjectId: string | undefined;\n\n if (!projectUuid) {\n const created = await createProject({\n variables: {\n input: {\n accountId: effectiveUserId,\n projectName: PROJECT_NAME,\n },\n },\n });\n newMongoProjectId = created.data?.quickCreateProjectForAccount?.id ?? undefined;\n if (newMongoProjectId) {\n const after = await fetchProjects({ variables: { orgName, limit: 50 } });\n projectUuid =\n (after.data?.getProjects?.data || []).find((p) => p?.id === newMongoProjectId)?.projectId ??\n // createSecretApiToken accepts Mongo ObjectId directly when no UUID dashes.\n newMongoProjectId;\n await createVault({\n variables: {\n input: {\n orgName,\n projectId: newMongoProjectId,\n },\n },\n }).catch((error) =>\n console.error('[usePrerequisiteIds] Vault creation failed:', error?.message),\n );\n } else {\n console.warn('[usePrerequisiteIds] Project creation returned no id');\n }\n }\n\n if (!projectUuid) {\n if (__DEV__) {\n console.warn(\n `[usePrerequisiteIds] Could not resolve a project UUID — using testing project ${TESTING_PROJECT_UUID}`,\n );\n projectUuid = TESTING_PROJECT_UUID;\n } else {\n console.error(\n '[usePrerequisiteIds] Could not resolve a project UUID — refusing testing fallback outside __DEV__',\n );\n projectFixInFlight = false;\n return;\n }\n }\n\n setResolvedProjectId(projectUuid);\n publishSharedResolvedProjectId(projectUuid);\n await persistDefaults(orgName, projectUuid);\n dispatch(orgChangeAction({ orgName, userId: effectiveUserId }));\n dispatch(resourceGroupChangeAction({ resourceGroup: projectUuid }));\n await refetchDefaults();\n } catch (error) {\n console.error('[usePrerequisiteIds] Project bootstrap failed:', (error as Error)?.message);\n if (__DEV__) {\n console.warn(\n `[usePrerequisiteIds] Falling back to testing project ${TESTING_PROJECT_UUID} after bootstrap error`,\n );\n setResolvedProjectId(TESTING_PROJECT_UUID);\n publishSharedResolvedProjectId(TESTING_PROJECT_UUID);\n try {\n await persistDefaults(orgName, TESTING_PROJECT_UUID);\n dispatch(orgChangeAction({ orgName, userId: effectiveUserId }));\n dispatch(resourceGroupChangeAction({ resourceGroup: TESTING_PROJECT_UUID }));\n await refetchDefaults();\n } catch (persistError) {\n console.error(\n '[usePrerequisiteIds] Testing fallback persist failed:',\n (persistError as Error)?.message,\n );\n projectFixInFlight = false;\n }\n } else {\n projectFixInFlight = false;\n }\n } finally {\n setIsInitializingProject(false);\n }\n })();\n }, [\n createProject,\n createVault,\n dispatch,\n fetchProjects,\n needsProjectCreation,\n orgName,\n persistDefaults,\n refetchDefaults,\n effectiveUserId,\n userLoading,\n ]);\n\n const isOrgLoading =\n isAuthenticated &&\n !orgName &&\n (userLoading ||\n contextLoading ||\n settingsLoading ||\n orgsLoading ||\n orgsByUserLoading ||\n Boolean(effectiveUserId));\n\n const isProjectLoading =\n !!orgName &&\n !rawSettingsProjectId &&\n !projectId &&\n (isInitializingProject || projectCreating || settingsLoading);\n\n const isLoading = isOrgLoading || isProjectLoading;\n\n return {\n projectId,\n orgName,\n accountUserId: effectiveUserId ?? null,\n tagId: TAG_ID,\n loading: isLoading,\n /** True while org slug is still unknown (Home should wait before syncing route). */\n orgLoading: isOrgLoading,\n errors: { createError, vaultCreateError },\n };\n}\n"],"names":["_a","_b","_c","_d"],"mappings":"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"}
package/lib/routes.json CHANGED
@@ -22,6 +22,7 @@
22
22
  "showFilter": true,
23
23
  "isSearchBack": false,
24
24
  "showGateway": true,
25
+ "showApps": true,
25
26
  "showHistory": true,
26
27
  "showNewChat": true
27
28
  }
@@ -71,6 +72,7 @@
71
72
  "isSearchBack": false,
72
73
  "showBack": true,
73
74
  "showGateway": true,
75
+ "showApps": true,
74
76
  "showHistory": false,
75
77
  "showNewChat": true
76
78
  }
@@ -1,4 +1,4 @@
1
- import {jsx,jsxs}from'react/jsx-runtime';import React,{useRef,useState,useEffect,useCallback,useMemo}from'react';import {useWindowDimensions,useColorScheme,Platform,Keyboard,TouchableWithoutFeedback,View,StyleSheet,ScrollView,Pressable}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {getDefaultLeftItems,getDefaultRightItems,Box,Text,InputToolBar}from'@admin-layout/gluestack-ui-mobile';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {useNavigation,useRoute,CommonActions}from'@react-navigation/native';import {useDispatch,useSelector}from'react-redux';import {v4}from'uuid';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {syncMobileOrgRouteContext}from'../../utils/syncMobileOrgRouteContext.js';import {useChatMutations}from'../../hooks/useChatApi.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';import {mobileTokens}from'../../theme/mobileTokens.js';import {useMarketplaceTemplateGroups}from'../../hooks/useMarketplaceTemplateGroups.js';import {BuildTemplatesSection}from'./components/BuildTemplatesSection.js';import {WebBuilderPrewarm}from'./components/WebBuilderPrewarm.js';var __defProp = Object.defineProperty;
1
+ import {jsx,jsxs}from'react/jsx-runtime';import React,{useRef,useState,useEffect,useCallback,useMemo}from'react';import {useWindowDimensions,useColorScheme,Platform,Keyboard,TouchableWithoutFeedback,View,StyleSheet}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,CommonActions}from'@react-navigation/native';import {useDispatch,useSelector}from'react-redux';import {v4}from'uuid';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {syncMobileOrgRouteContext}from'../../utils/syncMobileOrgRouteContext.js';import {useChatMutations}from'../../hooks/useChatApi.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';import {mobileTokens}from'../../theme/mobileTokens.js';import {useMarketplaceTemplateGroups}from'../../hooks/useMarketplaceTemplateGroups.js';import {BuildTemplatesSection}from'./components/BuildTemplatesSection.js';import {ChooseTemplateModal}from'./components/ChooseTemplateModal.js';import {HomeSuggestions}from'./components/HomeSuggestions.js';import {WebBuilderPrewarm}from'./components/WebBuilderPrewarm.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -27,57 +27,22 @@ const EmptyStateSection = React.memo(function EmptyStateSection2({
27
27
  secondaryTextColor,
28
28
  primaryTextColor,
29
29
  activeMode,
30
- onModeSwitch,
31
- orgName,
32
30
  selectedTemplateGroup,
33
31
  selectedBuildTemplateId,
34
- onUseBuildTemplate
32
+ showSuggestions,
33
+ onInjectPrompt
35
34
  }) {
36
- const isBuildMode = activeMode === "build";
37
- return /* @__PURE__ */ jsx(Box, { flex: 1, width: "100%", children: /* @__PURE__ */ jsxs(ScrollView, { style: {
38
- flex: 1,
39
- width: "100%"
40
- }, contentContainerStyle: styles.emptyCenterTitleWrap, keyboardShouldPersistTaps: "handled", showsVerticalScrollIndicator: false, children: [
41
- /* @__PURE__ */ jsx(Text, { style: [styles.emptyEyebrow, {
42
- color: secondaryTextColor
43
- }], children: "Choose your mode" }),
44
- /* @__PURE__ */ jsxs(View, { style: [styles.emptyModePillRow, {
45
- backgroundColor: isDark ? "rgba(30, 41, 59, 0.9)" : "#eef2ff",
46
- borderColor: isDark ? "rgba(148, 163, 184, 0.26)" : "rgba(67, 56, 202, 0.15)"
47
- }], children: [
48
- /* @__PURE__ */ jsxs(Pressable, { onPress: () => onModeSwitch("chat"), style: [styles.emptyModePill, activeMode === "chat" && styles.emptyModePillActive, activeMode === "chat" && {
49
- backgroundColor: isDark ? "#312e81" : "#4338ca"
50
- }], accessibilityRole: "button", accessibilityLabel: "Switch to chat mode", children: [
51
- /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "magnify", size: 14, color: activeMode === "chat" ? "#ffffff" : secondaryTextColor }),
52
- /* @__PURE__ */ jsx(Text, { style: [styles.emptyModePillLabel, {
53
- color: activeMode === "chat" ? "#ffffff" : secondaryTextColor
54
- }], children: "Chat" })
55
- ] }),
56
- /* @__PURE__ */ jsxs(Pressable, { onPress: () => onModeSwitch("deep-search"), style: [styles.emptyModePill, activeMode === "deep-search" && styles.emptyModePillActive, activeMode === "deep-search" && {
57
- backgroundColor: isDark ? "#312e81" : "#4338ca"
58
- }], accessibilityRole: "button", accessibilityLabel: "Switch to deep-search mode", children: [
59
- /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "lightning-bolt-outline", size: 14, color: activeMode === "deep-search" ? "#ffffff" : secondaryTextColor }),
60
- /* @__PURE__ */ jsx(Text, { style: [styles.emptyModePillLabel, {
61
- color: activeMode === "deep-search" ? "#ffffff" : secondaryTextColor
62
- }], children: "Deep Search" })
63
- ] }),
64
- /* @__PURE__ */ jsxs(Pressable, { onPress: () => onModeSwitch("build"), style: [styles.emptyModePill, activeMode === "build" && styles.emptyModePillActive, activeMode === "build" && {
65
- backgroundColor: isDark ? "#312e81" : "#4338ca"
66
- }], accessibilityRole: "button", accessibilityLabel: "Switch to build mode", children: [
67
- /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "lightbulb-outline", size: 14, color: activeMode === "build" ? "#ffffff" : secondaryTextColor }),
68
- /* @__PURE__ */ jsx(Text, { style: [styles.emptyModePillLabel, {
69
- color: activeMode === "build" ? "#ffffff" : secondaryTextColor
70
- }], children: "Build" })
71
- ] })
72
- ] }),
35
+ const title = activeMode === "build" ? "What should we build?" : activeMode === "deep-search" ? "What should we research?" : "Ask anything";
36
+ const subtitle = activeMode === "build" ? selectedBuildTemplateId ? "Describe the project, then send." : selectedTemplateGroup ? "Tap a starter below, then send." : "Tap Template to pick a group, then send." : activeMode === "deep-search" ? "Source-backed answers from the web." : "Chat, Deep Search, or Build from the composer.";
37
+ return /* @__PURE__ */ jsxs(View, { style: styles.emptyWrap, children: [
73
38
  /* @__PURE__ */ jsx(Text, { style: [styles.emptyCenterTitle, {
74
39
  color: primaryTextColor
75
- }], children: "How do you want to start?" }),
40
+ }], children: title }),
76
41
  /* @__PURE__ */ jsx(Text, { style: [styles.emptySubtitle, {
77
42
  color: secondaryTextColor
78
- }], children: isBuildMode ? selectedBuildTemplateId ? "Template armed \u2014 describe what to build, then send. Snapshot goes with your message." : selectedTemplateGroup ? "Tap a starter below to arm its snapshot, then type your prompt and send." : "Open Template to choose a group (Code Assistant, \u2026), pick a starter, then type & send." : "Use Chat for quick help, Deep Search for source-backed answers, or Build to assemble workflows." }),
79
- isBuildMode ? /* @__PURE__ */ jsx(BuildTemplatesSection, { enabled: true, group: selectedTemplateGroup, orgName, isDark, primaryTextColor, secondaryTextColor, selectedTemplateId: selectedBuildTemplateId, onUseTemplate: onUseBuildTemplate }) : null
80
- ] }) });
43
+ }], children: subtitle }),
44
+ activeMode === "chat" && showSuggestions ? /* @__PURE__ */ jsx(HomeSuggestions, { isDark, primaryTextColor, secondaryTextColor, onInjectPrompt }) : null
45
+ ] });
81
46
  });
82
47
  function HomeScreenContent({
83
48
  initialMode = "chat",
@@ -85,7 +50,7 @@ function HomeScreenContent({
85
50
  isLoading: isLoadingProp = false,
86
51
  disabled = false
87
52
  }) {
88
- var _a, _b, _c, _d;
53
+ var _a, _b, _c, _d, _e;
89
54
  const {
90
55
  width: screenWidth
91
56
  } = useWindowDimensions();
@@ -166,9 +131,7 @@ function HomeScreenContent({
166
131
  }, []);
167
132
  const handleModeSwitch = useCallback((mode) => {
168
133
  setActiveMode(mode);
169
- if (mode === "build") {
170
- setShowTemplateModal(true);
171
- } else {
134
+ if (mode !== "build") {
172
135
  setShowTemplateModal(false);
173
136
  setSelectedTemplateGroup(null);
174
137
  setSelectedBuildTemplate(null);
@@ -233,9 +196,12 @@ function HomeScreenContent({
233
196
  setShowTemplateModal(false);
234
197
  }, []);
235
198
  const handleClearBuildTemplate = useCallback(() => {
236
- setSelectedBuildTemplate(null);
199
+ if (selectedBuildTemplate) {
200
+ setSelectedBuildTemplate(null);
201
+ return;
202
+ }
237
203
  setSelectedTemplateGroup(null);
238
- }, []);
204
+ }, [selectedBuildTemplate]);
239
205
  const handleSubmit = useCallback(async (attachments) => {
240
206
  var _a2;
241
207
  if (!canSubmit || isLoading || disabled) return;
@@ -325,6 +291,10 @@ function HomeScreenContent({
325
291
  const handleValueChange = useCallback((e) => {
326
292
  setValue(e.nativeEvent.text);
327
293
  }, []);
294
+ const handleInjectPrompt = useCallback((prompt, mode) => {
295
+ setValue(prompt);
296
+ if (mode) setActiveMode(mode);
297
+ }, []);
328
298
  const handleMicPress = useCallback(() => {
329
299
  if (hasQuery) return;
330
300
  setVoiceError(null);
@@ -401,6 +371,7 @@ function HomeScreenContent({
401
371
  title: "Choose Template"
402
372
  };
403
373
  }, [isBuildMode, showTemplateModal, templateModalItems, selectedTemplateGroup, handleSelectTemplateGroup]);
374
+ const renderTemplateModal = useCallback((config) => /* @__PURE__ */ jsx(ChooseTemplateModal, { isOpen: config.isOpen, onClose: config.onClose, templates: config.templates, selectedId: config.selectedId, onSelect: config.onSelect, suggestedId: config.suggestedId, title: config.title, isDark, loading: templateGroupsLoading }), [isDark, templateGroupsLoading]);
404
375
  const rightItems = useMemo(() => getDefaultRightItems({
405
376
  tag: {
406
377
  enabled: false
@@ -436,12 +407,13 @@ function HomeScreenContent({
436
407
  backgroundColor: surfaceColor
437
408
  }, children: [
438
409
  /* @__PURE__ */ jsx(WebBuilderPrewarm, { enabled: isBuildMode, orgName: effectiveOrgName, projectId: effectiveProjectId, tagId }),
439
- /* @__PURE__ */ jsx(TouchableWithoutFeedback, { onPress: Keyboard.dismiss, accessible: false, children: /* @__PURE__ */ jsxs(Box, { flex: 1, width: "100%", position: "relative", children: [
440
- /* @__PURE__ */ jsx(EmptyStateSection, { isDark, secondaryTextColor, primaryTextColor, activeMode, onModeSwitch: handleModeSwitch, orgName: effectiveOrgName, selectedTemplateGroup, selectedBuildTemplateId: (_d = selectedBuildTemplate == null ? void 0 : selectedBuildTemplate.id) != null ? _d : null, onUseBuildTemplate: handleUseBuildTemplate }),
441
- /* @__PURE__ */ jsx(View, { style: [styles.bottomComposerWrap, {
442
- bottom: Math.max(0, keyboardHeight - insets.bottom),
443
- paddingBottom: Math.max(insets.bottom - 6, 2)
444
- }], children: /* @__PURE__ */ jsxs(View, { style: [styles.bottomComposerInner, {
410
+ /* @__PURE__ */ jsx(TouchableWithoutFeedback, { onPress: Keyboard.dismiss, accessible: false, children: /* @__PURE__ */ jsxs(Box, { flex: 1, width: "100%", style: {
411
+ paddingBottom: Math.max(0, keyboardHeight - insets.bottom)
412
+ }, children: [
413
+ /* @__PURE__ */ jsx(EmptyStateSection, { isDark, secondaryTextColor, primaryTextColor, activeMode, selectedTemplateGroup, selectedBuildTemplateId: (_d = selectedBuildTemplate == null ? void 0 : selectedBuildTemplate.id) != null ? _d : null, showSuggestions: keyboardHeight === 0, onInjectPrompt: handleInjectPrompt }),
414
+ /* @__PURE__ */ jsx(View, { style: [styles.composerDock, {
415
+ paddingBottom: Math.max(insets.bottom - 6, 8)
416
+ }], children: /* @__PURE__ */ jsxs(View, { style: [styles.composerInner, {
445
417
  width: contentMaxWidth
446
418
  }], children: [
447
419
  voiceError ? /* @__PURE__ */ jsx(View, { style: [styles.voiceErrorBanner, {
@@ -450,79 +422,40 @@ function HomeScreenContent({
450
422
  }], children: /* @__PURE__ */ jsx(Text, { style: [styles.voiceErrorText, {
451
423
  color: isDark ? "#fecaca" : "#991b1b"
452
424
  }], children: voiceError }) }) : null,
453
- showAudioRecorder ? (
454
- /*
455
- * Render-time JS errors thrown by `useAudioRecorder`
456
- * (e.g. expo-audio native module missing, recorder
457
- * constructor throws in a release build) are caught
458
- * by the boundary and converted into a soft cancel
459
- * via the same handlers the panel itself uses on
460
- * runtime errors. Without this, a throw during the
461
- * panel's render phase kills the JS thread in
462
- * release / TestFlight.
463
- */
464
- /* @__PURE__ */ jsx(MicErrorBoundary, { onCancel: handleRecorderCancel, onError: handleRecorderError, children: /* @__PURE__ */ jsx(AudioRecorderPanel, { isDark, onTranscriptionComplete: handleTranscriptionComplete, onCancel: handleRecorderCancel, onError: handleRecorderError }) })
465
- ) : /* @__PURE__ */ jsx(InputToolBar, { inputConfig, leftItems, rightItems, templateButton, templateModalConfig, micSendButton })
425
+ showAudioRecorder ? /* @__PURE__ */ jsx(MicErrorBoundary, { onCancel: handleRecorderCancel, onError: handleRecorderError, children: /* @__PURE__ */ jsx(AudioRecorderPanel, { isDark, onTranscriptionComplete: handleTranscriptionComplete, onCancel: handleRecorderCancel, onError: handleRecorderError }) }) : /* @__PURE__ */ jsx(InputToolBar, { inputConfig, leftItems, rightItems, templateButton, templateModalConfig, templateModalRender: renderTemplateModal, micSendButton }),
426
+ isBuildMode ? /* @__PURE__ */ jsx(BuildTemplatesSection, { enabled: true, compact: keyboardHeight > 0, group: selectedTemplateGroup, orgName: effectiveOrgName, isDark, primaryTextColor, secondaryTextColor, selectedTemplateId: (_e = selectedBuildTemplate == null ? void 0 : selectedBuildTemplate.id) != null ? _e : null, onUseTemplate: handleUseBuildTemplate }) : null
466
427
  ] }) })
467
428
  ] }) })
468
429
  ] });
469
430
  }
470
431
  const styles = StyleSheet.create({
471
- emptyCenterTitleWrap: {
472
- flexGrow: 1,
432
+ emptyWrap: {
433
+ flex: 1,
473
434
  alignItems: "center",
474
- justifyContent: "flex-start",
475
- paddingHorizontal: 24,
476
- paddingTop: 88,
477
- paddingBottom: 160,
478
- maxWidth: 520,
479
- width: "100%",
480
- alignSelf: "center"
481
- },
482
- emptyEyebrow: {
483
- fontSize: 12,
484
- fontWeight: "600",
485
- letterSpacing: 0.4,
486
- textTransform: "uppercase",
487
- marginBottom: 10
435
+ justifyContent: "center",
436
+ paddingHorizontal: 28,
437
+ width: "100%"
488
438
  },
489
439
  emptyCenterTitle: {
490
- marginTop: 2,
491
- fontSize: 30,
440
+ fontSize: 28,
492
441
  fontWeight: "700",
493
442
  textAlign: "center",
494
443
  letterSpacing: -0.5
495
444
  },
496
445
  emptySubtitle: {
497
- marginTop: 12,
498
- fontSize: 14,
446
+ marginTop: 8,
447
+ fontSize: 15,
499
448
  lineHeight: 22,
500
449
  textAlign: "center",
501
- paddingHorizontal: 16,
502
- maxWidth: 360
450
+ maxWidth: 320
503
451
  },
504
- bottomComposerWrap: {
505
- position: "absolute",
452
+ composerDock: {
506
453
  width: "100%",
507
- left: 0,
508
- right: 0,
509
- bottom: 0,
510
- alignItems: "center",
511
- justifyContent: "flex-end",
512
- shadowColor: "#0f172a",
513
- shadowOpacity: 0.08,
514
- shadowRadius: 8,
515
- shadowOffset: {
516
- width: 0,
517
- height: -2
518
- },
519
- backgroundColor: "transparent",
520
- elevation: 6
454
+ alignItems: "center"
521
455
  },
522
- bottomComposerInner: {
456
+ composerInner: {
523
457
  paddingHorizontal: 14,
524
- paddingTop: 10,
525
- paddingBottom: 4
458
+ paddingTop: 4
526
459
  },
527
460
  voiceErrorBanner: {
528
461
  marginBottom: 8,
@@ -534,45 +467,6 @@ const styles = StyleSheet.create({
534
467
  voiceErrorText: {
535
468
  fontSize: 12,
536
469
  fontWeight: "500"
537
- },
538
- emptyModePillRow: {
539
- flexDirection: "row",
540
- alignItems: "center",
541
- gap: 8,
542
- marginBottom: 22,
543
- borderRadius: 16,
544
- padding: 6,
545
- borderWidth: 1,
546
- shadowColor: "#312e81",
547
- shadowOpacity: 0.08,
548
- shadowRadius: 8,
549
- shadowOffset: {
550
- width: 0,
551
- height: 3
552
- },
553
- elevation: 3
554
- },
555
- emptyModePill: {
556
- flexDirection: "row",
557
- alignItems: "center",
558
- gap: 4,
559
- paddingHorizontal: 12,
560
- paddingVertical: 7,
561
- borderRadius: 11
562
- },
563
- emptyModePillActive: {
564
- shadowColor: "#312e81",
565
- shadowOpacity: 0.18,
566
- shadowRadius: 6,
567
- shadowOffset: {
568
- width: 0,
569
- height: 2
570
- },
571
- elevation: 2
572
- },
573
- emptyModePillLabel: {
574
- fontSize: 12,
575
- fontWeight: "600"
576
470
  }
577
471
  });
578
472
  const HomeScreen = (props) => /* @__PURE__ */ jsx(HomeScreenContent, __spreadValues({}, props));export{HomeScreen as default};//# sourceMappingURL=HomeScreen.js.map