@adminide-stack/yantra-mobile 12.0.44-alpha.15 → 12.0.44-alpha.18

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 (73) hide show
  1. package/lib/bridge/handlers/NavigationBridgeHandler.js +3 -1
  2. package/lib/bridge/handlers/NavigationBridgeHandler.js.map +1 -1
  3. package/lib/components/CustomDrawer.js +122 -82
  4. package/lib/components/CustomDrawer.js.map +1 -1
  5. package/lib/components/NavigationHeader/NavigationHeader.js +16 -30
  6. package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
  7. package/lib/compute.js +54 -5
  8. package/lib/compute.js.map +1 -1
  9. package/lib/features/apps/AppsCatalog.js +200 -0
  10. package/lib/features/apps/AppsCatalog.js.map +1 -0
  11. package/lib/features/apps/resolveSurfaceUrl.js +22 -2
  12. package/lib/features/apps/resolveSurfaceUrl.js.map +1 -1
  13. package/lib/features/attachments/ComposerAttachmentBar.js +64 -0
  14. package/lib/features/attachments/ComposerAttachmentBar.js.map +1 -0
  15. package/lib/features/attachments/MessageAttachmentPreviews.js +77 -0
  16. package/lib/features/attachments/MessageAttachmentPreviews.js.map +1 -0
  17. package/lib/features/attachments/attachmentPreviewUri.js +9 -0
  18. package/lib/features/attachments/attachmentPreviewUri.js.map +1 -0
  19. package/lib/features/attachments/buildGatewayMedia.js +118 -0
  20. package/lib/features/attachments/buildGatewayMedia.js.map +1 -0
  21. package/lib/features/attachments/composerAttachmentHandoff.js +15 -0
  22. package/lib/features/attachments/composerAttachmentHandoff.js.map +1 -0
  23. package/lib/features/attachments/displayUserMessageText.js +19 -0
  24. package/lib/features/attachments/displayUserMessageText.js.map +1 -0
  25. package/lib/features/attachments/historyAttachmentLabel.js +51 -0
  26. package/lib/features/attachments/historyAttachmentLabel.js.map +1 -0
  27. package/lib/features/attachments/isImageAttachment.js +7 -0
  28. package/lib/features/attachments/isImageAttachment.js.map +1 -0
  29. package/lib/features/attachments/preserveAttachmentPreviews.js +41 -0
  30. package/lib/features/attachments/preserveAttachmentPreviews.js.map +1 -0
  31. package/lib/features/attachments/uploadChatAttachments.js +102 -0
  32. package/lib/features/attachments/uploadChatAttachments.js.map +1 -0
  33. package/lib/features/attachments/useImageAttachments.js +102 -7
  34. package/lib/features/attachments/useImageAttachments.js.map +1 -1
  35. package/lib/features/canvas/nativeViewerRegistry.js +8 -1
  36. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  37. package/lib/features/canvas/surfaceIndex.js +25 -0
  38. package/lib/features/canvas/surfaceIndex.js.map +1 -0
  39. package/lib/features/canvas/useCanvasSession.js +57 -0
  40. package/lib/features/canvas/useCanvasSession.js.map +1 -0
  41. package/lib/features/chat/ChatTranscript.js +198 -0
  42. package/lib/features/chat/ChatTranscript.js.map +1 -0
  43. package/lib/hooks/useCdecliChannel.js +5 -3
  44. package/lib/hooks/useCdecliChannel.js.map +1 -1
  45. package/lib/hooks/useChatApi.js +32 -15
  46. package/lib/hooks/useChatApi.js.map +1 -1
  47. package/lib/hooks/useChatStream.js +35 -8
  48. package/lib/hooks/useChatStream.js.map +1 -1
  49. package/lib/index.js +1 -1
  50. package/lib/index.js.map +1 -1
  51. package/lib/routes.json +56 -4
  52. package/lib/screens/Apps/index.js +20 -0
  53. package/lib/screens/Apps/index.js.map +1 -0
  54. package/lib/screens/CanvasBoard/index.js +20 -15
  55. package/lib/screens/CanvasBoard/index.js.map +1 -1
  56. package/lib/screens/Chat/index.js +39 -62
  57. package/lib/screens/Chat/index.js.map +1 -1
  58. package/lib/screens/ChatHistory/index.js +2 -8
  59. package/lib/screens/ChatHistory/index.js.map +1 -1
  60. package/lib/screens/Home/HomeScreen.js +57 -21
  61. package/lib/screens/Home/HomeScreen.js.map +1 -1
  62. package/lib/screens/Home/components/ChatHistoryLanding.js +15 -9
  63. package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
  64. package/lib/screens/WebBuilder/index.js.map +1 -1
  65. package/lib/utils/navigateToNewChatHome.js +40 -0
  66. package/lib/utils/navigateToNewChatHome.js.map +1 -0
  67. package/package.json +2 -2
  68. package/lib/components/AppsMenu/AppsMenu.js +0 -295
  69. package/lib/components/AppsMenu/AppsMenu.js.map +0 -1
  70. package/lib/components/NavigationHeader/ChatHistoryToggleMobile.js +0 -6
  71. package/lib/components/NavigationHeader/ChatHistoryToggleMobile.js.map +0 -1
  72. package/lib/features/canvas/canvasCore.js +0 -41
  73. package/lib/features/canvas/canvasCore.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"HomeScreen.js","sources":["../../../src/screens/Home/HomeScreen.tsx"],"sourcesContent":["import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Keyboard, Pressable, ScrollView, StyleSheet, View, useColorScheme, useWindowDimensions } from 'react-native';\nimport { InputToolBar, Text, getDefaultLeftItems, getDefaultRightItems } from '@admin-layout/gluestack-ui-mobile';\nimport { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { useNavigation, useRoute, CommonActions } from '@react-navigation/native';\nimport { KeyboardComposerDock } from '../../components/KeyboardComposerDock';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { v4 as uuidv4 } from 'uuid';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { syncMobileOrgRouteContext } from '../../utils/syncMobileOrgRouteContext';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { AudioRecorderPanel } from '../../features/audio-input/AudioRecorderPanel';\nimport { MicErrorBoundary } from '../../features/audio-input/MicErrorBoundary';\nimport { requestMicPermission } from '../../features/audio-input/useAudioPermission';\nimport type { ModeSubmission, RoutingMode } from './types';\nimport { mobileTokens } from '../../theme/mobileTokens';\nimport { type BuildTemplateCard } from '../../features/templates/buildTemplateCards';\nimport { useMarketplaceTemplateGroups } from '../../hooks/useMarketplaceTemplateGroups';\nimport { useKeyboardBottomOffset } from '../../hooks/useKeyboardBottomOffset';\nimport { BuildTemplatesSection } from './components/BuildTemplatesSection';\nimport { ChooseTemplateModal } from './components/ChooseTemplateModal';\nimport { HomeSuggestions } from './components/HomeSuggestions';\nimport { WebBuilderPrewarm } from './components/WebBuilderPrewarm';\n\n/**\n * Build the channel `title` we persist on creation. This is the server-side mode\n * signal (web parity: `useYantraComposerChannelSubmit`): the backend inspects the\n * title prefix to route deep-search requests differently from plain chat. The\n * UI never displays this raw string — `buildSessionFromChannel` filters\n * `chat-channel-…` / `deep-search-…` titles out of the history label cascade\n * and derives the visible label from the user's first message instead.\n *\n * Previously we used the user's prompt directly as the title for friendlier\n * history rows, but that silently disabled the server's mode detection — every\n * \"deep-search\" submission landed as a plain chat. Restored to the web scheme.\n */\nfunction buildChannelTitle(mode: RoutingMode, channelId: string): string {\n if (mode === 'deep-search') return `deep-search-${channelId}`;\n if (mode === 'build') return `build-channel-${channelId}`;\n return `chat-channel-${channelId}`;\n}\n\nexport type { RoutingMode, ModeSubmission };\n\nexport interface HomeScreenProps {\n initialMode?: RoutingMode;\n onSubmit?: (submission: ModeSubmission) => void;\n onStop?: () => void;\n isLoading?: boolean;\n disabled?: boolean;\n}\n\ninterface EmptyStateSectionProps {\n isDark: boolean;\n secondaryTextColor: string;\n primaryTextColor: string;\n activeMode: RoutingMode;\n selectedTemplateGroup: string | null;\n selectedBuildTemplateId: string | null;\n compact: boolean;\n onInjectPrompt: (prompt: string, mode?: RoutingMode) => void;\n}\n\nconst EmptyStateSection = React.memo(function EmptyStateSection({\n isDark,\n secondaryTextColor,\n primaryTextColor,\n activeMode,\n selectedTemplateGroup,\n selectedBuildTemplateId,\n compact,\n onInjectPrompt,\n}: EmptyStateSectionProps) {\n const title =\n activeMode === 'build'\n ? 'What should we build?'\n : activeMode === 'deep-search'\n ? 'What should we research?'\n : 'Ask anything';\n const subtitle =\n activeMode === 'build'\n ? selectedBuildTemplateId\n ? 'Describe the project, then send.'\n : selectedTemplateGroup\n ? 'Tap a starter below, then send.'\n : 'Tap Template to pick a group, then send.'\n : activeMode === 'deep-search'\n ? 'Source-backed answers from the web.'\n : 'Chat, Deep Search, or Build from the composer.';\n\n return (\n <View style={styles.emptyInner}>\n <Text\n style={[\n styles.emptyCenterTitle,\n compact && styles.emptyCenterTitleCompact,\n { color: primaryTextColor },\n ]}\n >\n {title}\n </Text>\n <Text style={[styles.emptySubtitle, compact && styles.emptySubtitleCompact, { color: secondaryTextColor }]}>\n {subtitle}\n </Text>\n {activeMode === 'chat' ? (\n <HomeSuggestions\n isDark={isDark}\n compact={compact}\n primaryTextColor={primaryTextColor}\n secondaryTextColor={secondaryTextColor}\n onInjectPrompt={onInjectPrompt}\n />\n ) : null}\n </View>\n );\n});\n\nfunction HomeScreenContent({\n initialMode = 'chat',\n onSubmit: onSubmitProp,\n isLoading: isLoadingProp = false,\n disabled = false,\n}: HomeScreenProps) {\n const { width: screenWidth } = useWindowDimensions();\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const navigation = useNavigation<any>();\n const route = useRoute<any>();\n const dispatch = useDispatch();\n const syncedRouteOrgRef = useRef<string | null>(null);\n const mobileRoutePath = useSelector(\n (state: { router?: { location?: { currentRoute?: { path?: string } } } }) =>\n state.router?.location?.currentRoute?.path,\n );\n\n const [value, setValue] = useState('');\n const [activeMode, setActiveMode] = useState<RoutingMode>(initialMode);\n /**\n * `showAudioRecorder` swaps the InputToolBar for the inline voice recorder\n * panel — same pattern as the web composer\n * (`YantraSearchComposer.tsx`'s `showAudioRecorder` branch).\n */\n const [showAudioRecorder, setShowAudioRecorder] = useState(false);\n /**\n * Build-mode template group (`codeAssistant`, …) — same picker web uses before\n * `DefaultFormTemplatesSection` loads remix cards with `snapshotId`.\n */\n const [selectedTemplateGroup, setSelectedTemplateGroup] = useState<string | null>(null);\n /** Armed remix card — submit sends input `message` + this card's `snapshotId`. */\n const [selectedBuildTemplate, setSelectedBuildTemplate] = useState<BuildTemplateCard | null>(null);\n const [showTemplateModal, setShowTemplateModal] = useState(false);\n const [voiceError, setVoiceError] = useState<string | null>(null);\n\n const { createChannel } = useChatMutations();\n const {\n orgName: resolvedOrgName,\n projectId,\n tagId,\n accountUserId,\n loading: prerequisitesLoading,\n orgLoading,\n } = usePrerequisiteIds();\n const routeOrgName = ((route?.params?.orgName as string | undefined) ?? '').trim() || null;\n const effectiveOrgName = resolvedOrgName || routeOrgName || null;\n const effectiveProjectId = projectId || null;\n\n const { groups: marketplaceTemplateGroups, loading: templateGroupsLoading } = useMarketplaceTemplateGroups({\n orgName: effectiveOrgName,\n enabled: true,\n });\n\n const trimmedQuery = value.trim();\n const isBuildMePrefixOnly = /^build\\s*me\\s*:?\\s*$/i.test(trimmedQuery);\n const hasQuery = trimmedQuery.length > 0 && !isBuildMePrefixOnly;\n const canSubmit = hasQuery && Boolean(routeOrgName || effectiveOrgName);\n const isLoading = isLoadingProp;\n const isResearchMode = activeMode === 'deep-search';\n const isBuildMode = activeMode === 'build';\n const inputPlaceholder = !effectiveOrgName\n ? 'Initializing workspace...'\n : isResearchMode\n ? 'Research anything...'\n : isBuildMode\n ? selectedBuildTemplate\n ? 'Build me: describe your project…'\n : 'Describe an app to build...'\n : 'Ask anything...';\n\n const insets = useSafeAreaInsets();\n const { keyboardVisible } = useKeyboardBottomOffset();\n\n const handleModeSwitch = useCallback((mode: RoutingMode) => {\n setActiveMode(mode);\n if (mode !== 'build') {\n setShowTemplateModal(false);\n setSelectedTemplateGroup(null);\n setSelectedBuildTemplate(null);\n }\n }, []);\n\n /**\n * Mirrors the web `useYantraComposerChannelSubmit`: on submit we generate a client-side\n * channel id, fire-and-forget the createChannel mutation, then navigate immediately to\n * the Chat screen with the user's prompt. The Chat screen mounts, awaits the in-flight\n * creation just before saveMessages, and starts streaming the assistant response.\n */\n const navigateToChat = useCallback(\n (channelId: string, query: string, mode: RoutingMode, attachments?: ModeSubmission['attachments']) => {\n const params: Record<string, unknown> = {\n channelId,\n orgName: effectiveOrgName ?? routeOrgName ?? undefined,\n initialQuery: query,\n initialMode: mode,\n };\n if (attachments && attachments.length > 0) {\n params.initialAttachments = attachments;\n }\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.Chat',\n params,\n }),\n );\n },\n [navigation, effectiveOrgName, routeOrgName],\n );\n\n type WebBuilderHandoff = {\n message: string;\n snapshotId?: string;\n templateId?: string;\n templateTitle?: string;\n seedTemplate?: string;\n deployUrl?: string;\n previewUrl?: string;\n };\n\n /**\n * Build mode → Web Builder (`/c/:channelId/webbuilder`).\n * Template remix passes `snapshotId` so the surface boots from that E2B snapshot.\n */\n const navigateToWebBuilder = useCallback(\n (channelId: string, handoff: WebBuilderHandoff) => {\n // Snapshot remix: do not stamp shared org projectId — surface mints a fresh\n // channel+project (web Templates picker parity). Passing DEFAULT_YANTRA_PROJECT\n // made results merge into existing gallery tiles (Counter App).\n const isRemix = Boolean(handoff.snapshotId?.trim());\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.WebBuilder',\n params: {\n orgName: effectiveOrgName ?? routeOrgName ?? undefined,\n // Snapshot remix: omit channelId — surface mints a fresh listen\n // channel. Passing the pre-created id made hydrate re-bind poll onto\n // an empty channel while Inngest published to the minted id.\n ...(!isRemix ? { channelId } : {}),\n ...(!isRemix && effectiveProjectId ? { projectId: effectiveProjectId } : {}),\n message: handoff.message,\n ...(handoff.snapshotId ? { snapshotId: handoff.snapshotId } : {}),\n ...(handoff.templateId ? { templateId: handoff.templateId } : {}),\n ...(handoff.templateTitle ? { templateTitle: handoff.templateTitle } : {}),\n ...(handoff.seedTemplate ? { seedTemplate: handoff.seedTemplate } : {}),\n },\n }),\n );\n },\n [navigation, effectiveOrgName, routeOrgName, effectiveProjectId],\n );\n\n /**\n * Tap a Yantra card → arm it (store snapshotId). Do NOT navigate yet.\n * Composer shows \"Build me: \" — user writes the project brief (no template title).\n */\n const handleUseBuildTemplate = useCallback((card: BuildTemplateCard) => {\n const snapshotId = card.snapshotId?.trim();\n if (!snapshotId) {\n console.warn('[HomeScreen] template missing snapshotId — select another remixable card.');\n }\n setSelectedBuildTemplate(card);\n setValue((prev) => {\n const trimmed = prev.trim();\n // Keep whatever the user already typed; otherwise seed only the prefix.\n if (trimmed && !/^build\\s*me\\s*:?\\s*$/i.test(trimmed)) return prev;\n return 'Build me: ';\n });\n }, []);\n\n const handleSelectTemplateGroup = useCallback((groupId: string) => {\n setSelectedTemplateGroup(groupId);\n setSelectedBuildTemplate(null);\n setShowTemplateModal(false);\n }, []);\n\n const handleClearBuildTemplate = useCallback(() => {\n if (selectedBuildTemplate) {\n setSelectedBuildTemplate(null);\n return;\n }\n setSelectedTemplateGroup(null);\n }, [selectedBuildTemplate]);\n\n const handleSubmit = useCallback(\n async (attachments?: ModeSubmission['attachments']) => {\n if (!canSubmit || isLoading || disabled) return;\n\n const submission: ModeSubmission = {\n mode: activeMode,\n query: trimmedQuery,\n attachments,\n };\n if (onSubmitProp) {\n onSubmitProp(submission);\n }\n\n if (!effectiveOrgName) {\n console.warn('[HomeScreen] orgName not ready — skipping submit.');\n return;\n }\n // Project can lag behind org after a competing hook stole bootstrap; use the\n // known testing project so Build/Chat are not stuck on \"not ready\".\n const submitProjectId = effectiveProjectId || '9a8ac704-1040-4836-9b72-48b771ca91b1';\n if (!effectiveProjectId) {\n console.warn('[HomeScreen] projectId not ready — using testing project fallback for submit.');\n }\n\n const requestedChannelId = uuidv4();\n /**\n * Title is the server's mode signal (`deep-search-…` / `build-channel-…` / `chat-channel-…`).\n * It's NOT the history label — the history list derives that from the\n * first user message via `buildSessionFromChannel`.\n */\n const title = buildChannelTitle(activeMode, requestedChannelId);\n\n const queryToForward = trimmedQuery;\n const attachmentsToForward = attachments;\n setValue('');\n\n void createChannel({\n id: requestedChannelId,\n title,\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName: effectiveOrgName,\n projectId: submitProjectId,\n } as any).catch((err) => {\n console.error('[HomeScreen] createChannel failed:', err);\n });\n\n if (activeMode === 'build') {\n const tpl = selectedBuildTemplate;\n const snapshotId = tpl?.snapshotId?.trim() || undefined;\n // Stack for webbuilder modelConfig.template — never marketplace keys\n // like aieditor-code-extractor. Do NOT pass previewUrl (live E2B host)\n // or the surface/backend may reconnect that sandbox instead of remixing.\n const rawStack = (tpl?.templateName || '').toLowerCase();\n const seedTemplate = snapshotId\n ? rawStack.includes('next')\n ? 'nextjs'\n : rawStack.includes('vue')\n ? 'vue'\n : 'vite-react'\n : undefined;\n navigateToWebBuilder(requestedChannelId, {\n message: queryToForward,\n snapshotId,\n templateId: tpl ? tpl.formTemplateId || tpl.id : undefined,\n templateTitle: tpl?.title,\n seedTemplate,\n });\n setSelectedBuildTemplate(null);\n return;\n }\n\n navigateToChat(requestedChannelId, queryToForward, activeMode, attachmentsToForward);\n },\n [\n canSubmit,\n isLoading,\n disabled,\n activeMode,\n trimmedQuery,\n onSubmitProp,\n effectiveOrgName,\n effectiveProjectId,\n createChannel,\n navigateToChat,\n navigateToWebBuilder,\n selectedBuildTemplate,\n ],\n );\n\n const surfaceColor = isDark ? '#0f172a' : mobileTokens.color.surface;\n const primaryTextColor = isDark ? '#e5e7eb' : mobileTokens.color.text;\n const secondaryTextColor = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const contentMaxWidth = Math.min(720, Math.max(360, screenWidth - 24));\n\n /**\n * After verify-user, Home mounts with empty `route.params.orgName`. Settings load via\n * `usePrerequisiteIds` (single useSettings). Merge-navigate does not re-fire LOCATION_CHANGE\n * on the same path; sync params + LOCATION_CHANGE + orgChangeAction like refresh does.\n */\n useEffect(() => {\n const currentRouteOrgName = (route?.params?.orgName as string | undefined)?.trim() || '';\n if (currentRouteOrgName) {\n syncedRouteOrgRef.current = currentRouteOrgName;\n return;\n }\n const orgToApply = resolvedOrgName;\n if (!orgToApply || orgLoading) {\n return;\n }\n if (syncedRouteOrgRef.current === orgToApply) {\n return;\n }\n\n syncedRouteOrgRef.current = orgToApply;\n syncMobileOrgRouteContext(dispatch, orgToApply, {\n userId: accountUserId,\n routePath: mobileRoutePath,\n });\n navigation.dispatch(\n CommonActions.navigate({\n name: route?.name ?? 'MainStack.Layout.Home',\n params: { ...(route?.params || {}), orgName: orgToApply },\n merge: true,\n }),\n );\n }, [\n dispatch,\n navigation,\n route?.name,\n route?.params,\n route?.params?.orgName,\n resolvedOrgName,\n accountUserId,\n mobileRoutePath,\n orgLoading,\n ]);\n\n const handleValueChange = useCallback((e: any) => {\n setValue(e.nativeEvent.text);\n }, []);\n\n const handleInjectPrompt = useCallback((prompt: string, mode?: RoutingMode) => {\n setValue(prompt);\n if (mode) setActiveMode(mode);\n }, []);\n\n /**\n * Mic affordance — web parity (`handleMicClick` in `YantraSearchComposer.tsx`).\n *\n * Only opens the recorder when the input is empty: if the user already has\n * a draft, the same button must act as Send (the `MicSendButton` in\n * `InputToolBar.tsx` already swaps its glyph from mic→send based on\n * `hasContent`, so this branch only fires when the icon is visibly a mic).\n *\n * Permission is requested HERE, before the panel mounts. The previous flow\n * flipped `showAudioRecorder=true` immediately, which mounted\n * `AudioRecorderPanel` and constructed the native `AVAudioRecorder` via\n * `useAudioRecorder()` during the panel's render phase — before iOS had\n * granted mic access. On SDK 53 + `newArchEnabled: true` + Hermes that\n * ordering hard-crashes TestFlight builds even though it works in Expo Go\n * (Expo Go pre-caches permission). Asking up front means iOS shows the\n * system alert first and the panel only mounts (and therefore the native\n * recorder is only allocated) once permission is granted.\n *\n * `expo-audio` is lazy-imported so a missing/broken native module surfaces\n * as a user-visible banner instead of a synchronous TurboModule crash.\n */\n const handleMicPress = useCallback(() => {\n if (hasQuery) return;\n setVoiceError(null);\n Keyboard.dismiss();\n void (async () => {\n const { granted, error } = await requestMicPermission();\n if (!granted) {\n setVoiceError(error || 'Microphone is not available.');\n return;\n }\n setShowAudioRecorder(true);\n })();\n }, [hasQuery]);\n\n const handleTranscriptionComplete = useCallback((text: string) => {\n const cleaned = (text ?? '').trim();\n setShowAudioRecorder(false);\n if (!cleaned) return;\n /*\n * Append on top of any existing draft (web `setQuery((prev) => …)`).\n * Single-space separator keeps the transcript readable when the user\n * dictates multiple times before sending.\n */\n setValue((prev) => (prev.trim().length > 0 ? `${prev.trim()} ${cleaned}` : cleaned));\n }, []);\n\n const handleRecorderCancel = useCallback(() => {\n setShowAudioRecorder(false);\n }, []);\n\n const handleRecorderError = useCallback((error: string) => {\n /*\n * Surface the failure to the user but don't trap them in the recorder —\n * `AudioRecorderPanel` already calls `onCancel` after an error, so we\n * just record the message here for the (lightweight) banner below.\n */\n setVoiceError(error);\n }, []);\n\n const leftItems = useMemo(\n () =>\n getDefaultLeftItems({\n search: {\n active: activeMode === 'chat',\n onClick: () => handleModeSwitch('chat'),\n },\n zap: {\n active: activeMode === 'deep-search',\n onClick: () => handleModeSwitch('deep-search'),\n },\n lightbulb: {\n active: activeMode === 'build',\n onClick: () => handleModeSwitch('build'),\n },\n }),\n [activeMode, handleModeSwitch],\n );\n\n const templateModalItems = useMemo(\n () =>\n marketplaceTemplateGroups.map((group) => ({\n id: group.id,\n label: group.label,\n description: group.description,\n category: group.category,\n })),\n [marketplaceTemplateGroups],\n );\n\n const selectedTemplateLabel = useMemo(() => {\n if (selectedBuildTemplate?.title?.trim()) return selectedBuildTemplate.title.trim();\n if (!selectedTemplateGroup) return undefined;\n return marketplaceTemplateGroups.find((g) => g.id === selectedTemplateGroup)?.label || selectedTemplateGroup;\n }, [marketplaceTemplateGroups, selectedTemplateGroup, selectedBuildTemplate]);\n\n const templateButton = useMemo(() => {\n if (!isBuildMode) return null;\n return {\n label: 'Template',\n count: marketplaceTemplateGroups.length,\n selectedLabel: selectedTemplateLabel,\n onClick: () => setShowTemplateModal(true),\n onClearTemplate: handleClearBuildTemplate,\n disabled: isLoading || disabled || (templateGroupsLoading && marketplaceTemplateGroups.length === 0),\n };\n }, [\n isBuildMode,\n marketplaceTemplateGroups.length,\n selectedTemplateLabel,\n handleClearBuildTemplate,\n isLoading,\n disabled,\n templateGroupsLoading,\n ]);\n\n const templateModalConfig = useMemo(() => {\n if (!isBuildMode) return null;\n return {\n isOpen: showTemplateModal,\n onClose: () => setShowTemplateModal(false),\n templates: templateModalItems,\n selectedId: selectedTemplateGroup,\n onSelect: handleSelectTemplateGroup,\n title: 'Choose Template',\n };\n }, [isBuildMode, showTemplateModal, templateModalItems, selectedTemplateGroup, handleSelectTemplateGroup]);\n\n const renderTemplateModal = useCallback(\n (config: {\n isOpen: boolean;\n onClose: () => void;\n templates: Array<{ id: string; label: string; description?: string; category?: string }>;\n selectedId: string | null;\n onSelect: (id: string) => void;\n suggestedId?: string | null;\n title?: string;\n }) => (\n <ChooseTemplateModal\n isOpen={config.isOpen}\n onClose={config.onClose}\n templates={config.templates}\n selectedId={config.selectedId}\n onSelect={config.onSelect}\n suggestedId={config.suggestedId}\n title={config.title}\n isDark={isDark}\n loading={templateGroupsLoading}\n />\n ),\n [isDark, templateGroupsLoading],\n );\n\n const rightItems = useMemo(\n () =>\n getDefaultRightItems({\n tag: { enabled: false },\n chip: { enabled: false },\n camera: { enabled: false },\n image: { enabled: false },\n attach: { enabled: false },\n }),\n [],\n );\n\n const inputConfig = useMemo(\n () => ({\n value,\n onChange: handleValueChange,\n placeholder: inputPlaceholder,\n disabled: isLoading || disabled,\n returnKeyType: 'send',\n blurOnSubmit: true,\n onSubmitEditing: () => {\n if (canSubmit) void handleSubmit();\n },\n }),\n [value, handleValueChange, inputPlaceholder, isLoading, disabled, canSubmit, handleSubmit],\n );\n\n const micSendButton = useMemo(\n () => ({\n hasContent: hasQuery,\n onSend: () => {\n Keyboard.dismiss();\n void handleSubmit();\n },\n onMic: handleMicPress,\n disabled: isLoading || disabled,\n isLoading,\n }),\n [hasQuery, handleSubmit, handleMicPress, isLoading, disabled],\n );\n\n return (\n <SafeAreaView edges={['left', 'right']} style={{ flex: 1, backgroundColor: surfaceColor }}>\n {/* Mint token + load webbuilder-surface off-screen while user picks a template. */}\n <WebBuilderPrewarm\n enabled={isBuildMode}\n orgName={effectiveOrgName}\n projectId={effectiveProjectId}\n tagId={tagId}\n />\n <View style={styles.flex}>\n <ScrollView\n style={styles.flex}\n contentContainerStyle={[\n styles.emptyScroll,\n keyboardVisible ? styles.emptyScrollCompact : styles.emptyScrollRelaxed,\n ]}\n keyboardShouldPersistTaps=\"handled\"\n keyboardDismissMode=\"interactive\"\n showsVerticalScrollIndicator={false}\n >\n <Pressable style={styles.dismissArea} onPress={Keyboard.dismiss} accessible={false}>\n <EmptyStateSection\n isDark={isDark}\n secondaryTextColor={secondaryTextColor}\n primaryTextColor={primaryTextColor}\n activeMode={activeMode}\n selectedTemplateGroup={selectedTemplateGroup}\n selectedBuildTemplateId={selectedBuildTemplate?.id ?? null}\n compact={keyboardVisible}\n onInjectPrompt={handleInjectPrompt}\n />\n </Pressable>\n </ScrollView>\n <KeyboardComposerDock closedInset={insets.bottom} keyboardVisible={keyboardVisible}>\n <View style={[styles.composerInner, { width: contentMaxWidth }]}>\n {voiceError ? (\n <View\n style={[\n styles.voiceErrorBanner,\n {\n backgroundColor: isDark ? '#2b1a1d' : '#fef2f2',\n borderColor: isDark ? '#7f1d1d' : '#fecaca',\n },\n ]}\n >\n <Text style={[styles.voiceErrorText, { color: isDark ? '#fecaca' : '#991b1b' }]}>\n {voiceError}\n </Text>\n </View>\n ) : null}\n {showAudioRecorder ? (\n <MicErrorBoundary onCancel={handleRecorderCancel} onError={handleRecorderError}>\n <AudioRecorderPanel\n isDark={isDark}\n onTranscriptionComplete={handleTranscriptionComplete}\n onCancel={handleRecorderCancel}\n onError={handleRecorderError}\n />\n </MicErrorBoundary>\n ) : (\n <InputToolBar\n inputConfig={inputConfig}\n leftItems={leftItems}\n rightItems={rightItems}\n templateButton={templateButton}\n templateModalConfig={templateModalConfig}\n templateModalRender={renderTemplateModal}\n micSendButton={micSendButton}\n />\n )}\n {isBuildMode ? (\n <BuildTemplatesSection\n enabled\n compact={keyboardVisible}\n group={selectedTemplateGroup}\n orgName={effectiveOrgName}\n isDark={isDark}\n primaryTextColor={primaryTextColor}\n secondaryTextColor={secondaryTextColor}\n selectedTemplateId={selectedBuildTemplate?.id ?? null}\n onUseTemplate={handleUseBuildTemplate}\n />\n ) : null}\n </View>\n </KeyboardComposerDock>\n </View>\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n flex: {\n flex: 1,\n },\n emptyScroll: {\n flexGrow: 1,\n width: '100%',\n paddingHorizontal: 28,\n },\n emptyScrollRelaxed: {\n justifyContent: 'center',\n paddingVertical: 24,\n },\n emptyScrollCompact: {\n justifyContent: 'flex-start',\n paddingTop: 8,\n paddingBottom: 12,\n },\n emptyInner: {\n alignItems: 'center',\n width: '100%',\n },\n dismissArea: {\n width: '100%',\n },\n emptyCenterTitle: {\n fontSize: 28,\n fontWeight: '700',\n textAlign: 'center',\n letterSpacing: -0.5,\n },\n emptyCenterTitleCompact: {\n fontSize: 22,\n },\n emptySubtitle: {\n marginTop: 8,\n fontSize: 15,\n lineHeight: 22,\n textAlign: 'center',\n maxWidth: 320,\n },\n emptySubtitleCompact: {\n marginTop: 4,\n fontSize: 13,\n lineHeight: 18,\n },\n composerInner: {\n paddingHorizontal: 14,\n paddingTop: 4,\n },\n voiceErrorBanner: {\n marginBottom: 8,\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderRadius: 10,\n borderWidth: 1,\n },\n voiceErrorText: {\n fontSize: 12,\n fontWeight: '500',\n },\n});\n\nconst HomeScreen: FC<HomeScreenProps> = (props) => <HomeScreenContent {...props} />;\n\nexport default HomeScreen;\n"],"names":["EmptyStateSection","_a","_b","_c","uuidv4"],"mappings":"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"}
1
+ {"version":3,"file":"HomeScreen.js","sources":["../../../src/screens/Home/HomeScreen.tsx"],"sourcesContent":["import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Keyboard, Pressable, ScrollView, StyleSheet, View, useColorScheme, useWindowDimensions } from 'react-native';\nimport { InputToolBar, Text, getDefaultLeftItems, getDefaultRightItems } from '@admin-layout/gluestack-ui-mobile';\nimport { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { useNavigation, useRoute, CommonActions } from '@react-navigation/native';\nimport { KeyboardComposerDock } from '../../components/KeyboardComposerDock';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { v4 as uuidv4 } from 'uuid';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { syncMobileOrgRouteContext } from '../../utils/syncMobileOrgRouteContext';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { AudioRecorderPanel } from '../../features/audio-input/AudioRecorderPanel';\nimport { MicErrorBoundary } from '../../features/audio-input/MicErrorBoundary';\nimport { requestMicPermission } from '../../features/audio-input/useAudioPermission';\nimport type { ModeSubmission, RoutingMode } from './types';\nimport { mobileTokens } from '../../theme/mobileTokens';\nimport { type BuildTemplateCard } from '../../features/templates/buildTemplateCards';\nimport { useMarketplaceTemplateGroups } from '../../hooks/useMarketplaceTemplateGroups';\nimport { useKeyboardBottomOffset } from '../../hooks/useKeyboardBottomOffset';\nimport { useImageAttachments } from '../../features/attachments/useImageAttachments';\nimport { ComposerAttachmentBar } from '../../features/attachments/ComposerAttachmentBar';\nimport { stashComposerAttachments } from '../../features/attachments/composerAttachmentHandoff';\nimport { BuildTemplatesSection } from './components/BuildTemplatesSection';\nimport { ChooseTemplateModal } from './components/ChooseTemplateModal';\nimport { HomeSuggestions } from './components/HomeSuggestions';\nimport { WebBuilderPrewarm } from './components/WebBuilderPrewarm';\n\n/**\n * Build the channel `title` we persist on creation. This is the server-side mode\n * signal (web parity: `useYantraComposerChannelSubmit`): the backend inspects the\n * title prefix to route deep-search requests differently from plain chat. The\n * UI never displays this raw string — `buildSessionFromChannel` filters\n * `chat-channel-…` / `deep-search-…` titles out of the history label cascade\n * and derives the visible label from the user's first message instead.\n *\n * Previously we used the user's prompt directly as the title for friendlier\n * history rows, but that silently disabled the server's mode detection — every\n * \"deep-search\" submission landed as a plain chat. Restored to the web scheme.\n */\nfunction buildChannelTitle(mode: RoutingMode, channelId: string): string {\n if (mode === 'deep-search') return `deep-search-${channelId}`;\n if (mode === 'build') return `build-channel-${channelId}`;\n return `chat-channel-${channelId}`;\n}\n\nexport type { RoutingMode, ModeSubmission };\n\nexport interface HomeScreenProps {\n initialMode?: RoutingMode;\n onSubmit?: (submission: ModeSubmission) => void;\n onStop?: () => void;\n isLoading?: boolean;\n disabled?: boolean;\n}\n\ninterface EmptyStateSectionProps {\n isDark: boolean;\n secondaryTextColor: string;\n primaryTextColor: string;\n activeMode: RoutingMode;\n selectedTemplateGroup: string | null;\n selectedBuildTemplateId: string | null;\n compact: boolean;\n onInjectPrompt: (prompt: string, mode?: RoutingMode) => void;\n}\n\nconst EmptyStateSection = React.memo(function EmptyStateSection({\n isDark,\n secondaryTextColor,\n primaryTextColor,\n activeMode,\n selectedTemplateGroup,\n selectedBuildTemplateId,\n compact,\n onInjectPrompt,\n}: EmptyStateSectionProps) {\n const title =\n activeMode === 'build'\n ? 'What should we build?'\n : activeMode === 'deep-search'\n ? 'What should we research?'\n : 'Ask anything';\n const subtitle =\n activeMode === 'build'\n ? selectedBuildTemplateId\n ? 'Describe the project, then send.'\n : selectedTemplateGroup\n ? 'Tap a starter below, then send.'\n : 'Tap Template to pick a group, then send.'\n : activeMode === 'deep-search'\n ? 'Source-backed answers from the web.'\n : 'Chat, Deep Search, or Build from the composer.';\n\n return (\n <View style={styles.emptyInner}>\n <Text\n style={[\n styles.emptyCenterTitle,\n compact && styles.emptyCenterTitleCompact,\n { color: primaryTextColor },\n ]}\n >\n {title}\n </Text>\n <Text style={[styles.emptySubtitle, compact && styles.emptySubtitleCompact, { color: secondaryTextColor }]}>\n {subtitle}\n </Text>\n {activeMode === 'chat' ? (\n <HomeSuggestions\n isDark={isDark}\n compact={compact}\n primaryTextColor={primaryTextColor}\n secondaryTextColor={secondaryTextColor}\n onInjectPrompt={onInjectPrompt}\n />\n ) : null}\n </View>\n );\n});\n\nfunction HomeScreenContent({\n initialMode = 'chat',\n onSubmit: onSubmitProp,\n isLoading: isLoadingProp = false,\n disabled = false,\n}: HomeScreenProps) {\n const { width: screenWidth } = useWindowDimensions();\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const navigation = useNavigation<any>();\n const route = useRoute<any>();\n const dispatch = useDispatch();\n const syncedRouteOrgRef = useRef<string | null>(null);\n const mobileRoutePath = useSelector(\n (state: { router?: { location?: { currentRoute?: { path?: string } } } }) =>\n state.router?.location?.currentRoute?.path,\n );\n\n const [value, setValue] = useState('');\n const [activeMode, setActiveMode] = useState<RoutingMode>(initialMode);\n /**\n * `showAudioRecorder` swaps the InputToolBar for the inline voice recorder\n * panel — same pattern as the web composer\n * (`YantraSearchComposer.tsx`'s `showAudioRecorder` branch).\n */\n const [showAudioRecorder, setShowAudioRecorder] = useState(false);\n /**\n * Build-mode template group (`codeAssistant`, …) — same picker web uses before\n * `DefaultFormTemplatesSection` loads remix cards with `snapshotId`.\n */\n const [selectedTemplateGroup, setSelectedTemplateGroup] = useState<string | null>(null);\n /** Armed remix card — submit sends input `message` + this card's `snapshotId`. */\n const [selectedBuildTemplate, setSelectedBuildTemplate] = useState<BuildTemplateCard | null>(null);\n const [showTemplateModal, setShowTemplateModal] = useState(false);\n const [voiceError, setVoiceError] = useState<string | null>(null);\n const composerAttachments = useImageAttachments();\n const clearComposerAttachments = composerAttachments.clear;\n const newChatNonce = route?.params?.newChatNonce;\n\n useEffect(() => {\n if (newChatNonce == null) return;\n setValue('');\n setActiveMode('chat');\n setShowAudioRecorder(false);\n setSelectedTemplateGroup(null);\n setSelectedBuildTemplate(null);\n setShowTemplateModal(false);\n setVoiceError(null);\n clearComposerAttachments();\n navigation.setParams?.({ newChatNonce: undefined });\n }, [newChatNonce, clearComposerAttachments, navigation]);\n\n const { createChannel } = useChatMutations();\n const {\n orgName: resolvedOrgName,\n projectId,\n tagId,\n accountUserId,\n loading: prerequisitesLoading,\n orgLoading,\n } = usePrerequisiteIds();\n const routeOrgName = ((route?.params?.orgName as string | undefined) ?? '').trim() || null;\n const effectiveOrgName = resolvedOrgName || routeOrgName || null;\n const effectiveProjectId = projectId || null;\n\n const { groups: marketplaceTemplateGroups, loading: templateGroupsLoading } = useMarketplaceTemplateGroups({\n orgName: effectiveOrgName,\n enabled: true,\n });\n\n const trimmedQuery = value.trim();\n const isBuildMePrefixOnly = /^build\\s*me\\s*:?\\s*$/i.test(trimmedQuery);\n const hasQuery = trimmedQuery.length > 0 && !isBuildMePrefixOnly;\n const hasAttachments = composerAttachments.pending.length > 0;\n const canSubmit = (hasQuery || hasAttachments) && Boolean(routeOrgName || effectiveOrgName);\n const isLoading = isLoadingProp;\n const isResearchMode = activeMode === 'deep-search';\n const isBuildMode = activeMode === 'build';\n const inputPlaceholder = !effectiveOrgName\n ? 'Initializing workspace...'\n : isResearchMode\n ? 'Research anything...'\n : isBuildMode\n ? selectedBuildTemplate\n ? 'Build me: describe your project…'\n : 'Describe an app to build...'\n : 'Ask anything...';\n\n const insets = useSafeAreaInsets();\n const { keyboardVisible } = useKeyboardBottomOffset();\n\n const handleModeSwitch = useCallback((mode: RoutingMode) => {\n setActiveMode(mode);\n if (mode !== 'build') {\n setShowTemplateModal(false);\n setSelectedTemplateGroup(null);\n setSelectedBuildTemplate(null);\n }\n }, []);\n\n /**\n * Mirrors the web `useYantraComposerChannelSubmit`: on submit we generate a client-side\n * channel id, fire-and-forget the createChannel mutation, then navigate immediately to\n * the Chat screen with the user's prompt. The Chat screen mounts, awaits the in-flight\n * creation just before saveMessages, and starts streaming the assistant response.\n */\n const navigateToChat = useCallback(\n (channelId: string, query: string, mode: RoutingMode, attachments?: ModeSubmission['attachments']) => {\n const params: Record<string, unknown> = {\n channelId,\n orgName: effectiveOrgName ?? routeOrgName ?? undefined,\n initialQuery: query,\n initialMode: mode,\n };\n if (attachments && attachments.length > 0) {\n params.initialAttachments = attachments;\n }\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.Chat',\n params,\n }),\n );\n },\n [navigation, effectiveOrgName, routeOrgName],\n );\n\n type WebBuilderHandoff = {\n message: string;\n snapshotId?: string;\n templateId?: string;\n templateTitle?: string;\n seedTemplate?: string;\n deployUrl?: string;\n previewUrl?: string;\n };\n\n /**\n * Build mode → Web Builder (`/c/:channelId/webbuilder`).\n * Template remix passes `snapshotId` so the surface boots from that E2B snapshot.\n */\n const navigateToWebBuilder = useCallback(\n (channelId: string, handoff: WebBuilderHandoff) => {\n // Snapshot remix: do not stamp shared org projectId — surface mints a fresh\n // channel+project (web Templates picker parity). Passing DEFAULT_YANTRA_PROJECT\n // made results merge into existing gallery tiles (Counter App).\n const isRemix = Boolean(handoff.snapshotId?.trim());\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.WebBuilder',\n params: {\n orgName: effectiveOrgName ?? routeOrgName ?? undefined,\n // Snapshot remix: omit channelId — surface mints a fresh listen\n // channel. Passing the pre-created id made hydrate re-bind poll onto\n // an empty channel while Inngest published to the minted id.\n ...(!isRemix ? { channelId } : {}),\n ...(!isRemix && effectiveProjectId ? { projectId: effectiveProjectId } : {}),\n message: handoff.message,\n ...(handoff.snapshotId ? { snapshotId: handoff.snapshotId } : {}),\n ...(handoff.templateId ? { templateId: handoff.templateId } : {}),\n ...(handoff.templateTitle ? { templateTitle: handoff.templateTitle } : {}),\n ...(handoff.seedTemplate ? { seedTemplate: handoff.seedTemplate } : {}),\n },\n }),\n );\n },\n [navigation, effectiveOrgName, routeOrgName, effectiveProjectId],\n );\n\n /**\n * Tap a Yantra card → arm it (store snapshotId). Do NOT navigate yet.\n * Composer shows \"Build me: \" — user writes the project brief (no template title).\n */\n const handleUseBuildTemplate = useCallback((card: BuildTemplateCard) => {\n const snapshotId = card.snapshotId?.trim();\n if (!snapshotId) {\n console.warn('[HomeScreen] template missing snapshotId — select another remixable card.');\n }\n setSelectedBuildTemplate(card);\n setValue((prev) => {\n const trimmed = prev.trim();\n // Keep whatever the user already typed; otherwise seed only the prefix.\n if (trimmed && !/^build\\s*me\\s*:?\\s*$/i.test(trimmed)) return prev;\n return 'Build me: ';\n });\n }, []);\n\n const handleSelectTemplateGroup = useCallback((groupId: string) => {\n setSelectedTemplateGroup(groupId);\n setSelectedBuildTemplate(null);\n setShowTemplateModal(false);\n }, []);\n\n const handleClearBuildTemplate = useCallback(() => {\n if (selectedBuildTemplate) {\n setSelectedBuildTemplate(null);\n return;\n }\n setSelectedTemplateGroup(null);\n }, [selectedBuildTemplate]);\n\n const handleSubmit = useCallback(async () => {\n if (!canSubmit || isLoading || disabled) return;\n\n const attachmentsToForward = composerAttachments.forSend();\n const submission: ModeSubmission = {\n mode: activeMode,\n query: trimmedQuery,\n attachments: attachmentsToForward,\n };\n if (onSubmitProp) {\n onSubmitProp(submission);\n }\n\n if (!effectiveOrgName) {\n console.warn('[HomeScreen] orgName not ready — skipping submit.');\n return;\n }\n // Project can lag behind org after a competing hook stole bootstrap; use the\n // known testing project so Build/Chat are not stuck on \"not ready\".\n const submitProjectId = effectiveProjectId || '9a8ac704-1040-4836-9b72-48b771ca91b1';\n if (!effectiveProjectId) {\n console.warn('[HomeScreen] projectId not ready — using testing project fallback for submit.');\n }\n\n const requestedChannelId = uuidv4();\n /**\n * Title is the server's mode signal (`deep-search-…` / `build-channel-…` / `chat-channel-…`).\n * It's NOT the history label — the history list derives that from the\n * first user message via `buildSessionFromChannel`.\n */\n const title = buildChannelTitle(activeMode, requestedChannelId);\n\n const queryToForward = trimmedQuery;\n setValue('');\n composerAttachments.clear();\n stashComposerAttachments(requestedChannelId, attachmentsToForward);\n\n void createChannel({\n id: requestedChannelId,\n title,\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName: effectiveOrgName,\n projectId: submitProjectId,\n } as any).catch((err) => {\n console.error('[HomeScreen] createChannel failed:', err);\n });\n\n if (activeMode === 'build') {\n const tpl = selectedBuildTemplate;\n const snapshotId = tpl?.snapshotId?.trim() || undefined;\n // Stack for webbuilder modelConfig.template — never marketplace keys\n // like aieditor-code-extractor. Do NOT pass previewUrl (live E2B host)\n // or the surface/backend may reconnect that sandbox instead of remixing.\n const rawStack = (tpl?.templateName || '').toLowerCase();\n const seedTemplate = snapshotId\n ? rawStack.includes('next')\n ? 'nextjs'\n : rawStack.includes('vue')\n ? 'vue'\n : 'vite-react'\n : undefined;\n navigateToWebBuilder(requestedChannelId, {\n message: queryToForward,\n snapshotId,\n templateId: tpl ? tpl.formTemplateId || tpl.id : undefined,\n templateTitle: tpl?.title,\n seedTemplate,\n });\n setSelectedBuildTemplate(null);\n return;\n }\n\n navigateToChat(requestedChannelId, queryToForward, activeMode);\n }, [\n canSubmit,\n isLoading,\n disabled,\n activeMode,\n trimmedQuery,\n onSubmitProp,\n effectiveOrgName,\n effectiveProjectId,\n createChannel,\n navigateToChat,\n navigateToWebBuilder,\n selectedBuildTemplate,\n composerAttachments,\n ]);\n\n const surfaceColor = isDark ? '#0f172a' : mobileTokens.color.surface;\n const primaryTextColor = isDark ? '#e5e7eb' : mobileTokens.color.text;\n const secondaryTextColor = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const contentMaxWidth = Math.min(720, Math.max(360, screenWidth - 24));\n\n /**\n * After verify-user, Home mounts with empty `route.params.orgName`. Settings load via\n * `usePrerequisiteIds` (single useSettings). Merge-navigate does not re-fire LOCATION_CHANGE\n * on the same path; sync params + LOCATION_CHANGE + orgChangeAction like refresh does.\n */\n useEffect(() => {\n const currentRouteOrgName = (route?.params?.orgName as string | undefined)?.trim() || '';\n if (currentRouteOrgName) {\n syncedRouteOrgRef.current = currentRouteOrgName;\n return;\n }\n const orgToApply = resolvedOrgName;\n if (!orgToApply || orgLoading) {\n return;\n }\n if (syncedRouteOrgRef.current === orgToApply) {\n return;\n }\n\n syncedRouteOrgRef.current = orgToApply;\n syncMobileOrgRouteContext(dispatch, orgToApply, {\n userId: accountUserId,\n routePath: mobileRoutePath,\n });\n navigation.dispatch(\n CommonActions.navigate({\n name: route?.name ?? 'MainStack.Layout.Home',\n params: { ...(route?.params || {}), orgName: orgToApply },\n merge: true,\n }),\n );\n }, [\n dispatch,\n navigation,\n route?.name,\n route?.params,\n route?.params?.orgName,\n resolvedOrgName,\n accountUserId,\n mobileRoutePath,\n orgLoading,\n ]);\n\n const handleValueChange = useCallback((e: any) => {\n setValue(e.nativeEvent.text);\n }, []);\n\n const handleInjectPrompt = useCallback((prompt: string, mode?: RoutingMode) => {\n setValue(prompt);\n if (mode) setActiveMode(mode);\n }, []);\n\n /**\n * Mic affordance — web parity (`handleMicClick` in `YantraSearchComposer.tsx`).\n *\n * Only opens the recorder when the input is empty: if the user already has\n * a draft, the same button must act as Send (the `MicSendButton` in\n * `InputToolBar.tsx` already swaps its glyph from mic→send based on\n * `hasContent`, so this branch only fires when the icon is visibly a mic).\n *\n * Permission is requested HERE, before the panel mounts. The previous flow\n * flipped `showAudioRecorder=true` immediately, which mounted\n * `AudioRecorderPanel` and constructed the native `AVAudioRecorder` via\n * `useAudioRecorder()` during the panel's render phase — before iOS had\n * granted mic access. On SDK 53 + `newArchEnabled: true` + Hermes that\n * ordering hard-crashes TestFlight builds even though it works in Expo Go\n * (Expo Go pre-caches permission). Asking up front means iOS shows the\n * system alert first and the panel only mounts (and therefore the native\n * recorder is only allocated) once permission is granted.\n *\n * `expo-audio` is lazy-imported so a missing/broken native module surfaces\n * as a user-visible banner instead of a synchronous TurboModule crash.\n */\n const handleMicPress = useCallback(() => {\n if (hasQuery) return;\n setVoiceError(null);\n Keyboard.dismiss();\n void (async () => {\n const { granted, error } = await requestMicPermission();\n if (!granted) {\n setVoiceError(error || 'Microphone is not available.');\n return;\n }\n setShowAudioRecorder(true);\n })();\n }, [hasQuery]);\n\n const handleTranscriptionComplete = useCallback((text: string) => {\n const cleaned = (text ?? '').trim();\n setShowAudioRecorder(false);\n if (!cleaned) return;\n /*\n * Append on top of any existing draft (web `setQuery((prev) => …)`).\n * Single-space separator keeps the transcript readable when the user\n * dictates multiple times before sending.\n */\n setValue((prev) => (prev.trim().length > 0 ? `${prev.trim()} ${cleaned}` : cleaned));\n }, []);\n\n const handleRecorderCancel = useCallback(() => {\n setShowAudioRecorder(false);\n }, []);\n\n const handleRecorderError = useCallback((error: string) => {\n /*\n * Surface the failure to the user but don't trap them in the recorder —\n * `AudioRecorderPanel` already calls `onCancel` after an error, so we\n * just record the message here for the (lightweight) banner below.\n */\n setVoiceError(error);\n }, []);\n\n const leftItems = useMemo(\n () =>\n getDefaultLeftItems({\n search: {\n active: activeMode === 'chat',\n onClick: () => handleModeSwitch('chat'),\n },\n zap: {\n active: activeMode === 'deep-search',\n onClick: () => handleModeSwitch('deep-search'),\n },\n lightbulb: {\n active: activeMode === 'build',\n onClick: () => handleModeSwitch('build'),\n },\n }),\n [activeMode, handleModeSwitch],\n );\n\n const templateModalItems = useMemo(\n () =>\n marketplaceTemplateGroups.map((group) => ({\n id: group.id,\n label: group.label,\n description: group.description,\n category: group.category,\n })),\n [marketplaceTemplateGroups],\n );\n\n const selectedTemplateLabel = useMemo(() => {\n if (selectedBuildTemplate?.title?.trim()) return selectedBuildTemplate.title.trim();\n if (!selectedTemplateGroup) return undefined;\n return marketplaceTemplateGroups.find((g) => g.id === selectedTemplateGroup)?.label || selectedTemplateGroup;\n }, [marketplaceTemplateGroups, selectedTemplateGroup, selectedBuildTemplate]);\n\n const templateButton = useMemo(() => {\n if (!isBuildMode) return null;\n return {\n label: 'Template',\n count: marketplaceTemplateGroups.length,\n selectedLabel: selectedTemplateLabel,\n onClick: () => setShowTemplateModal(true),\n onClearTemplate: handleClearBuildTemplate,\n disabled: isLoading || disabled || (templateGroupsLoading && marketplaceTemplateGroups.length === 0),\n };\n }, [\n isBuildMode,\n marketplaceTemplateGroups.length,\n selectedTemplateLabel,\n handleClearBuildTemplate,\n isLoading,\n disabled,\n templateGroupsLoading,\n ]);\n\n const templateModalConfig = useMemo(() => {\n if (!isBuildMode) return null;\n return {\n isOpen: showTemplateModal,\n onClose: () => setShowTemplateModal(false),\n templates: templateModalItems,\n selectedId: selectedTemplateGroup,\n onSelect: handleSelectTemplateGroup,\n title: 'Choose Template',\n };\n }, [isBuildMode, showTemplateModal, templateModalItems, selectedTemplateGroup, handleSelectTemplateGroup]);\n\n const renderTemplateModal = useCallback(\n (config: {\n isOpen: boolean;\n onClose: () => void;\n templates: Array<{ id: string; label: string; description?: string; category?: string }>;\n selectedId: string | null;\n onSelect: (id: string) => void;\n suggestedId?: string | null;\n title?: string;\n }) => (\n <ChooseTemplateModal\n isOpen={config.isOpen}\n onClose={config.onClose}\n templates={config.templates}\n selectedId={config.selectedId}\n onSelect={config.onSelect}\n suggestedId={config.suggestedId}\n title={config.title}\n isDark={isDark}\n loading={templateGroupsLoading}\n />\n ),\n [isDark, templateGroupsLoading],\n );\n\n const rightItems = useMemo(\n () =>\n getDefaultRightItems({\n tag: { enabled: false },\n chip: { enabled: false },\n camera: {\n enabled: true,\n loading: composerAttachments.busyKind === 'camera',\n onClick: () => {\n void composerAttachments.captureFromCamera();\n },\n },\n image: {\n enabled: true,\n loading: composerAttachments.busyKind === 'library',\n onClick: () => {\n void composerAttachments.pickFromLibrary();\n },\n },\n attach: {\n enabled: true,\n loading: composerAttachments.busyKind === 'documents',\n onClick: () => {\n void composerAttachments.pickDocuments();\n },\n },\n }),\n [composerAttachments],\n );\n\n const inputConfig = useMemo(\n () => ({\n value,\n onChange: handleValueChange,\n placeholder: inputPlaceholder,\n disabled: isLoading || disabled,\n returnKeyType: 'send',\n blurOnSubmit: true,\n onSubmitEditing: () => {\n if (canSubmit) void handleSubmit();\n },\n }),\n [value, handleValueChange, inputPlaceholder, isLoading, disabled, canSubmit, handleSubmit],\n );\n\n const micSendButton = useMemo(\n () => ({\n hasContent: hasQuery || hasAttachments,\n onSend: () => {\n Keyboard.dismiss();\n void handleSubmit();\n },\n onMic: handleMicPress,\n disabled: isLoading || disabled,\n isLoading,\n }),\n [hasQuery, hasAttachments, handleSubmit, handleMicPress, isLoading, disabled],\n );\n\n return (\n <SafeAreaView edges={['left', 'right']} style={{ flex: 1, backgroundColor: surfaceColor }}>\n {/* Mint token + load webbuilder-surface off-screen while user picks a template. */}\n <WebBuilderPrewarm\n enabled={isBuildMode}\n orgName={effectiveOrgName}\n projectId={effectiveProjectId}\n tagId={tagId}\n />\n <View style={styles.flex}>\n <ScrollView\n style={styles.flex}\n contentContainerStyle={[\n styles.emptyScroll,\n keyboardVisible ? styles.emptyScrollCompact : styles.emptyScrollRelaxed,\n ]}\n keyboardShouldPersistTaps=\"handled\"\n keyboardDismissMode=\"interactive\"\n showsVerticalScrollIndicator={false}\n >\n <Pressable style={styles.dismissArea} onPress={Keyboard.dismiss} accessible={false}>\n <EmptyStateSection\n isDark={isDark}\n secondaryTextColor={secondaryTextColor}\n primaryTextColor={primaryTextColor}\n activeMode={activeMode}\n selectedTemplateGroup={selectedTemplateGroup}\n selectedBuildTemplateId={selectedBuildTemplate?.id ?? null}\n compact={keyboardVisible}\n onInjectPrompt={handleInjectPrompt}\n />\n </Pressable>\n </ScrollView>\n <KeyboardComposerDock closedInset={insets.bottom} keyboardVisible={keyboardVisible}>\n <View style={[styles.composerInner, { width: contentMaxWidth }]}>\n {voiceError || composerAttachments.error ? (\n <View\n style={[\n styles.voiceErrorBanner,\n {\n backgroundColor: isDark ? '#2b1a1d' : '#fef2f2',\n borderColor: isDark ? '#7f1d1d' : '#fecaca',\n },\n ]}\n >\n <Text style={[styles.voiceErrorText, { color: isDark ? '#fecaca' : '#991b1b' }]}>\n {voiceError || composerAttachments.error}\n </Text>\n </View>\n ) : null}\n {showAudioRecorder ? (\n <MicErrorBoundary onCancel={handleRecorderCancel} onError={handleRecorderError}>\n <AudioRecorderPanel\n isDark={isDark}\n onTranscriptionComplete={handleTranscriptionComplete}\n onCancel={handleRecorderCancel}\n onError={handleRecorderError}\n />\n </MicErrorBoundary>\n ) : (\n <>\n <ComposerAttachmentBar\n attachments={composerAttachments.pending}\n onRemove={composerAttachments.remove}\n isDark={isDark}\n />\n <InputToolBar\n inputConfig={inputConfig}\n leftItems={leftItems}\n rightItems={rightItems}\n templateButton={templateButton}\n templateModalConfig={templateModalConfig}\n templateModalRender={renderTemplateModal}\n micSendButton={micSendButton}\n />\n </>\n )}\n {isBuildMode ? (\n <BuildTemplatesSection\n enabled\n compact={keyboardVisible}\n group={selectedTemplateGroup}\n orgName={effectiveOrgName}\n isDark={isDark}\n primaryTextColor={primaryTextColor}\n secondaryTextColor={secondaryTextColor}\n selectedTemplateId={selectedBuildTemplate?.id ?? null}\n onUseTemplate={handleUseBuildTemplate}\n />\n ) : null}\n </View>\n </KeyboardComposerDock>\n </View>\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n flex: {\n flex: 1,\n },\n emptyScroll: {\n flexGrow: 1,\n width: '100%',\n paddingHorizontal: 28,\n },\n emptyScrollRelaxed: {\n justifyContent: 'center',\n paddingVertical: 24,\n },\n emptyScrollCompact: {\n justifyContent: 'flex-start',\n paddingTop: 8,\n paddingBottom: 12,\n },\n emptyInner: {\n alignItems: 'center',\n width: '100%',\n },\n dismissArea: {\n width: '100%',\n },\n emptyCenterTitle: {\n fontSize: 28,\n fontWeight: '700',\n textAlign: 'center',\n letterSpacing: -0.5,\n },\n emptyCenterTitleCompact: {\n fontSize: 22,\n },\n emptySubtitle: {\n marginTop: 8,\n fontSize: 15,\n lineHeight: 22,\n textAlign: 'center',\n maxWidth: 320,\n },\n emptySubtitleCompact: {\n marginTop: 4,\n fontSize: 13,\n lineHeight: 18,\n },\n composerInner: {\n paddingHorizontal: 14,\n paddingTop: 4,\n },\n voiceErrorBanner: {\n marginBottom: 8,\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderRadius: 10,\n borderWidth: 1,\n },\n voiceErrorText: {\n fontSize: 12,\n fontWeight: '500',\n },\n});\n\nconst HomeScreen: FC<HomeScreenProps> = (props) => <HomeScreenContent {...props} />;\n\nexport default HomeScreen;\n"],"names":["EmptyStateSection","_a","_b","_c","uuidv4"],"mappings":"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"}
@@ -68,22 +68,22 @@ function buildSections(rows, now) {
68
68
  const out = [];
69
69
  if (buckets.today.length) out.push({
70
70
  key: "today",
71
- title: "Today",
71
+ title: "TODAY",
72
72
  data: buckets.today
73
73
  });
74
74
  if (buckets.yesterday.length) out.push({
75
75
  key: "yesterday",
76
- title: "Yesterday",
76
+ title: "YESTERDAY",
77
77
  data: buckets.yesterday
78
78
  });
79
79
  if (buckets.week.length) out.push({
80
80
  key: "week",
81
- title: "This week",
81
+ title: "PREVIOUS 7 DAYS",
82
82
  data: buckets.week
83
83
  });
84
84
  if (buckets.earlier.length) out.push({
85
85
  key: "earlier",
86
- title: "Earlier",
86
+ title: "EARLIER",
87
87
  data: buckets.earlier
88
88
  });
89
89
  return out;
@@ -142,7 +142,8 @@ function buildTheme(isDark) {
142
142
  }
143
143
  function ModeTile({
144
144
  mode,
145
- theme
145
+ theme,
146
+ isAttachment
146
147
  }) {
147
148
  if (mode === "deep-search") {
148
149
  return /* @__PURE__ */ jsx(View, { style: [styles.tile, {
@@ -154,6 +155,11 @@ function ModeTile({
154
155
  backgroundColor: theme.tileBuildBg
155
156
  }], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "lightbulb-outline", size: 18, color: theme.tileBuildIcon }) });
156
157
  }
158
+ if (isAttachment) {
159
+ return /* @__PURE__ */ jsx(View, { style: [styles.tile, {
160
+ backgroundColor: theme.tileChatBg
161
+ }], children: /* @__PURE__ */ jsx(Feather, { name: "paperclip", size: 18, color: theme.tileChatIcon }) });
162
+ }
157
163
  return /* @__PURE__ */ jsx(View, { style: [styles.tile, {
158
164
  backgroundColor: theme.tileChatBg
159
165
  }], children: /* @__PURE__ */ jsx(Feather, { name: "message-circle", size: 18, color: theme.tileChatIcon }) });
@@ -173,7 +179,7 @@ function ChatHistoryRow({
173
179
  }) => [styles.row, pressed && {
174
180
  backgroundColor: theme.pressed
175
181
  }], accessibilityRole: "button", accessibilityLabel: session.previewForRender ? `Open conversation: ${session.titleForRender}. ${session.previewForRender}. ${timeLabel}` : `Open conversation: ${session.titleForRender}, ${timeLabel}`, children: [
176
- /* @__PURE__ */ jsx(ModeTile, { mode: session.mode, theme }),
182
+ /* @__PURE__ */ jsx(ModeTile, { mode: session.mode, theme, isAttachment: session.isAttachment }),
177
183
  /* @__PURE__ */ jsxs(View, { style: styles.rowBody, children: [
178
184
  /* @__PURE__ */ jsxs(View, { style: styles.rowHeader, children: [
179
185
  /* @__PURE__ */ jsx(Text, { style: titleStyle, numberOfLines: 1, ellipsizeMode: "tail", children: session.titleForRender }),
@@ -361,9 +367,9 @@ const styles = StyleSheet.create({
361
367
  },
362
368
  sectionLabel: {
363
369
  fontSize: 12,
364
- fontWeight: "600",
365
- letterSpacing: 0.2,
366
- textTransform: "none"
370
+ fontWeight: "700",
371
+ letterSpacing: 0.6,
372
+ textTransform: "uppercase"
367
373
  },
368
374
  /**
369
375
  * Row: leading 40×40 mode tile, two-line body (title + preview), right-aligned
@@ -1 +1 @@
1
- {"version":3,"file":"ChatHistoryLanding.js","sources":["../../../../src/screens/Home/components/ChatHistoryLanding.tsx"],"sourcesContent":["import React from 'react';\nimport {\n ActivityIndicator,\n Pressable,\n RefreshControl,\n SectionList,\n StyleSheet,\n View,\n useColorScheme,\n useWindowDimensions,\n} from 'react-native';\nimport { Feather, MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { useFocusEffect } from '@react-navigation/native';\nimport {\n HISTORY_PAGE_SIZE,\n chatHistorySessionsFromChannels,\n getHistoryChannelsQueryVariables,\n useChatHistorySessionsFromChannels,\n type ChatHistoryMode,\n type ChatHistorySession,\n} from '../../../hooks/useChatApi';\nimport { useApolloClient } from '@apollo/client';\nimport { GetChannelsByUserWithLastMessageDocument } from 'common/graphql';\nimport { usePrerequisiteIds } from '../../../hooks/usePrerequisiteIds';\nimport ThinkingIndicator from '../../../components/ThinkingIndicator';\nimport { mobileTokens } from '../../../theme/mobileTokens';\n\n/**\n * Chat history list for mobile.\n *\n * Data: `useGetChannelsByUserWithLastMessageQuery` returning one row per channel\n * with `lastMessage` carrying the parent user prompt and the assistant reply.\n *\n * Layout: Manus-style two-line row — 40×40 leading mode tile, **line 1** =\n * `lastMessage.propsConfiguration.contents.parent.message` (user prompt),\n * **line 2** = `lastMessage.message` (latest post body, including agent errors\n * such as lines starting with ⚠), right-aligned short date. Indigo-tinted\n * neutrals so the surface stays in the Yantra brand register.\n *\n * Mode tile carries real information (chat vs deep-search), not decoration —\n * different modes get different glyphs and tints.\n */\ninterface ChatHistoryLandingProps {\n /**\n * `mode` is derived per-row via `detectMode(channel)`. Build sessions open\n * Web Builder; chat / deep-search open Chat.\n */\n onSelectSession: (channelId: string, mode: ChatHistoryMode) => void;\n /** Kept in the contract; not surfaced here — new-chat lives in the screen header. */\n onCompose: () => void;\n}\n\ninterface SessionRow extends ChatHistorySession {\n id: string;\n /** Pre-truncated title for one-line render. */\n titleForRender: string;\n /** Pre-truncated preview for one-line render (empty if suppressed upstream). */\n previewForRender: string;\n /** Cached unix-ms for bucketing / sorting. */\n sortAt: number;\n}\n\ninterface SessionSection {\n key: 'today' | 'yesterday' | 'week' | 'earlier';\n title: string;\n data: SessionRow[];\n}\n\nfunction truncate(text: string, max = 96): string {\n const cleaned = text.replace(/\\s+/g, ' ').trim();\n if (cleaned.length <= max) return cleaned;\n return `${cleaned.slice(0, max).trim()}...`;\n}\n\nconst WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nfunction relativeTime(ts: number, now: number): string {\n const deltaMs = now - ts;\n if (deltaMs < 60_000) return 'now';\n const minutes = Math.floor(deltaMs / 60_000);\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h`;\n const days = Math.floor(hours / 24);\n if (days < 7) {\n const d = new Date(ts);\n return WEEKDAYS[d.getDay()] ?? `${days}d`;\n }\n /**\n * 7d+: numeric short date (e.g. \"2/18\" matching the Manus reference). Year only\n * appears when crossing into a previous year, to keep the right column compact.\n */\n const d = new Date(ts);\n const sameYear = d.getFullYear() === new Date(now).getFullYear();\n const m = d.getMonth() + 1;\n const day = d.getDate();\n return sameYear ? `${m}/${day}` : `${m}/${day}/${String(d.getFullYear()).slice(2)}`;\n}\n\nfunction bucketFor(ts: number, now: number): SessionSection['key'] {\n const a = new Date(ts);\n const b = new Date(now);\n const startOf = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n const today = startOf(b);\n const yesterday = today - 24 * 60 * 60 * 1000;\n const weekAgo = today - 7 * 24 * 60 * 60 * 1000;\n const tsDay = startOf(a);\n if (tsDay >= today) return 'today';\n if (tsDay >= yesterday) return 'yesterday';\n if (tsDay >= weekAgo) return 'week';\n return 'earlier';\n}\n\nfunction buildSections(rows: SessionRow[], now: number): SessionSection[] {\n const buckets: Record<SessionSection['key'], SessionRow[]> = {\n today: [],\n yesterday: [],\n week: [],\n earlier: [],\n };\n for (const row of rows) {\n buckets[bucketFor(row.sortAt, now)].push(row);\n }\n const out: SessionSection[] = [];\n if (buckets.today.length) out.push({ key: 'today', title: 'Today', data: buckets.today });\n if (buckets.yesterday.length) out.push({ key: 'yesterday', title: 'Yesterday', data: buckets.yesterday });\n if (buckets.week.length) out.push({ key: 'week', title: 'This week', data: buckets.week });\n if (buckets.earlier.length) out.push({ key: 'earlier', title: 'Earlier', data: buckets.earlier });\n return out;\n}\n\n/**\n * Theme tokens.\n *\n * Color strategy: Monochrome ink. Chrome (section labels, chat tile, load-more\n * pill, end-of-list dot, press wash, refresh spinner) is rendered in tinted\n * neutrals so the only real color on the screen is the deep-search amber —\n * which then reliably signals a mode, not decoration. Neutrals carry chroma\n * 0.005–0.01 toward the brand hue (no pure `#fff` / `#000`).\n */\ninterface ThemeTokens {\n bg: string;\n surface: string;\n title: string;\n preview: string;\n meta: string;\n muted: string;\n divider: string;\n sectionLabel: string;\n /** Mode tile (chat) — neutral ink on neutral fill. */\n tileChatBg: string;\n tileChatIcon: string;\n /** Mode tile (deep-search) — amber kept as the one real mode color. */\n tileSearchBg: string;\n tileSearchIcon: string;\n /** Mode tile (build / Web Builder) — indigo, same accent as the composer lightbulb. */\n tileBuildBg: string;\n tileBuildIcon: string;\n pressed: string;\n loadMoreText: string;\n loadMoreBorder: string;\n loadMoreBg: string;\n refreshTint: string;\n endDot: string;\n /**\n * Empty-state mark — circular soft-neutral disk holding a chat glyph.\n * Matches the web reference (gray-on-gray circle), not the row mode tile.\n */\n emptyMarkBg: string;\n emptyMarkIcon: string;\n}\n\nfunction buildTheme(isDark: boolean): ThemeTokens {\n if (isDark) {\n return {\n bg: '#0b1220',\n surface: mobileTokens.color.surface,\n title: '#f1f5f9',\n preview: '#94a3b8',\n meta: '#9aa0b8',\n muted: '#7a809a',\n divider: 'rgba(148, 163, 184, 0.12)',\n sectionLabel: '#cbd5e1',\n tileChatBg: 'rgba(148, 163, 184, 0.16)',\n tileChatIcon: '#e2e8f0',\n tileSearchBg: 'rgba(251, 191, 36, 0.16)',\n tileSearchIcon: '#fde68a',\n tileBuildBg: 'rgba(129, 140, 248, 0.18)',\n tileBuildIcon: '#c7d2fe',\n pressed: 'rgba(148, 163, 184, 0.10)',\n loadMoreText: '#e2e8f0',\n loadMoreBorder: 'rgba(148, 163, 184, 0.28)',\n loadMoreBg: 'rgba(148, 163, 184, 0.10)',\n refreshTint: '#cbd5e1',\n endDot: '#94a3b8',\n emptyMarkBg: 'rgba(148, 163, 184, 0.18)',\n emptyMarkIcon: '#b4bccc',\n };\n }\n return {\n bg: mobileTokens.color.bg,\n surface: mobileTokens.color.surface,\n title: '#0b1424',\n preview: '#525a73',\n meta: '#7b8197',\n muted: '#94a3b8',\n divider: 'rgba(15, 23, 42, 0.06)',\n sectionLabel: '#374151',\n tileChatBg: 'rgba(15, 23, 42, 0.06)',\n tileChatIcon: '#1f2937',\n tileSearchBg: 'rgba(217, 119, 6, 0.10)',\n tileSearchIcon: '#b45309',\n tileBuildBg: mobileTokens.color.primarySoft,\n tileBuildIcon: mobileTokens.color.primary,\n pressed: 'rgba(15, 23, 42, 0.05)',\n loadMoreText: '#1f2937',\n loadMoreBorder: 'rgba(15, 23, 42, 0.15)',\n loadMoreBg: 'rgba(15, 23, 42, 0.04)',\n refreshTint: '#374151',\n endDot: '#9ca3af',\n emptyMarkBg: 'rgba(15, 23, 42, 0.07)',\n emptyMarkIcon: '#6b7280',\n };\n}\n\n/**\n * Leading 40×40 mode tile. Background and glyph reflect the conversation mode:\n * - chat → Lucide-style message bubble on indigo-tinted neutral\n * - deep-search → lightning glyph on amber-tinted neutral\n * - build → lightbulb on indigo (Web Builder sessions)\n *\n * Chat uses Feather (a Lucide port) so the row tile, the empty-state mark, and\n * the web header all share one bubble silhouette. Deep-search stays on MCI —\n * Feather has no acceptable lightning glyph and the amber/indigo split is\n * already the primary mode signal.\n *\n * Real information per row, not decoration.\n */\nfunction ModeTile({ mode, theme }: { mode: ChatHistoryMode; theme: ThemeTokens }) {\n if (mode === 'deep-search') {\n return (\n <View style={[styles.tile, { backgroundColor: theme.tileSearchBg }]}>\n <MaterialCommunityIcons name=\"lightning-bolt-outline\" size={18} color={theme.tileSearchIcon} />\n </View>\n );\n }\n if (mode === 'build') {\n return (\n <View style={[styles.tile, { backgroundColor: theme.tileBuildBg }]}>\n <MaterialCommunityIcons name=\"lightbulb-outline\" size={18} color={theme.tileBuildIcon} />\n </View>\n );\n }\n return (\n <View style={[styles.tile, { backgroundColor: theme.tileChatBg }]}>\n <Feather name=\"message-circle\" size={18} color={theme.tileChatIcon} />\n </View>\n );\n}\n\nfunction ChatHistoryRow({\n session,\n onSelectSession,\n theme,\n timeLabel,\n}: {\n session: SessionRow;\n onSelectSession: (channelId: string, mode: ChatHistoryMode) => void;\n theme: ThemeTokens;\n timeLabel: string;\n}) {\n const titleColor = session.isPlaceholder ? theme.preview : theme.title;\n const titleStyle = [\n styles.rowTitle,\n { color: titleColor },\n session.isPlaceholder ? styles.rowTitlePlaceholder : null,\n ];\n return (\n <Pressable\n onPress={() => onSelectSession(session.channelId, session.mode)}\n style={({ pressed }) => [styles.row, pressed && { backgroundColor: theme.pressed }]}\n accessibilityRole=\"button\"\n accessibilityLabel={\n session.previewForRender\n ? `Open conversation: ${session.titleForRender}. ${session.previewForRender}. ${timeLabel}`\n : `Open conversation: ${session.titleForRender}, ${timeLabel}`\n }\n >\n <ModeTile mode={session.mode} theme={theme} />\n <View style={styles.rowBody}>\n <View style={styles.rowHeader}>\n <Text style={titleStyle} numberOfLines={1} ellipsizeMode=\"tail\">\n {session.titleForRender}\n </Text>\n <Text style={[styles.rowDate, { color: theme.meta }]} numberOfLines={1}>\n {timeLabel}\n </Text>\n </View>\n {session.previewForRender ? (\n <Text style={[styles.rowPreview, { color: theme.preview }]} numberOfLines={1} ellipsizeMode=\"tail\">\n {session.previewForRender}\n </Text>\n ) : null}\n </View>\n </Pressable>\n );\n}\n\nexport default function ChatHistoryLanding({ onSelectSession }: ChatHistoryLandingProps) {\n const { width: screenWidth } = useWindowDimensions();\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const theme = React.useMemo(() => buildTheme(isDark), [isDark]);\n\n const apollo = useApolloClient();\n const { orgName, loading: idsLoading } = usePrerequisiteIds();\n\n const {\n sessions: liveSessions,\n sessionsLoaded,\n refetch,\n sourceChannelCount,\n } = useChatHistorySessionsFromChannels(orgName, { skip: !orgName });\n\n /** \"Now\" reference recomputed on refresh so relative timestamps re-evaluate cleanly. */\n const [nowTs, setNowTs] = React.useState(() => Date.now());\n const [refreshing, setRefreshing] = React.useState(false);\n /** Manually fetched older pages (channel-paginated, appended). */\n const [olderSessions, setOlderSessions] = React.useState<ChatHistorySession[]>([]);\n /** True only when the last fetch returned a full page of channels (there may be more). */\n const [hasMore, setHasMore] = React.useState(false);\n const [loadingMore, setLoadingMore] = React.useState(false);\n\n /**\n * \"Load older\" eligibility tracks the live first page's raw channel count.\n * When older pages are appended, `onLoadMore` updates `hasMore` from its\n * own response. When older pages are reset (refresh), this effect realigns.\n */\n React.useEffect(() => {\n if (olderSessions.length > 0) return;\n setHasMore(sourceChannelCount >= HISTORY_PAGE_SIZE);\n }, [sourceChannelCount, olderSessions.length]);\n\n /** Re-fetch first page on focus (e.g. returning from a chat). */\n useFocusEffect(\n React.useCallback(() => {\n if (!orgName) return;\n void refetch(getHistoryChannelsQueryVariables(orgName)).catch(() => {\n /* network errors surface in the watched query state. */\n });\n }, [orgName, refetch]),\n );\n\n const onRefresh = React.useCallback(async () => {\n if (!orgName) return;\n setRefreshing(true);\n try {\n await refetch(getHistoryChannelsQueryVariables(orgName));\n setOlderSessions([]);\n setNowTs(Date.now());\n } catch {\n /* refetch errors surface via loading state. */\n } finally {\n setRefreshing(false);\n }\n }, [orgName, refetch]);\n\n /**\n * \"Load older\": one-off `client.query` against `channelsByUser` with the next\n * `skip`. We don't bump the watched query's variables (that would re-key the\n * cache slot and shrink `liveSessions`).\n */\n const onLoadMore = React.useCallback(async () => {\n if (!orgName || loadingMore || !hasMore) return;\n setLoadingMore(true);\n try {\n const nextSkip = liveSessions.length + olderSessions.length;\n const result = await apollo.query({\n query: GetChannelsByUserWithLastMessageDocument,\n variables: getHistoryChannelsQueryVariables(orgName, {\n skip: nextSkip,\n limit: HISTORY_PAGE_SIZE,\n }),\n fetchPolicy: 'network-only',\n });\n const rawCount = (result.data?.channelsByUser ?? []).length;\n const nextBatch = chatHistorySessionsFromChannels(result.data as any);\n if (nextBatch.length === 0) {\n setHasMore(false);\n } else {\n setOlderSessions((prev) => {\n const map = new Map<string, ChatHistorySession>();\n for (const s of prev) map.set(s.channelId, s);\n for (const s of nextBatch) map.set(s.channelId, s);\n return Array.from(map.values());\n });\n setHasMore(rawCount >= HISTORY_PAGE_SIZE);\n }\n } catch {\n /* next \"Load older\" tap retries the same skip. */\n } finally {\n setLoadingMore(false);\n }\n }, [apollo, hasMore, liveSessions.length, loadingMore, olderSessions, orgName]);\n\n /**\n * Merge live + older, dedupe on channelId (live wins so streaming title /\n * lastMessage updates are reflected), sort descending by activity, then\n * pre-truncate strings for one-line render.\n */\n const sessions: SessionRow[] = React.useMemo(() => {\n const map = new Map<string, ChatHistorySession>();\n for (const s of olderSessions) map.set(s.channelId, s);\n for (const s of liveSessions) map.set(s.channelId, s);\n return Array.from(map.values())\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())\n .map((s) => ({\n ...s,\n id: s.channelId,\n titleForRender: truncate(s.title, 64),\n previewForRender: s.preview ? truncate(s.preview, 96) : '',\n sortAt: s.updatedAt.getTime(),\n }));\n }, [liveSessions, olderSessions]);\n\n const sections = React.useMemo(() => buildSections(sessions, nowTs), [sessions, nowTs]);\n /**\n * Initial-load window: the loader shows ONLY before we have data we can\n * render — i.e. before prerequisite ids resolve or before Apollo has served\n * a result (cache or network) for this org.\n *\n * Critically, `sessionsLoaded` (`data !== undefined`) flips true synchronously\n * on a cache hit, so revisiting the screen does not re-flash the loader while\n * Apollo revalidates in the background. We also do NOT gate on\n * `sessions.length === 0` here — a cached-but-empty list should drop straight\n * into the dedicated empty state, not the spinner.\n */\n const initialLoading = !sessionsLoaded || idsLoading || !orgName;\n const contentMaxWidth = Math.min(720, Math.max(360, screenWidth - 24));\n const containerStyle = { maxWidth: contentMaxWidth, alignSelf: 'center' as const, width: '100%' as const };\n\n const listFooter = hasMore ? (\n <View style={[styles.footer, containerStyle]}>\n <Pressable\n onPress={() => void onLoadMore()}\n disabled={loadingMore}\n style={({ pressed }) => [\n styles.loadMore,\n {\n backgroundColor: theme.loadMoreBg,\n borderColor: theme.loadMoreBorder,\n },\n loadingMore && { opacity: 0.7 },\n pressed && !loadingMore && { opacity: 0.8 },\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Load older conversations\"\n >\n {loadingMore ? (\n <ActivityIndicator size=\"small\" color={theme.loadMoreText} />\n ) : (\n <Text style={[styles.loadMoreText, { color: theme.loadMoreText }]}>Load older</Text>\n )}\n </Pressable>\n </View>\n ) : !hasMore && sessions.length > 0 ? (\n <View style={[styles.endHint, containerStyle]}>\n <View style={[styles.endHintDot, { backgroundColor: theme.endDot, opacity: 0.5 }]} />\n <Text style={[styles.endHintText, { color: theme.muted }]}>{\"You're all caught up\"}</Text>\n </View>\n ) : (\n <View style={{ height: 24 }} />\n );\n\n /**\n * Hairline divider between rows, inset to start where the title column does\n * (past the 40px tile + 14px gap = 54px). Quieter than full-bleed; confirms\n * the column the eye is scanning.\n */\n const renderItemSeparator = React.useCallback(\n () => <View style={[styles.divider, { backgroundColor: theme.divider }]} />,\n [theme.divider],\n );\n\n return (\n <View style={[styles.container, { backgroundColor: theme.bg }]}>\n {initialLoading ? (\n /**\n * Initial-fetch state mirrors the web composer's \"Thinking…\" pill\n * (see `packages-modules/account/browser/src/pages/chat/ChatSessionPage.tsx`):\n * a thin spinning arc + 12px muted caption, both tinted with\n * `theme.muted` so the indicator reads as a quiet status row\n * rather than a brand-stamped loading screen.\n */\n <View style={styles.emptyStateWrap}>\n <ThinkingIndicator color={theme.muted} />\n </View>\n ) : sessions.length === 0 ? (\n <View style={styles.emptyStateWrap}>\n {/**\n * Empty-state mark: circular neutral disk with a Lucide-style chat\n * bubble. Uses Feather (same glyph family as the web's lucide-react\n * `MessageCircle`) instead of MCI so the rounded body + tail proportions\n * match the web reference 1:1. Glyph fills ~55% of the disk so it\n * reads as a real focal point, not decoration.\n */}\n <View style={[styles.emptyMark, { backgroundColor: theme.emptyMarkBg }]}>\n <Feather name=\"message-circle\" size={40} color={theme.emptyMarkIcon} />\n </View>\n <Text style={[styles.emptyTitle, { color: theme.title }]}>No conversations yet</Text>\n <Text style={[styles.emptySubtitle, { color: theme.muted }]}>\n Start your first chat to see your conversation history here.\n </Text>\n </View>\n ) : (\n <SectionList\n sections={sections}\n keyExtractor={(item) => item.channelId}\n stickySectionHeadersEnabled={false}\n contentContainerStyle={[styles.listContent, containerStyle, { paddingBottom: 32 }]}\n ListFooterComponent={listFooter}\n ItemSeparatorComponent={renderItemSeparator}\n refreshControl={\n <RefreshControl\n refreshing={refreshing}\n onRefresh={() => void onRefresh()}\n tintColor={theme.refreshTint}\n colors={[theme.refreshTint]}\n />\n }\n renderSectionHeader={({ section }) => (\n <View style={styles.sectionHeader}>\n <Text style={[styles.sectionLabel, { color: theme.sectionLabel }]}>{section.title}</Text>\n </View>\n )}\n renderItem={({ item }) => (\n <ChatHistoryRow\n session={item}\n onSelectSession={onSelectSession}\n theme={theme}\n timeLabel={relativeTime(item.sortAt, nowTs)}\n />\n )}\n showsVerticalScrollIndicator={false}\n />\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n listContent: {\n paddingHorizontal: 20,\n paddingTop: 4,\n },\n /**\n * Section header: sentence case, indigo-tinted, modest size. 28px top padding\n * establishes rhythm between groups without dead air below the label.\n */\n sectionHeader: {\n paddingTop: 28,\n paddingBottom: 10,\n paddingHorizontal: 2,\n },\n sectionLabel: {\n fontSize: 12,\n fontWeight: '600',\n letterSpacing: 0.2,\n textTransform: 'none',\n },\n /**\n * Row: leading 40×40 mode tile, two-line body (title + preview), right-aligned\n * date aligned to the title's baseline. 14px gap matches the tile-to-text\n * rhythm in Manus / iOS Mail.\n */\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n paddingHorizontal: 2,\n gap: 14,\n },\n tile: {\n width: 40,\n height: 40,\n borderRadius: 12,\n alignItems: 'center',\n justifyContent: 'center',\n },\n rowBody: {\n flex: 1,\n minWidth: 0,\n },\n rowHeader: {\n flexDirection: 'row',\n alignItems: 'baseline',\n gap: 10,\n },\n rowTitle: {\n flex: 1,\n fontSize: 16,\n fontWeight: '600',\n letterSpacing: -0.1,\n lineHeight: 22,\n },\n rowTitlePlaceholder: {\n fontWeight: '500',\n fontStyle: 'italic',\n },\n rowDate: {\n fontSize: 12.5,\n fontWeight: '500',\n fontVariant: ['tabular-nums'],\n },\n rowPreview: {\n marginTop: 2,\n fontSize: 13.5,\n lineHeight: 19,\n fontWeight: '400',\n letterSpacing: -0.05,\n },\n /**\n * Indented hairline: starts past the tile column (40 + 14 = 54) so the rule\n * aligns with the title's leading edge. Mail-style.\n */\n divider: {\n height: StyleSheet.hairlineWidth,\n marginLeft: 56,\n },\n footer: {\n paddingTop: 28,\n paddingBottom: 8,\n alignItems: 'center',\n },\n /** Bordered ink-neutral pill. Label is the affordance, no leading icon, no chevron. */\n loadMore: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 10,\n paddingHorizontal: 18,\n borderRadius: 999,\n borderWidth: 1,\n minWidth: 132,\n },\n loadMoreText: {\n fontSize: 13.5,\n fontWeight: '600',\n letterSpacing: -0.05,\n },\n endHint: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n paddingTop: 32,\n paddingBottom: 12,\n },\n endHintDot: {\n width: 4,\n height: 4,\n borderRadius: 2,\n },\n endHintText: {\n fontSize: 12.5,\n fontWeight: '500',\n letterSpacing: 0.1,\n },\n /**\n * Empty state: stack a 64×64 indigo-tinted mark over title + subtitle.\n * Generous vertical gap (16) between mark and title; tighter gap (6)\n * between title and subtitle so the pair reads as one unit hanging off\n * the mark, not three independent items.\n */\n emptyStateWrap: {\n flex: 1,\n minHeight: 420,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 32,\n },\n emptyMark: {\n width: 72,\n height: 72,\n borderRadius: 36,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 18,\n },\n emptyTitle: {\n fontSize: 20,\n fontWeight: '700',\n letterSpacing: -0.3,\n textAlign: 'center',\n marginBottom: 6,\n },\n emptySubtitle: {\n fontSize: 14,\n lineHeight: 20,\n textAlign: 'center',\n maxWidth: 340,\n },\n});\n"],"names":["d"],"mappings":"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"}
1
+ {"version":3,"file":"ChatHistoryLanding.js","sources":["../../../../src/screens/Home/components/ChatHistoryLanding.tsx"],"sourcesContent":["import React from 'react';\nimport {\n ActivityIndicator,\n Pressable,\n RefreshControl,\n SectionList,\n StyleSheet,\n View,\n useColorScheme,\n useWindowDimensions,\n} from 'react-native';\nimport { Feather, MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { useFocusEffect } from '@react-navigation/native';\nimport {\n HISTORY_PAGE_SIZE,\n chatHistorySessionsFromChannels,\n getHistoryChannelsQueryVariables,\n useChatHistorySessionsFromChannels,\n type ChatHistoryMode,\n type ChatHistorySession,\n} from '../../../hooks/useChatApi';\nimport { useApolloClient } from '@apollo/client';\nimport { GetChannelsByUserWithLastMessageDocument } from 'common/graphql';\nimport { usePrerequisiteIds } from '../../../hooks/usePrerequisiteIds';\nimport ThinkingIndicator from '../../../components/ThinkingIndicator';\nimport { mobileTokens } from '../../../theme/mobileTokens';\n\n/**\n * Chat history list for mobile.\n *\n * Data: `useGetChannelsByUserWithLastMessageQuery` returning one row per channel\n * with `lastMessage` carrying the parent user prompt and the assistant reply.\n *\n * Layout: Manus-style two-line row — 40×40 leading mode tile, **line 1** =\n * `lastMessage.propsConfiguration.contents.parent.message` (user prompt),\n * **line 2** = `lastMessage.message` (latest post body, including agent errors\n * such as lines starting with ⚠), right-aligned short date. Indigo-tinted\n * neutrals so the surface stays in the Yantra brand register.\n *\n * Mode tile carries real information (chat vs deep-search), not decoration —\n * different modes get different glyphs and tints.\n */\ninterface ChatHistoryLandingProps {\n /**\n * `mode` is derived per-row via `detectMode(channel)`. Build sessions open\n * Web Builder; chat / deep-search open Chat.\n */\n onSelectSession: (channelId: string, mode: ChatHistoryMode) => void;\n /** Kept in the contract; not surfaced here — new-chat lives in the screen header. */\n onCompose: () => void;\n}\n\ninterface SessionRow extends ChatHistorySession {\n id: string;\n /** Pre-truncated title for one-line render. */\n titleForRender: string;\n /** Pre-truncated preview for one-line render (empty if suppressed upstream). */\n previewForRender: string;\n /** Cached unix-ms for bucketing / sorting. */\n sortAt: number;\n}\n\ninterface SessionSection {\n key: 'today' | 'yesterday' | 'week' | 'earlier';\n title: string;\n data: SessionRow[];\n}\n\nfunction truncate(text: string, max = 96): string {\n const cleaned = text.replace(/\\s+/g, ' ').trim();\n if (cleaned.length <= max) return cleaned;\n return `${cleaned.slice(0, max).trim()}...`;\n}\n\nconst WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nfunction relativeTime(ts: number, now: number): string {\n const deltaMs = now - ts;\n if (deltaMs < 60_000) return 'now';\n const minutes = Math.floor(deltaMs / 60_000);\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h`;\n const days = Math.floor(hours / 24);\n if (days < 7) {\n const d = new Date(ts);\n return WEEKDAYS[d.getDay()] ?? `${days}d`;\n }\n /**\n * 7d+: numeric short date (e.g. \"2/18\" matching the Manus reference). Year only\n * appears when crossing into a previous year, to keep the right column compact.\n */\n const d = new Date(ts);\n const sameYear = d.getFullYear() === new Date(now).getFullYear();\n const m = d.getMonth() + 1;\n const day = d.getDate();\n return sameYear ? `${m}/${day}` : `${m}/${day}/${String(d.getFullYear()).slice(2)}`;\n}\n\nfunction bucketFor(ts: number, now: number): SessionSection['key'] {\n const a = new Date(ts);\n const b = new Date(now);\n const startOf = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n const today = startOf(b);\n const yesterday = today - 24 * 60 * 60 * 1000;\n const weekAgo = today - 7 * 24 * 60 * 60 * 1000;\n const tsDay = startOf(a);\n if (tsDay >= today) return 'today';\n if (tsDay >= yesterday) return 'yesterday';\n if (tsDay >= weekAgo) return 'week';\n return 'earlier';\n}\n\nfunction buildSections(rows: SessionRow[], now: number): SessionSection[] {\n const buckets: Record<SessionSection['key'], SessionRow[]> = {\n today: [],\n yesterday: [],\n week: [],\n earlier: [],\n };\n for (const row of rows) {\n buckets[bucketFor(row.sortAt, now)].push(row);\n }\n const out: SessionSection[] = [];\n if (buckets.today.length) out.push({ key: 'today', title: 'TODAY', data: buckets.today });\n if (buckets.yesterday.length) out.push({ key: 'yesterday', title: 'YESTERDAY', data: buckets.yesterday });\n if (buckets.week.length) out.push({ key: 'week', title: 'PREVIOUS 7 DAYS', data: buckets.week });\n if (buckets.earlier.length) out.push({ key: 'earlier', title: 'EARLIER', data: buckets.earlier });\n return out;\n}\n\n/**\n * Theme tokens.\n *\n * Color strategy: Monochrome ink. Chrome (section labels, chat tile, load-more\n * pill, end-of-list dot, press wash, refresh spinner) is rendered in tinted\n * neutrals so the only real color on the screen is the deep-search amber —\n * which then reliably signals a mode, not decoration. Neutrals carry chroma\n * 0.005–0.01 toward the brand hue (no pure `#fff` / `#000`).\n */\ninterface ThemeTokens {\n bg: string;\n surface: string;\n title: string;\n preview: string;\n meta: string;\n muted: string;\n divider: string;\n sectionLabel: string;\n /** Mode tile (chat) — neutral ink on neutral fill. */\n tileChatBg: string;\n tileChatIcon: string;\n /** Mode tile (deep-search) — amber kept as the one real mode color. */\n tileSearchBg: string;\n tileSearchIcon: string;\n /** Mode tile (build / Web Builder) — indigo, same accent as the composer lightbulb. */\n tileBuildBg: string;\n tileBuildIcon: string;\n pressed: string;\n loadMoreText: string;\n loadMoreBorder: string;\n loadMoreBg: string;\n refreshTint: string;\n endDot: string;\n /**\n * Empty-state mark — circular soft-neutral disk holding a chat glyph.\n * Matches the web reference (gray-on-gray circle), not the row mode tile.\n */\n emptyMarkBg: string;\n emptyMarkIcon: string;\n}\n\nfunction buildTheme(isDark: boolean): ThemeTokens {\n if (isDark) {\n return {\n bg: '#0b1220',\n surface: mobileTokens.color.surface,\n title: '#f1f5f9',\n preview: '#94a3b8',\n meta: '#9aa0b8',\n muted: '#7a809a',\n divider: 'rgba(148, 163, 184, 0.12)',\n sectionLabel: '#cbd5e1',\n tileChatBg: 'rgba(148, 163, 184, 0.16)',\n tileChatIcon: '#e2e8f0',\n tileSearchBg: 'rgba(251, 191, 36, 0.16)',\n tileSearchIcon: '#fde68a',\n tileBuildBg: 'rgba(129, 140, 248, 0.18)',\n tileBuildIcon: '#c7d2fe',\n pressed: 'rgba(148, 163, 184, 0.10)',\n loadMoreText: '#e2e8f0',\n loadMoreBorder: 'rgba(148, 163, 184, 0.28)',\n loadMoreBg: 'rgba(148, 163, 184, 0.10)',\n refreshTint: '#cbd5e1',\n endDot: '#94a3b8',\n emptyMarkBg: 'rgba(148, 163, 184, 0.18)',\n emptyMarkIcon: '#b4bccc',\n };\n }\n return {\n bg: mobileTokens.color.bg,\n surface: mobileTokens.color.surface,\n title: '#0b1424',\n preview: '#525a73',\n meta: '#7b8197',\n muted: '#94a3b8',\n divider: 'rgba(15, 23, 42, 0.06)',\n sectionLabel: '#374151',\n tileChatBg: 'rgba(15, 23, 42, 0.06)',\n tileChatIcon: '#1f2937',\n tileSearchBg: 'rgba(217, 119, 6, 0.10)',\n tileSearchIcon: '#b45309',\n tileBuildBg: mobileTokens.color.primarySoft,\n tileBuildIcon: mobileTokens.color.primary,\n pressed: 'rgba(15, 23, 42, 0.05)',\n loadMoreText: '#1f2937',\n loadMoreBorder: 'rgba(15, 23, 42, 0.15)',\n loadMoreBg: 'rgba(15, 23, 42, 0.04)',\n refreshTint: '#374151',\n endDot: '#9ca3af',\n emptyMarkBg: 'rgba(15, 23, 42, 0.07)',\n emptyMarkIcon: '#6b7280',\n };\n}\n\n/**\n * Leading 40×40 mode tile. Background and glyph reflect the conversation mode:\n * - chat → Lucide-style message bubble on indigo-tinted neutral\n * - deep-search → lightning glyph on amber-tinted neutral\n * - build → lightbulb on indigo (Web Builder sessions)\n *\n * Chat uses Feather (a Lucide port) so the row tile, the empty-state mark, and\n * the web header all share one bubble silhouette. Attachment-only threads use\n * a paperclip on the same chat tile so they are not titled with a raw filename.\n * Deep-search stays on MCI — Feather has no acceptable lightning glyph and the\n * amber/indigo split is already the primary mode signal.\n *\n * Real information per row, not decoration.\n */\nfunction ModeTile({\n mode,\n theme,\n isAttachment,\n}: {\n mode: ChatHistoryMode;\n theme: ThemeTokens;\n isAttachment?: boolean;\n}) {\n if (mode === 'deep-search') {\n return (\n <View style={[styles.tile, { backgroundColor: theme.tileSearchBg }]}>\n <MaterialCommunityIcons name=\"lightning-bolt-outline\" size={18} color={theme.tileSearchIcon} />\n </View>\n );\n }\n if (mode === 'build') {\n return (\n <View style={[styles.tile, { backgroundColor: theme.tileBuildBg }]}>\n <MaterialCommunityIcons name=\"lightbulb-outline\" size={18} color={theme.tileBuildIcon} />\n </View>\n );\n }\n if (isAttachment) {\n return (\n <View style={[styles.tile, { backgroundColor: theme.tileChatBg }]}>\n <Feather name=\"paperclip\" size={18} color={theme.tileChatIcon} />\n </View>\n );\n }\n return (\n <View style={[styles.tile, { backgroundColor: theme.tileChatBg }]}>\n <Feather name=\"message-circle\" size={18} color={theme.tileChatIcon} />\n </View>\n );\n}\n\nfunction ChatHistoryRow({\n session,\n onSelectSession,\n theme,\n timeLabel,\n}: {\n session: SessionRow;\n onSelectSession: (channelId: string, mode: ChatHistoryMode) => void;\n theme: ThemeTokens;\n timeLabel: string;\n}) {\n const titleColor = session.isPlaceholder ? theme.preview : theme.title;\n const titleStyle = [\n styles.rowTitle,\n { color: titleColor },\n session.isPlaceholder ? styles.rowTitlePlaceholder : null,\n ];\n return (\n <Pressable\n onPress={() => onSelectSession(session.channelId, session.mode)}\n style={({ pressed }) => [styles.row, pressed && { backgroundColor: theme.pressed }]}\n accessibilityRole=\"button\"\n accessibilityLabel={\n session.previewForRender\n ? `Open conversation: ${session.titleForRender}. ${session.previewForRender}. ${timeLabel}`\n : `Open conversation: ${session.titleForRender}, ${timeLabel}`\n }\n >\n <ModeTile mode={session.mode} theme={theme} isAttachment={session.isAttachment} />\n <View style={styles.rowBody}>\n <View style={styles.rowHeader}>\n <Text style={titleStyle} numberOfLines={1} ellipsizeMode=\"tail\">\n {session.titleForRender}\n </Text>\n <Text style={[styles.rowDate, { color: theme.meta }]} numberOfLines={1}>\n {timeLabel}\n </Text>\n </View>\n {session.previewForRender ? (\n <Text style={[styles.rowPreview, { color: theme.preview }]} numberOfLines={1} ellipsizeMode=\"tail\">\n {session.previewForRender}\n </Text>\n ) : null}\n </View>\n </Pressable>\n );\n}\n\nexport default function ChatHistoryLanding({ onSelectSession }: ChatHistoryLandingProps) {\n const { width: screenWidth } = useWindowDimensions();\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const theme = React.useMemo(() => buildTheme(isDark), [isDark]);\n\n const apollo = useApolloClient();\n const { orgName, loading: idsLoading } = usePrerequisiteIds();\n\n const {\n sessions: liveSessions,\n sessionsLoaded,\n refetch,\n sourceChannelCount,\n } = useChatHistorySessionsFromChannels(orgName, { skip: !orgName });\n\n /** \"Now\" reference recomputed on refresh so relative timestamps re-evaluate cleanly. */\n const [nowTs, setNowTs] = React.useState(() => Date.now());\n const [refreshing, setRefreshing] = React.useState(false);\n /** Manually fetched older pages (channel-paginated, appended). */\n const [olderSessions, setOlderSessions] = React.useState<ChatHistorySession[]>([]);\n /** True only when the last fetch returned a full page of channels (there may be more). */\n const [hasMore, setHasMore] = React.useState(false);\n const [loadingMore, setLoadingMore] = React.useState(false);\n\n /**\n * \"Load older\" eligibility tracks the live first page's raw channel count.\n * When older pages are appended, `onLoadMore` updates `hasMore` from its\n * own response. When older pages are reset (refresh), this effect realigns.\n */\n React.useEffect(() => {\n if (olderSessions.length > 0) return;\n setHasMore(sourceChannelCount >= HISTORY_PAGE_SIZE);\n }, [sourceChannelCount, olderSessions.length]);\n\n /** Re-fetch first page on focus (e.g. returning from a chat). */\n useFocusEffect(\n React.useCallback(() => {\n if (!orgName) return;\n void refetch(getHistoryChannelsQueryVariables(orgName)).catch(() => {\n /* network errors surface in the watched query state. */\n });\n }, [orgName, refetch]),\n );\n\n const onRefresh = React.useCallback(async () => {\n if (!orgName) return;\n setRefreshing(true);\n try {\n await refetch(getHistoryChannelsQueryVariables(orgName));\n setOlderSessions([]);\n setNowTs(Date.now());\n } catch {\n /* refetch errors surface via loading state. */\n } finally {\n setRefreshing(false);\n }\n }, [orgName, refetch]);\n\n /**\n * \"Load older\": one-off `client.query` against `channelsByUser` with the next\n * `skip`. We don't bump the watched query's variables (that would re-key the\n * cache slot and shrink `liveSessions`).\n */\n const onLoadMore = React.useCallback(async () => {\n if (!orgName || loadingMore || !hasMore) return;\n setLoadingMore(true);\n try {\n const nextSkip = liveSessions.length + olderSessions.length;\n const result = await apollo.query({\n query: GetChannelsByUserWithLastMessageDocument,\n variables: getHistoryChannelsQueryVariables(orgName, {\n skip: nextSkip,\n limit: HISTORY_PAGE_SIZE,\n }),\n fetchPolicy: 'network-only',\n });\n const rawCount = (result.data?.channelsByUser ?? []).length;\n const nextBatch = chatHistorySessionsFromChannels(result.data as any);\n if (nextBatch.length === 0) {\n setHasMore(false);\n } else {\n setOlderSessions((prev) => {\n const map = new Map<string, ChatHistorySession>();\n for (const s of prev) map.set(s.channelId, s);\n for (const s of nextBatch) map.set(s.channelId, s);\n return Array.from(map.values());\n });\n setHasMore(rawCount >= HISTORY_PAGE_SIZE);\n }\n } catch {\n /* next \"Load older\" tap retries the same skip. */\n } finally {\n setLoadingMore(false);\n }\n }, [apollo, hasMore, liveSessions.length, loadingMore, olderSessions, orgName]);\n\n /**\n * Merge live + older, dedupe on channelId (live wins so streaming title /\n * lastMessage updates are reflected), sort descending by activity, then\n * pre-truncate strings for one-line render.\n */\n const sessions: SessionRow[] = React.useMemo(() => {\n const map = new Map<string, ChatHistorySession>();\n for (const s of olderSessions) map.set(s.channelId, s);\n for (const s of liveSessions) map.set(s.channelId, s);\n return Array.from(map.values())\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())\n .map((s) => ({\n ...s,\n id: s.channelId,\n titleForRender: truncate(s.title, 64),\n previewForRender: s.preview ? truncate(s.preview, 96) : '',\n sortAt: s.updatedAt.getTime(),\n }));\n }, [liveSessions, olderSessions]);\n\n const sections = React.useMemo(() => buildSections(sessions, nowTs), [sessions, nowTs]);\n /**\n * Initial-load window: the loader shows ONLY before we have data we can\n * render — i.e. before prerequisite ids resolve or before Apollo has served\n * a result (cache or network) for this org.\n *\n * Critically, `sessionsLoaded` (`data !== undefined`) flips true synchronously\n * on a cache hit, so revisiting the screen does not re-flash the loader while\n * Apollo revalidates in the background. We also do NOT gate on\n * `sessions.length === 0` here — a cached-but-empty list should drop straight\n * into the dedicated empty state, not the spinner.\n */\n const initialLoading = !sessionsLoaded || idsLoading || !orgName;\n const contentMaxWidth = Math.min(720, Math.max(360, screenWidth - 24));\n const containerStyle = { maxWidth: contentMaxWidth, alignSelf: 'center' as const, width: '100%' as const };\n\n const listFooter = hasMore ? (\n <View style={[styles.footer, containerStyle]}>\n <Pressable\n onPress={() => void onLoadMore()}\n disabled={loadingMore}\n style={({ pressed }) => [\n styles.loadMore,\n {\n backgroundColor: theme.loadMoreBg,\n borderColor: theme.loadMoreBorder,\n },\n loadingMore && { opacity: 0.7 },\n pressed && !loadingMore && { opacity: 0.8 },\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Load older conversations\"\n >\n {loadingMore ? (\n <ActivityIndicator size=\"small\" color={theme.loadMoreText} />\n ) : (\n <Text style={[styles.loadMoreText, { color: theme.loadMoreText }]}>Load older</Text>\n )}\n </Pressable>\n </View>\n ) : !hasMore && sessions.length > 0 ? (\n <View style={[styles.endHint, containerStyle]}>\n <View style={[styles.endHintDot, { backgroundColor: theme.endDot, opacity: 0.5 }]} />\n <Text style={[styles.endHintText, { color: theme.muted }]}>{\"You're all caught up\"}</Text>\n </View>\n ) : (\n <View style={{ height: 24 }} />\n );\n\n /**\n * Hairline divider between rows, inset to start where the title column does\n * (past the 40px tile + 14px gap = 54px). Quieter than full-bleed; confirms\n * the column the eye is scanning.\n */\n const renderItemSeparator = React.useCallback(\n () => <View style={[styles.divider, { backgroundColor: theme.divider }]} />,\n [theme.divider],\n );\n\n return (\n <View style={[styles.container, { backgroundColor: theme.bg }]}>\n {initialLoading ? (\n /**\n * Initial-fetch state mirrors the web composer's \"Thinking…\" pill\n * (see `packages-modules/account/browser/src/pages/chat/ChatSessionPage.tsx`):\n * a thin spinning arc + 12px muted caption, both tinted with\n * `theme.muted` so the indicator reads as a quiet status row\n * rather than a brand-stamped loading screen.\n */\n <View style={styles.emptyStateWrap}>\n <ThinkingIndicator color={theme.muted} />\n </View>\n ) : sessions.length === 0 ? (\n <View style={styles.emptyStateWrap}>\n {/**\n * Empty-state mark: circular neutral disk with a Lucide-style chat\n * bubble. Uses Feather (same glyph family as the web's lucide-react\n * `MessageCircle`) instead of MCI so the rounded body + tail proportions\n * match the web reference 1:1. Glyph fills ~55% of the disk so it\n * reads as a real focal point, not decoration.\n */}\n <View style={[styles.emptyMark, { backgroundColor: theme.emptyMarkBg }]}>\n <Feather name=\"message-circle\" size={40} color={theme.emptyMarkIcon} />\n </View>\n <Text style={[styles.emptyTitle, { color: theme.title }]}>No conversations yet</Text>\n <Text style={[styles.emptySubtitle, { color: theme.muted }]}>\n Start your first chat to see your conversation history here.\n </Text>\n </View>\n ) : (\n <SectionList\n sections={sections}\n keyExtractor={(item) => item.channelId}\n stickySectionHeadersEnabled={false}\n contentContainerStyle={[styles.listContent, containerStyle, { paddingBottom: 32 }]}\n ListFooterComponent={listFooter}\n ItemSeparatorComponent={renderItemSeparator}\n refreshControl={\n <RefreshControl\n refreshing={refreshing}\n onRefresh={() => void onRefresh()}\n tintColor={theme.refreshTint}\n colors={[theme.refreshTint]}\n />\n }\n renderSectionHeader={({ section }) => (\n <View style={styles.sectionHeader}>\n <Text style={[styles.sectionLabel, { color: theme.sectionLabel }]}>{section.title}</Text>\n </View>\n )}\n renderItem={({ item }) => (\n <ChatHistoryRow\n session={item}\n onSelectSession={onSelectSession}\n theme={theme}\n timeLabel={relativeTime(item.sortAt, nowTs)}\n />\n )}\n showsVerticalScrollIndicator={false}\n />\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n listContent: {\n paddingHorizontal: 20,\n paddingTop: 4,\n },\n /**\n * Section header: sentence case, indigo-tinted, modest size. 28px top padding\n * establishes rhythm between groups without dead air below the label.\n */\n sectionHeader: {\n paddingTop: 28,\n paddingBottom: 10,\n paddingHorizontal: 2,\n },\n sectionLabel: {\n fontSize: 12,\n fontWeight: '700',\n letterSpacing: 0.6,\n textTransform: 'uppercase',\n },\n /**\n * Row: leading 40×40 mode tile, two-line body (title + preview), right-aligned\n * date aligned to the title's baseline. 14px gap matches the tile-to-text\n * rhythm in Manus / iOS Mail.\n */\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n paddingHorizontal: 2,\n gap: 14,\n },\n tile: {\n width: 40,\n height: 40,\n borderRadius: 12,\n alignItems: 'center',\n justifyContent: 'center',\n },\n rowBody: {\n flex: 1,\n minWidth: 0,\n },\n rowHeader: {\n flexDirection: 'row',\n alignItems: 'baseline',\n gap: 10,\n },\n rowTitle: {\n flex: 1,\n fontSize: 16,\n fontWeight: '600',\n letterSpacing: -0.1,\n lineHeight: 22,\n },\n rowTitlePlaceholder: {\n fontWeight: '500',\n fontStyle: 'italic',\n },\n rowDate: {\n fontSize: 12.5,\n fontWeight: '500',\n fontVariant: ['tabular-nums'],\n },\n rowPreview: {\n marginTop: 2,\n fontSize: 13.5,\n lineHeight: 19,\n fontWeight: '400',\n letterSpacing: -0.05,\n },\n /**\n * Indented hairline: starts past the tile column (40 + 14 = 54) so the rule\n * aligns with the title's leading edge. Mail-style.\n */\n divider: {\n height: StyleSheet.hairlineWidth,\n marginLeft: 56,\n },\n footer: {\n paddingTop: 28,\n paddingBottom: 8,\n alignItems: 'center',\n },\n /** Bordered ink-neutral pill. Label is the affordance, no leading icon, no chevron. */\n loadMore: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 10,\n paddingHorizontal: 18,\n borderRadius: 999,\n borderWidth: 1,\n minWidth: 132,\n },\n loadMoreText: {\n fontSize: 13.5,\n fontWeight: '600',\n letterSpacing: -0.05,\n },\n endHint: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n paddingTop: 32,\n paddingBottom: 12,\n },\n endHintDot: {\n width: 4,\n height: 4,\n borderRadius: 2,\n },\n endHintText: {\n fontSize: 12.5,\n fontWeight: '500',\n letterSpacing: 0.1,\n },\n /**\n * Empty state: stack a 64×64 indigo-tinted mark over title + subtitle.\n * Generous vertical gap (16) between mark and title; tighter gap (6)\n * between title and subtitle so the pair reads as one unit hanging off\n * the mark, not three independent items.\n */\n emptyStateWrap: {\n flex: 1,\n minHeight: 420,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 32,\n },\n emptyMark: {\n width: 72,\n height: 72,\n borderRadius: 36,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 18,\n },\n emptyTitle: {\n fontSize: 20,\n fontWeight: '700',\n letterSpacing: -0.3,\n textAlign: 'center',\n marginBottom: 6,\n },\n emptySubtitle: {\n fontSize: 14,\n lineHeight: 20,\n textAlign: 'center',\n maxWidth: 340,\n },\n});\n"],"names":["d"],"mappings":"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"}