@adminide-stack/yantra-mobile 12.0.49 → 12.0.50-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/bridge/NativeWebViewBridge.js +14 -1
- package/lib/bridge/NativeWebViewBridge.js.map +1 -1
- package/lib/components/KeyboardComposerDock.js +23 -17
- package/lib/components/KeyboardComposerDock.js.map +1 -1
- package/lib/features/apps/AppsCatalog.js +9 -0
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/chat/ChatTranscript.js +16 -8
- package/lib/features/chat/ChatTranscript.js.map +1 -1
- package/lib/features/skills/skillTemplates.js.map +1 -1
- package/lib/hooks/useChatStream.js +30 -6
- package/lib/hooks/useChatStream.js.map +1 -1
- package/lib/screens/Chat/index.js +5 -8
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js +7 -17
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/DeepSearchModal.js +1 -1
- package/lib/screens/Home/components/DeepSearchModal.js.map +1 -1
- package/lib/screens/Home/components/WebBuilderPrewarm.js +4 -47
- package/lib/screens/Home/components/WebBuilderPrewarm.js.map +1 -1
- package/lib/screens/WebBuilder/webbuilderWarmCache.js +1 -15
- package/lib/screens/WebBuilder/webbuilderWarmCache.js.map +1 -1
- package/package.json +4 -4
- package/lib/hooks/useKeyboardBottomOffset.js +0 -42
- package/lib/hooks/useKeyboardBottomOffset.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 { 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 onOpenRoute?: (name: string) => 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 onOpenRoute,\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 onOpenRoute={onOpenRoute}\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 /** Starter chips with a real native screen navigate there directly. */\n const handleOpenRoute = React.useCallback(\n (name: string) => {\n navigation.dispatch(\n CommonActions.navigate({\n name,\n params: { orgName: effectiveOrgName ?? routeOrgName ?? undefined },\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 onOpenRoute={handleOpenRoute}\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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"}
|
|
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 { KeyboardAwareScreen, 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 { 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 onOpenRoute?: (name: string) => 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 onOpenRoute,\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 onOpenRoute={onOpenRoute}\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\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 /** Starter chips with a real native screen navigate there directly. */\n const handleOpenRoute = React.useCallback(\n (name: string) => {\n navigation.dispatch(\n CommonActions.navigate({\n name,\n params: { orgName: effectiveOrgName ?? routeOrgName ?? undefined },\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 <KeyboardAwareScreen>\n <View style={styles.flex}>\n <ScrollView\n style={styles.flex}\n contentContainerStyle={styles.emptyScroll}\n keyboardShouldPersistTaps=\"handled\"\n keyboardDismissMode=\"interactive\"\n automaticallyAdjustKeyboardInsets={false}\n contentInsetAdjustmentBehavior=\"never\"\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={false}\n onInjectPrompt={handleInjectPrompt}\n onOpenRoute={handleOpenRoute}\n />\n </Pressable>\n </ScrollView>\n <KeyboardComposerDock closedInset={insets.bottom}>\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={false}\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 </KeyboardAwareScreen>\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 justifyContent: 'center',\n paddingVertical: 24,\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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"}
|
|
@@ -63,7 +63,7 @@ Query: ${query != null ? query : ""}`
|
|
|
63
63
|
});
|
|
64
64
|
}, children: [
|
|
65
65
|
/* @__PURE__ */ jsxs(View, { style: styles.summaryCard, children: [
|
|
66
|
-
(displayMarkdown || (isStreaming ? "Researching..." : "")).length > 0 ? /* @__PURE__ */ jsx(Markdown, { style: markdownStyles, onLinkPress: (url) => {
|
|
66
|
+
(displayMarkdown || (isStreaming ? "Researching..." : "")).length > 0 ? isStreaming ? /* @__PURE__ */ jsx(Text, { fontSize: "$sm", color: "$gray700", children: displayMarkdown || "Researching..." }) : /* @__PURE__ */ jsx(Markdown, { style: markdownStyles, onLinkPress: (url) => {
|
|
67
67
|
void Linking.openURL(url);
|
|
68
68
|
return true;
|
|
69
69
|
}, children: displayMarkdown }) : /* @__PURE__ */ jsx(Text, { fontSize: "$sm", color: "$gray700", children: "No summary yet." }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeepSearchModal.js","sources":["../../../../src/screens/Home/components/DeepSearchModal.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef } from 'react';\nimport {\n ActivityIndicator,\n Modal,\n Pressable,\n ScrollView,\n Share,\n StyleSheet,\n View,\n useWindowDimensions,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport Markdown from 'react-native-markdown-display';\nimport { Linking } from 'react-native';\nimport type { DeepSearchSourceItem } from '../deepSearchUtils';\nimport { mobileTokens } from '../../../theme/mobileTokens';\n\ninterface DeepSearchModalProps {\n visible: boolean;\n query: string | null;\n summaryText: string;\n sources: DeepSearchSourceItem[];\n isStreaming: boolean;\n researchProcessOpen: boolean;\n sourcesAccordionOpen: boolean;\n onToggleResearchProcess: () => void;\n onToggleSourcesAccordion: () => void;\n onRetry: () => void;\n onStop: () => void;\n onClose: () => void;\n}\n\nexport default function DeepSearchModal({\n visible,\n query,\n summaryText,\n sources,\n isStreaming,\n researchProcessOpen,\n sourcesAccordionOpen,\n onToggleResearchProcess,\n onToggleSourcesAccordion,\n onRetry,\n onStop,\n onClose,\n}: DeepSearchModalProps) {\n const { width: screenWidth } = useWindowDimensions();\n const modalScrollRef = useRef<ScrollView | null>(null);\n\n const displayMarkdown = useMemo(() => {\n if (!summaryText) return '';\n const hasResearchHeading = /research summary\\s*:/i.test(summaryText);\n if (hasResearchHeading) return summaryText;\n const heading = query ? `## Research Summary: ${query}` : '## Research Summary';\n return `${heading}\\n\\n${summaryText}`;\n }, [summaryText, query]);\n\n useEffect(() => {\n if (!visible) return;\n requestAnimationFrame(() => {\n modalScrollRef.current?.scrollToEnd({ animated: true });\n });\n }, [visible, displayMarkdown, sources.length, isStreaming]);\n\n const handleShare = async () => {\n if (!summaryText) return;\n try {\n await Share.share({\n message: `${summaryText}\\n\\nQuery: ${query ?? ''}`,\n });\n } catch (error) {\n console.error('[DeepSearchModal] Failed to share summary:', error);\n }\n };\n\n return (\n <Modal visible={visible} transparent animationType=\"fade\" onRequestClose={onClose}>\n <View style={styles.modalBackdrop}>\n <View style={[styles.modalCard, { width: Math.min(760, screenWidth - 24) }]}>\n <View style={styles.modalHeaderRow}>\n <View style={styles.modalHeaderLeft}>\n <Text fontSize=\"$md\" fontWeight=\"$semibold\" color=\"$gray900\">\n Deep Search\n </Text>\n {isStreaming ? (\n <Text fontSize=\"$xs\" color=\"$gray600\">\n Running...\n </Text>\n ) : null}\n </View>\n <Pressable onPress={onClose} style={styles.iconButton}>\n <MaterialCommunityIcons name=\"close\" size={18} color=\"#6b7280\" />\n </Pressable>\n </View>\n <ScrollView\n ref={modalScrollRef}\n style={styles.modalBody}\n contentContainerStyle={styles.modalBodyContent}\n nestedScrollEnabled\n keyboardShouldPersistTaps=\"handled\"\n showsVerticalScrollIndicator\n onContentSizeChange={() => {\n modalScrollRef.current?.scrollToEnd({ animated: true });\n }}\n >\n <View style={styles.summaryCard}>\n {(displayMarkdown || (isStreaming ? 'Researching...' : '')).length > 0 ? (\n <Markdown\n style={markdownStyles}\n onLinkPress={(url) => {\n void Linking.openURL(url);\n return true;\n }}\n >\n {displayMarkdown}\n </Markdown>\n ) : (\n <Text fontSize=\"$sm\" color=\"$gray700\">\n No summary yet.\n </Text>\n )}\n <View style={styles.summaryActionRow}>\n <Pressable onPress={handleShare} style={styles.summaryActionButton}>\n <Text fontSize=\"$xs\" color=\"$gray900\">\n Share\n </Text>\n </Pressable>\n <Pressable\n onPress={onRetry}\n disabled={isStreaming || !query}\n style={({ pressed }) => [\n styles.summaryActionButton,\n (isStreaming || !query) && styles.summaryActionDisabled,\n pressed && styles.sourceRowPressed,\n ]}\n >\n <Text fontSize=\"$xs\" color=\"$gray900\">\n Retry\n </Text>\n </Pressable>\n </View>\n </View>\n\n <View style={styles.accordionCard}>\n <Pressable onPress={onToggleResearchProcess} style={styles.accordionHeader}>\n <Text fontSize=\"$sm\" color=\"$gray900\" fontWeight=\"$semibold\">\n Research Process\n </Text>\n <View style={styles.accordionHeaderRight}>\n <Text fontSize=\"$xs\" color=\"$gray600\">\n {query ? '1 query' : '0 query'}\n </Text>\n <MaterialCommunityIcons\n name={researchProcessOpen ? 'chevron-up' : 'chevron-down'}\n size={16}\n color=\"#6b7280\"\n />\n </View>\n </Pressable>\n {researchProcessOpen && (\n <View style={styles.accordionBody}>\n {query ? (\n <View style={styles.processItem}>\n <View\n style={[\n styles.processDot,\n { backgroundColor: isStreaming ? '#f59e0b' : '#22c55e' },\n ]}\n />\n <View style={{ flex: 1 }}>\n <Text fontSize=\"$sm\" color=\"$gray900\" numberOfLines={2}>\n {query}\n </Text>\n <Text fontSize=\"$xs\" color=\"$gray600\">\n {isStreaming\n ? 'Running deep-search...'\n : `Completed with ${sources.length} sources`}\n </Text>\n </View>\n </View>\n ) : (\n <Text fontSize=\"$sm\" color=\"$gray600\">\n No query started yet.\n </Text>\n )}\n </View>\n )}\n </View>\n\n <View style={styles.accordionCard}>\n <Pressable onPress={onToggleSourcesAccordion} style={styles.accordionHeader}>\n <Text fontSize=\"$sm\" color=\"$gray900\" fontWeight=\"$semibold\">\n Sources\n </Text>\n <View style={styles.accordionHeaderRight}>\n <Text fontSize=\"$xs\" color=\"$gray600\">\n {sources.length} sources\n </Text>\n <MaterialCommunityIcons\n name={sourcesAccordionOpen ? 'chevron-up' : 'chevron-down'}\n size={16}\n color=\"#6b7280\"\n />\n </View>\n </Pressable>\n {sourcesAccordionOpen && (\n <View style={styles.accordionBody}>\n {sources.length > 0 ? (\n sources.map((item, index) => (\n <Pressable\n key={`${item.url ?? item.title}-${index}`}\n onPress={() => {\n if (item.url) {\n void Linking.openURL(item.url);\n }\n }}\n disabled={!item.url}\n style={({ pressed }) => [\n styles.sourceRow,\n !item.url && styles.sourceRowNoLink,\n pressed && item.url ? styles.sourceRowPressed : undefined,\n ]}\n >\n <Text fontSize=\"$xs\" color=\"$green800\" mb=\"$1\" fontWeight=\"$semibold\">\n {index + 1}. {item.title || 'Source'}\n </Text>\n {item.url ? (\n <Text fontSize=\"$xs\" color=\"$gray700\" numberOfLines={1}>\n {item.url}\n </Text>\n ) : (\n <Text fontSize=\"$xs\" color=\"$gray500\" numberOfLines={1}>\n Source title detected from summary\n </Text>\n )}\n </Pressable>\n ))\n ) : (\n <Text fontSize=\"$sm\" color=\"$gray700\">\n {isStreaming\n ? 'Collecting sources...'\n : 'No source links detected in the response.'}\n </Text>\n )}\n </View>\n )}\n </View>\n </ScrollView>\n <View style={styles.modalActionsRow}>\n {isStreaming ? (\n <Pressable onPress={onStop} style={styles.modalActionButton}>\n <Text fontSize=\"$sm\" color=\"$gray900\">\n Stop\n </Text>\n </Pressable>\n ) : null}\n <Pressable onPress={onClose} style={styles.modalActionButton}>\n <Text fontSize=\"$sm\" color=\"$gray900\">\n Close\n </Text>\n </Pressable>\n </View>\n </View>\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n modalBackdrop: {\n flex: 1,\n backgroundColor: 'rgba(15, 23, 42, 0.45)',\n justifyContent: 'center',\n padding: 16,\n },\n modalCard: {\n maxHeight: '88%',\n backgroundColor: mobileTokens.color.surface,\n borderRadius: 18,\n padding: 16,\n width: '100%',\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n },\n modalHeaderRow: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 10,\n paddingBottom: 10,\n borderBottomWidth: 1,\n borderBottomColor: mobileTokens.color.border,\n },\n modalHeaderLeft: {\n flexDirection: 'column',\n },\n iconButton: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: mobileTokens.color.surfaceMuted,\n },\n modalBody: {\n flexGrow: 1,\n minHeight: 140,\n marginBottom: 10,\n },\n modalBodyContent: {\n paddingBottom: 8,\n },\n summaryCard: {\n backgroundColor: mobileTokens.color.surfaceMuted,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n borderRadius: 14,\n padding: 12,\n marginBottom: 10,\n },\n summaryActionRow: {\n marginTop: 8,\n borderTopWidth: 1,\n borderTopColor: '#e5e7eb',\n paddingTop: 8,\n flexDirection: 'row',\n justifyContent: 'flex-start',\n gap: 8,\n },\n summaryActionButton: {\n paddingVertical: 6,\n paddingHorizontal: 12,\n borderRadius: 10,\n backgroundColor: mobileTokens.color.surface,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n },\n summaryActionDisabled: {\n opacity: 0.5,\n },\n accordionCard: {\n backgroundColor: mobileTokens.color.surface,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n borderRadius: 12,\n marginBottom: 10,\n overflow: 'hidden',\n },\n accordionHeader: {\n paddingHorizontal: 10,\n paddingVertical: 10,\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n accordionHeaderRight: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n },\n accordionBody: {\n borderTopWidth: 1,\n borderTopColor: '#e5e7eb',\n padding: 10,\n },\n processItem: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n gap: 8,\n },\n processDot: {\n marginTop: 6,\n width: 8,\n height: 8,\n borderRadius: 4,\n },\n markdownBody: {\n color: '#111827',\n fontSize: 14,\n lineHeight: 20,\n },\n markdownHeading1: {\n color: '#111827',\n fontSize: 18,\n marginTop: 6,\n marginBottom: 6,\n fontWeight: '700',\n },\n markdownHeading2: {\n color: '#111827',\n fontSize: 16,\n marginTop: 6,\n marginBottom: 6,\n fontWeight: '700',\n },\n markdownHeading3: {\n color: '#111827',\n fontSize: 15,\n marginTop: 6,\n marginBottom: 6,\n fontWeight: '700',\n },\n markdownParagraph: {\n color: '#111827',\n fontSize: 14,\n lineHeight: 20,\n marginTop: 2,\n marginBottom: 8,\n },\n markdownList: {\n marginTop: 2,\n marginBottom: 8,\n },\n markdownListItem: {\n color: '#111827',\n fontSize: 14,\n lineHeight: 20,\n },\n markdownLink: {\n color: '#166534',\n textDecorationLine: 'underline',\n },\n markdownBlockquote: {\n borderLeftColor: '#d1d5db',\n borderLeftWidth: 3,\n paddingLeft: 8,\n color: '#4b5563',\n },\n markdownInlineCode: {\n backgroundColor: '#f3f4f6',\n color: '#111827',\n paddingHorizontal: 4,\n borderRadius: 4,\n },\n markdownCodeBlock: {\n backgroundColor: '#f3f4f6',\n color: '#111827',\n padding: 8,\n borderRadius: 6,\n },\n sourceRow: {\n backgroundColor: mobileTokens.color.surface,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n borderRadius: 10,\n padding: 10,\n marginBottom: 6,\n },\n sourceRowPressed: {\n opacity: 0.7,\n },\n sourceRowNoLink: {\n backgroundColor: '#f3f4f6',\n },\n modalActionsRow: {\n marginTop: 12,\n flexDirection: 'row',\n justifyContent: 'flex-end',\n gap: 10,\n },\n modalActionButton: {\n minHeight: 38,\n paddingVertical: 8,\n paddingHorizontal: 16,\n borderRadius: 11,\n backgroundColor: mobileTokens.color.surfaceMuted,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n justifyContent: 'center',\n },\n});\n\nconst markdownStyles = {\n body: styles.markdownBody,\n heading1: styles.markdownHeading1,\n heading2: styles.markdownHeading2,\n heading3: styles.markdownHeading3,\n bullet_list: styles.markdownList,\n ordered_list: styles.markdownList,\n list_item: styles.markdownListItem,\n link: styles.markdownLink,\n paragraph: styles.markdownParagraph,\n blockquote: styles.markdownBlockquote,\n code_inline: styles.markdownInlineCode,\n code_block: styles.markdownCodeBlock,\n};\n"],"names":[],"mappings":"yZAsBA,SAAwB,eAAgB,CAAA;AAAA,EACtC,OAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,uBAAA;AAAA,EACA,wBAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAyB,EAAA;AACvB,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA;AAAA,MACL,mBAAoB,EAAA;AACxB,EAAM,MAAA,cAAA,GAAiB,OAA0B,IAAI,CAAA;AACrD,EAAM,MAAA,eAAA,GAAkB,QAAQ,MAAM;AACpC,IAAI,IAAA,CAAC,aAAoB,OAAA,EAAA;AACzB,IAAM,MAAA,kBAAA,GAAqB,uBAAwB,CAAA,IAAA,CAAK,WAAW,CAAA;AACnE,IAAA,IAAI,oBAA2B,OAAA,WAAA;AAC/B,IAAA,MAAM,OAAU,GAAA,KAAA,GAAQ,CAAwB,qBAAA,EAAA,KAAK,CAAK,CAAA,GAAA,qBAAA;AAC1D,IAAA,OAAO,GAAG,OAAO;;AAAA,EAAO,WAAW,CAAA,CAAA;AAAA,GAClC,EAAA,CAAC,WAAa,EAAA,KAAK,CAAC,CAAA;AACvB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAS,EAAA;AACd,IAAA,qBAAA,CAAsB,MAAM;AAjDhC,MAAA,IAAA,EAAA;AAkDM,MAAe,CAAA,EAAA,GAAA,cAAA,CAAA,OAAA,KAAf,mBAAwB,WAAY,CAAA;AAAA,QAClC,QAAU,EAAA;AAAA,OACZ,CAAA;AAAA,KACD,CAAA;AAAA,KACA,CAAC,OAAA,EAAS,iBAAiB,OAAQ,CAAA,MAAA,EAAQ,WAAW,CAAC,CAAA;AAC1D,EAAA,MAAM,cAAc,YAAY;AAC9B,IAAA,IAAI,CAAC,WAAa,EAAA;AAClB,IAAI,IAAA;AACF,MAAA,MAAM,MAAM,KAAM,CAAA;AAAA,QAChB,OAAA,EAAS,GAAG,WAAW;;AAAA,OAAA,EAAc,wBAAS,EAAE,CAAA;AAAA,OACjD,CAAA;AAAA,aACM,KAAO,EAAA;AACd,MAAQ,OAAA,CAAA,KAAA,CAAM,8CAA8C,KAAK,CAAA;AAAA;AACnE,GACF;AACA,EAAA,2BAAQ,KAAM,EAAA,EAAA,OAAA,EAAkB,aAAW,IAAC,EAAA,aAAA,EAAc,QAAO,cAAgB,EAAA,OAAA,EACvE,8BAAC,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,aAChB,EAAA,QAAA,kBAAA,IAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,SAAW,EAAA;AAAA,IACxC,KAAO,EAAA,IAAA,CAAK,GAAI,CAAA,GAAA,EAAK,cAAc,EAAE;AAAA,GACtC,CACa,EAAA,QAAA,EAAA;AAAA,oBAAC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,cAChB,EAAA,QAAA,EAAA;AAAA,sBAAC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,eAChB,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAK,QAAS,EAAA,KAAA,EAAM,YAAW,WAAY,EAAA,KAAA,EAAM,YAAW,QAE7D,EAAA,aAAA,EAAA,CAAA;AAAA,QACC,WAAA,uBAAe,IAAK,EAAA,EAAA,QAAA,EAAS,OAAM,KAAM,EAAA,UAAA,EAAW,wBAEjD,CAAU,GAAA;AAAA,OAClB,EAAA,CAAA;AAAA,sBACC,GAAA,CAAA,SAAA,EAAA,EAAU,OAAS,EAAA,OAAA,EAAS,OAAO,MAAO,CAAA,UAAA,EACvC,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,MAAK,OAAQ,EAAA,IAAA,EAAM,EAAI,EAAA,KAAA,EAAM,WAAU,CACnE,EAAA;AAAA,KACJ,EAAA,CAAA;AAAA,yBACC,UAAW,EAAA,EAAA,GAAA,EAAK,cAAgB,EAAA,KAAA,EAAO,OAAO,SAAW,EAAA,qBAAA,EAAuB,MAAO,CAAA,gBAAA,EAAkB,qBAAmB,IAAC,EAAA,yBAAA,EAA0B,WAAU,4BAA4B,EAAA,IAAA,EAAC,qBAAqB,MAAM;AAnF9O,MAAA,IAAA,EAAA;AAoFU,MAAe,CAAA,EAAA,GAAA,cAAA,CAAA,OAAA,KAAf,mBAAwB,WAAY,CAAA;AAAA,QAClC,QAAU,EAAA;AAAA,OACZ,CAAA;AAAA,KAEc,EAAA,QAAA,EAAA;AAAA,sBAAC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,WACd,EAAA,QAAA,EAAA;AAAA,QAAoB,CAAA,eAAA,KAAA,WAAA,GAAc,gBAAmB,GAAA,EAAA,CAAA,EAAK,MAAS,GAAA,CAAA,uBAAK,QAAS,EAAA,EAAA,KAAA,EAAO,cAAgB,EAAA,WAAA,EAAa,CAAO,GAAA,KAAA;AAC5I,UAAK,KAAA,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACxB,UAAO,OAAA,IAAA;AAAA,SACT,EACyB,2BACL,CAAc,mBAAA,GAAA,CAAC,QAAK,QAAS,EAAA,KAAA,EAAM,KAAM,EAAA,UAAA,EAAW,QAEpD,EAAA,iBAAA,EAAA,CAAA;AAAA,wBACH,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,gBAChB,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAU,EAAA,EAAA,OAAA,EAAS,WAAa,EAAA,KAAA,EAAO,MAAO,CAAA,mBAAA,EAC3C,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,QAAS,EAAA,KAAA,EAAM,KAAM,EAAA,UAAA,EAAW,mBAEtC,CACJ,EAAA,CAAA;AAAA,0BACA,GAAA,CAAC,aAAU,OAAS,EAAA,OAAA,EAAS,UAAU,WAAe,IAAA,CAAC,KAAO,EAAA,KAAA,EAAO,CAAC;AAAA,YACtF;AAAA,WACF,KAAM,CAAC,MAAO,CAAA,mBAAA,EAAA,CAAsB,eAAe,CAAC,KAAA,KAAU,OAAO,qBAAuB,EAAA,OAAA,IAAW,OAAO,gBAAgB,CAAA,EACxG,8BAAC,IAAK,EAAA,EAAA,QAAA,EAAS,OAAM,KAAM,EAAA,UAAA,EAAW,mBAEtC,CACJ,EAAA;AAAA,SACJ,EAAA;AAAA,OACJ,EAAA,CAAA;AAAA,sBAEC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,aAChB,EAAA,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,SAAU,EAAA,EAAA,OAAA,EAAS,uBAAyB,EAAA,KAAA,EAAO,OAAO,eACvD,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAK,QAAS,EAAA,KAAA,EAAM,OAAM,UAAW,EAAA,UAAA,EAAW,aAAY,QAE7D,EAAA,kBAAA,EAAA,CAAA;AAAA,0BACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,oBAChB,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAK,QAAS,EAAA,KAAA,EAAM,OAAM,UACtB,EAAA,QAAA,EAAA,KAAA,GAAQ,YAAY,SACzB,EAAA,CAAA;AAAA,4BACA,GAAA,CAAC,0BAAuB,IAAM,EAAA,mBAAA,GAAsB,eAAe,cAAgB,EAAA,IAAA,EAAM,EAAI,EAAA,KAAA,EAAM,SAAU,EAAA;AAAA,WACjH,EAAA;AAAA,SACJ,EAAA,CAAA;AAAA,QACC,mBAAA,oBAAwB,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,aACnC,EAAA,QAAA,EAAA,KAAA,mBAAS,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,WACrB,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,UAAY,EAAA;AAAA,YAC3D,eAAA,EAAiB,cAAc,SAAY,GAAA;AAAA,WAC5C,CAAG,EAAA,CAAA;AAAA,0BACwB,IAAA,CAAC,QAAK,KAAO,EAAA;AAAA,YACvC,IAAM,EAAA;AAAA,WAEwB,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAK,QAAS,EAAA,KAAA,EAAM,OAAM,UAAW,EAAA,aAAA,EAAe,GAChD,QACL,EAAA,KAAA,EAAA,CAAA;AAAA,4BACA,GAAA,CAAC,IAAK,EAAA,EAAA,QAAA,EAAS,KAAM,EAAA,KAAA,EAAM,UACtB,EAAA,QAAA,EAAA,WAAA,GAAc,wBAA2B,GAAA,CAAA,eAAA,EAAkB,OAAQ,CAAA,MAAM,CAC9E,QAAA,CAAA,EAAA;AAAA,WACJ,EAAA;AAAA,SACJ,EAAA,CAAA,uBAAW,IAAK,EAAA,EAAA,QAAA,EAAS,OAAM,KAAM,EAAA,UAAA,EAAW,mCAEhD,CACR,EAAA;AAAA,OACR,EAAA,CAAA;AAAA,sBAEC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,aAChB,EAAA,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,SAAU,EAAA,EAAA,OAAA,EAAS,wBAA0B,EAAA,KAAA,EAAO,OAAO,eACxD,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAK,QAAS,EAAA,KAAA,EAAM,OAAM,UAAW,EAAA,UAAA,EAAW,aAAY,QAE7D,EAAA,SAAA,EAAA,CAAA;AAAA,0BACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,oBAChB,EAAA,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,IAAK,EAAA,EAAA,QAAA,EAAS,KAAM,EAAA,KAAA,EAAM,UACtB,EAAA,QAAA,EAAA;AAAA,cAAQ,OAAA,CAAA,MAAA;AAAA,cAAO;AAAA,aACpB,EAAA,CAAA;AAAA,4BACA,GAAA,CAAC,0BAAuB,IAAM,EAAA,oBAAA,GAAuB,eAAe,cAAgB,EAAA,IAAA,EAAM,EAAI,EAAA,KAAA,EAAM,SAAU,EAAA;AAAA,WAClH,EAAA;AAAA,SACJ,EAAA,CAAA;AAAA,QACC,oBAAwB,oBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,MAAO,CAAA,aAAA,EACpC,QAAQ,EAAA,OAAA,CAAA,MAAA,GAAS,CAAI,GAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,MAAM,KAAO,KAAA;AA/JpF,UAAA,IAAA,EAAA;AA+JuF,UAAC,uBAAA,IAAA,CAAA,SAAA,EAAA,EAAqD,SAAS,MAAM;AAC5I,YAAA,IAAI,KAAK,GAAK,EAAA;AACZ,cAAK,KAAA,OAAA,CAAQ,OAAQ,CAAA,IAAA,CAAK,GAAG,CAAA;AAAA;AAC/B,aACC,QAAU,EAAA,CAAC,IAAK,CAAA,GAAA,EAAK,OAAO,CAAC;AAAA,YAC9B;AAAA,WACI,KAAA,CAAC,MAAO,CAAA,SAAA,EAAW,CAAC,IAAK,CAAA,GAAA,IAAO,MAAO,CAAA,eAAA,EAAiB,WAAW,IAAK,CAAA,GAAA,GAAM,MAAO,CAAA,gBAAA,GAAmB,MAAS,CACrF,EAAA,QAAA,EAAA;AAAA,4BAAC,IAAA,CAAA,IAAA,EAAA,EAAK,UAAS,KAAM,EAAA,KAAA,EAAM,aAAY,EAAG,EAAA,IAAA,EAAK,YAAW,WACrD,EAAA,QAAA,EAAA;AAAA,cAAQ,KAAA,GAAA,CAAA;AAAA,cAAE,IAAA;AAAA,cAAG,KAAK,KAAS,IAAA;AAAA,aAChC,EAAA,CAAA;AAAA,YACC,IAAA,CAAK,sBAAO,GAAA,CAAA,IAAA,EAAA,EAAK,UAAS,KAAM,EAAA,KAAA,EAAM,YAAW,aAAe,EAAA,CAAA,EACxD,eAAK,GACV,EAAA,CAAA,uBAAW,IAAK,EAAA,EAAA,QAAA,EAAS,OAAM,KAAM,EAAA,UAAA,EAAW,aAAe,EAAA,CAAA,EAAG,QAElE,EAAA,oCAAA,EAAA;AAAA,WAdmD,EAAA,EAAA,CAAA,EAAA,CAAG,UAAK,GAAL,KAAA,IAAA,GAAA,EAAA,GAAY,KAAK,KAAK,CAAA,CAAA,EAAI,KAAK,CAe7F,CAAA,CAAA;AAAA,SAAY,CAAA,mBAAK,GAAA,CAAA,IAAA,EAAA,EAAK,QAAS,EAAA,KAAA,EAAM,OAAM,UAC1C,EAAA,QAAA,EAAA,WAAA,GAAc,uBAA0B,GAAA,2CAAA,EAC7C,CACR,EAAA;AAAA,OACR,EAAA;AAAA,KACJ,EAAA,CAAA;AAAA,oBACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,eACf,EAAA,QAAA,EAAA;AAAA,MAAA,WAAA,mBAAe,GAAA,CAAA,SAAA,EAAA,EAAU,OAAS,EAAA,MAAA,EAAQ,OAAO,MAAO,CAAA,iBAAA,EACjD,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,UAAS,KAAM,EAAA,KAAA,EAAM,UAAW,EAAA,QAAA,EAAA,MAAA,EAEtC,GACJ,CAAe,GAAA,IAAA;AAAA,sBAClB,GAAA,CAAA,SAAA,EAAA,EAAU,OAAS,EAAA,OAAA,EAAS,OAAO,MAAO,CAAA,iBAAA,EACvC,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,QAAS,EAAA,KAAA,EAAM,KAAM,EAAA,UAAA,EAAW,mBAEtC,CACJ,EAAA;AAAA,KACJ,EAAA;AAAA,GAAA,EACJ,GACJ,CACJ,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,aAAe,EAAA;AAAA,IACb,IAAM,EAAA,CAAA;AAAA,IACN,eAAiB,EAAA,wBAAA;AAAA,IACjB,cAAgB,EAAA,QAAA;AAAA,IAChB,OAAS,EAAA;AAAA,GACX;AAAA,EACA,SAAW,EAAA;AAAA,IACT,SAAW,EAAA,KAAA;AAAA,IACX,eAAA,EAAiB,aAAa,KAAM,CAAA,OAAA;AAAA,IACpC,YAAc,EAAA,EAAA;AAAA,IACd,OAAS,EAAA,EAAA;AAAA,IACT,KAAO,EAAA,MAAA;AAAA,IACP,WAAa,EAAA,CAAA;AAAA,IACb,WAAA,EAAa,aAAa,KAAM,CAAA;AAAA,GAClC;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,aAAe,EAAA,KAAA;AAAA,IACf,cAAgB,EAAA,eAAA;AAAA,IAChB,UAAY,EAAA,QAAA;AAAA,IACZ,YAAc,EAAA,EAAA;AAAA,IACd,aAAe,EAAA,EAAA;AAAA,IACf,iBAAmB,EAAA,CAAA;AAAA,IACnB,iBAAA,EAAmB,aAAa,KAAM,CAAA;AAAA,GACxC;AAAA,EACA,eAAiB,EAAA;AAAA,IACf,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,UAAY,EAAA;AAAA,IACV,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,eAAA,EAAiB,aAAa,KAAM,CAAA;AAAA,GACtC;AAAA,EACA,SAAW,EAAA;AAAA,IACT,QAAU,EAAA,CAAA;AAAA,IACV,SAAW,EAAA,GAAA;AAAA,IACX,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,WAAa,EAAA;AAAA,IACX,eAAA,EAAiB,aAAa,KAAM,CAAA,YAAA;AAAA,IACpC,WAAa,EAAA,CAAA;AAAA,IACb,WAAA,EAAa,aAAa,KAAM,CAAA,MAAA;AAAA,IAChC,YAAc,EAAA,EAAA;AAAA,IACd,OAAS,EAAA,EAAA;AAAA,IACT,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,SAAW,EAAA,CAAA;AAAA,IACX,cAAgB,EAAA,CAAA;AAAA,IAChB,cAAgB,EAAA,SAAA;AAAA,IAChB,UAAY,EAAA,CAAA;AAAA,IACZ,aAAe,EAAA,KAAA;AAAA,IACf,cAAgB,EAAA,YAAA;AAAA,IAChB,GAAK,EAAA;AAAA,GACP;AAAA,EACA,mBAAqB,EAAA;AAAA,IACnB,eAAiB,EAAA,CAAA;AAAA,IACjB,iBAAmB,EAAA,EAAA;AAAA,IACnB,YAAc,EAAA,EAAA;AAAA,IACd,eAAA,EAAiB,aAAa,KAAM,CAAA,OAAA;AAAA,IACpC,WAAa,EAAA,CAAA;AAAA,IACb,WAAA,EAAa,aAAa,KAAM,CAAA;AAAA,GAClC;AAAA,EACA,qBAAuB,EAAA;AAAA,IACrB,OAAS,EAAA;AAAA,GACX;AAAA,EACA,aAAe,EAAA;AAAA,IACb,eAAA,EAAiB,aAAa,KAAM,CAAA,OAAA;AAAA,IACpC,WAAa,EAAA,CAAA;AAAA,IACb,WAAA,EAAa,aAAa,KAAM,CAAA,MAAA;AAAA,IAChC,YAAc,EAAA,EAAA;AAAA,IACd,YAAc,EAAA,EAAA;AAAA,IACd,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,eAAiB,EAAA;AAAA,IACf,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,EAAA;AAAA,IACjB,aAAe,EAAA,KAAA;AAAA,IACf,cAAgB,EAAA,eAAA;AAAA,IAChB,UAAY,EAAA;AAAA,GACd;AAAA,EACA,oBAAsB,EAAA;AAAA,IACpB,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA;AAAA,GACP;AAAA,EACA,aAAe,EAAA;AAAA,IACb,cAAgB,EAAA,CAAA;AAAA,IAChB,cAAgB,EAAA,SAAA;AAAA,IAChB,OAAS,EAAA;AAAA,GACX;AAAA,EACA,WAAa,EAAA;AAAA,IACX,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,YAAA;AAAA,IACZ,GAAK,EAAA;AAAA,GACP;AAAA,EACA,UAAY,EAAA;AAAA,IACV,SAAW,EAAA,CAAA;AAAA,IACX,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA,CAAA;AAAA,IACR,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,KAAO,EAAA,SAAA;AAAA,IACP,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,KAAO,EAAA,SAAA;AAAA,IACP,QAAU,EAAA,EAAA;AAAA,IACV,SAAW,EAAA,CAAA;AAAA,IACX,YAAc,EAAA,CAAA;AAAA,IACd,UAAY,EAAA;AAAA,GACd;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,KAAO,EAAA,SAAA;AAAA,IACP,QAAU,EAAA,EAAA;AAAA,IACV,SAAW,EAAA,CAAA;AAAA,IACX,YAAc,EAAA,CAAA;AAAA,IACd,UAAY,EAAA;AAAA,GACd;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,KAAO,EAAA,SAAA;AAAA,IACP,QAAU,EAAA,EAAA;AAAA,IACV,SAAW,EAAA,CAAA;AAAA,IACX,YAAc,EAAA,CAAA;AAAA,IACd,UAAY,EAAA;AAAA,GACd;AAAA,EACA,iBAAmB,EAAA;AAAA,IACjB,KAAO,EAAA,SAAA;AAAA,IACP,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,EAAA;AAAA,IACZ,SAAW,EAAA,CAAA;AAAA,IACX,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,SAAW,EAAA,CAAA;AAAA,IACX,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,KAAO,EAAA,SAAA;AAAA,IACP,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,KAAO,EAAA,SAAA;AAAA,IACP,kBAAoB,EAAA;AAAA,GACtB;AAAA,EACA,kBAAoB,EAAA;AAAA,IAClB,eAAiB,EAAA,SAAA;AAAA,IACjB,eAAiB,EAAA,CAAA;AAAA,IACjB,WAAa,EAAA,CAAA;AAAA,IACb,KAAO,EAAA;AAAA,GACT;AAAA,EACA,kBAAoB,EAAA;AAAA,IAClB,eAAiB,EAAA,SAAA;AAAA,IACjB,KAAO,EAAA,SAAA;AAAA,IACP,iBAAmB,EAAA,CAAA;AAAA,IACnB,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,iBAAmB,EAAA;AAAA,IACjB,eAAiB,EAAA,SAAA;AAAA,IACjB,KAAO,EAAA,SAAA;AAAA,IACP,OAAS,EAAA,CAAA;AAAA,IACT,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,SAAW,EAAA;AAAA,IACT,eAAA,EAAiB,aAAa,KAAM,CAAA,OAAA;AAAA,IACpC,WAAa,EAAA,CAAA;AAAA,IACb,WAAA,EAAa,aAAa,KAAM,CAAA,MAAA;AAAA,IAChC,YAAc,EAAA,EAAA;AAAA,IACd,OAAS,EAAA,EAAA;AAAA,IACT,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,OAAS,EAAA;AAAA,GACX;AAAA,EACA,eAAiB,EAAA;AAAA,IACf,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,eAAiB,EAAA;AAAA,IACf,SAAW,EAAA,EAAA;AAAA,IACX,aAAe,EAAA,KAAA;AAAA,IACf,cAAgB,EAAA,UAAA;AAAA,IAChB,GAAK,EAAA;AAAA,GACP;AAAA,EACA,iBAAmB,EAAA;AAAA,IACjB,SAAW,EAAA,EAAA;AAAA,IACX,eAAiB,EAAA,CAAA;AAAA,IACjB,iBAAmB,EAAA,EAAA;AAAA,IACnB,YAAc,EAAA,EAAA;AAAA,IACd,eAAA,EAAiB,aAAa,KAAM,CAAA,YAAA;AAAA,IACpC,WAAa,EAAA,CAAA;AAAA,IACb,WAAA,EAAa,aAAa,KAAM,CAAA,MAAA;AAAA,IAChC,cAAgB,EAAA;AAAA;AAEpB,CAAC,CAAA;AACD,MAAM,cAAiB,GAAA;AAAA,EACrB,MAAM,MAAO,CAAA,YAAA;AAAA,EACb,UAAU,MAAO,CAAA,gBAAA;AAAA,EACjB,UAAU,MAAO,CAAA,gBAAA;AAAA,EACjB,UAAU,MAAO,CAAA,gBAAA;AAAA,EACjB,aAAa,MAAO,CAAA,YAAA;AAAA,EACpB,cAAc,MAAO,CAAA,YAAA;AAAA,EACrB,WAAW,MAAO,CAAA,gBAAA;AAAA,EAClB,MAAM,MAAO,CAAA,YAAA;AAAA,EACb,WAAW,MAAO,CAAA,iBAAA;AAAA,EAClB,YAAY,MAAO,CAAA,kBAAA;AAAA,EACnB,aAAa,MAAO,CAAA,kBAAA;AAAA,EACpB,YAAY,MAAO,CAAA;AACrB,CAAA"}
|
|
1
|
+
{"version":3,"file":"DeepSearchModal.js","sources":["../../../../src/screens/Home/components/DeepSearchModal.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef } from 'react';\nimport {\n ActivityIndicator,\n Modal,\n Pressable,\n ScrollView,\n Share,\n StyleSheet,\n View,\n useWindowDimensions,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport Markdown from 'react-native-markdown-display';\nimport { Linking } from 'react-native';\nimport type { DeepSearchSourceItem } from '../deepSearchUtils';\nimport { mobileTokens } from '../../../theme/mobileTokens';\n\ninterface DeepSearchModalProps {\n visible: boolean;\n query: string | null;\n summaryText: string;\n sources: DeepSearchSourceItem[];\n isStreaming: boolean;\n researchProcessOpen: boolean;\n sourcesAccordionOpen: boolean;\n onToggleResearchProcess: () => void;\n onToggleSourcesAccordion: () => void;\n onRetry: () => void;\n onStop: () => void;\n onClose: () => void;\n}\n\nexport default function DeepSearchModal({\n visible,\n query,\n summaryText,\n sources,\n isStreaming,\n researchProcessOpen,\n sourcesAccordionOpen,\n onToggleResearchProcess,\n onToggleSourcesAccordion,\n onRetry,\n onStop,\n onClose,\n}: DeepSearchModalProps) {\n const { width: screenWidth } = useWindowDimensions();\n const modalScrollRef = useRef<ScrollView | null>(null);\n\n const displayMarkdown = useMemo(() => {\n if (!summaryText) return '';\n const hasResearchHeading = /research summary\\s*:/i.test(summaryText);\n if (hasResearchHeading) return summaryText;\n const heading = query ? `## Research Summary: ${query}` : '## Research Summary';\n return `${heading}\\n\\n${summaryText}`;\n }, [summaryText, query]);\n\n useEffect(() => {\n if (!visible) return;\n requestAnimationFrame(() => {\n modalScrollRef.current?.scrollToEnd({ animated: true });\n });\n }, [visible, displayMarkdown, sources.length, isStreaming]);\n\n const handleShare = async () => {\n if (!summaryText) return;\n try {\n await Share.share({\n message: `${summaryText}\\n\\nQuery: ${query ?? ''}`,\n });\n } catch (error) {\n console.error('[DeepSearchModal] Failed to share summary:', error);\n }\n };\n\n return (\n <Modal visible={visible} transparent animationType=\"fade\" onRequestClose={onClose}>\n <View style={styles.modalBackdrop}>\n <View style={[styles.modalCard, { width: Math.min(760, screenWidth - 24) }]}>\n <View style={styles.modalHeaderRow}>\n <View style={styles.modalHeaderLeft}>\n <Text fontSize=\"$md\" fontWeight=\"$semibold\" color=\"$gray900\">\n Deep Search\n </Text>\n {isStreaming ? (\n <Text fontSize=\"$xs\" color=\"$gray600\">\n Running...\n </Text>\n ) : null}\n </View>\n <Pressable onPress={onClose} style={styles.iconButton}>\n <MaterialCommunityIcons name=\"close\" size={18} color=\"#6b7280\" />\n </Pressable>\n </View>\n <ScrollView\n ref={modalScrollRef}\n style={styles.modalBody}\n contentContainerStyle={styles.modalBodyContent}\n nestedScrollEnabled\n keyboardShouldPersistTaps=\"handled\"\n showsVerticalScrollIndicator\n onContentSizeChange={() => {\n modalScrollRef.current?.scrollToEnd({ animated: true });\n }}\n >\n <View style={styles.summaryCard}>\n {(displayMarkdown || (isStreaming ? 'Researching...' : '')).length > 0 ? (\n isStreaming ? (\n <Text fontSize=\"$sm\" color=\"$gray700\">\n {displayMarkdown || 'Researching...'}\n </Text>\n ) : (\n <Markdown\n style={markdownStyles}\n onLinkPress={(url) => {\n void Linking.openURL(url);\n return true;\n }}\n >\n {displayMarkdown}\n </Markdown>\n )\n ) : (\n <Text fontSize=\"$sm\" color=\"$gray700\">\n No summary yet.\n </Text>\n )}\n <View style={styles.summaryActionRow}>\n <Pressable onPress={handleShare} style={styles.summaryActionButton}>\n <Text fontSize=\"$xs\" color=\"$gray900\">\n Share\n </Text>\n </Pressable>\n <Pressable\n onPress={onRetry}\n disabled={isStreaming || !query}\n style={({ pressed }) => [\n styles.summaryActionButton,\n (isStreaming || !query) && styles.summaryActionDisabled,\n pressed && styles.sourceRowPressed,\n ]}\n >\n <Text fontSize=\"$xs\" color=\"$gray900\">\n Retry\n </Text>\n </Pressable>\n </View>\n </View>\n\n <View style={styles.accordionCard}>\n <Pressable onPress={onToggleResearchProcess} style={styles.accordionHeader}>\n <Text fontSize=\"$sm\" color=\"$gray900\" fontWeight=\"$semibold\">\n Research Process\n </Text>\n <View style={styles.accordionHeaderRight}>\n <Text fontSize=\"$xs\" color=\"$gray600\">\n {query ? '1 query' : '0 query'}\n </Text>\n <MaterialCommunityIcons\n name={researchProcessOpen ? 'chevron-up' : 'chevron-down'}\n size={16}\n color=\"#6b7280\"\n />\n </View>\n </Pressable>\n {researchProcessOpen && (\n <View style={styles.accordionBody}>\n {query ? (\n <View style={styles.processItem}>\n <View\n style={[\n styles.processDot,\n { backgroundColor: isStreaming ? '#f59e0b' : '#22c55e' },\n ]}\n />\n <View style={{ flex: 1 }}>\n <Text fontSize=\"$sm\" color=\"$gray900\" numberOfLines={2}>\n {query}\n </Text>\n <Text fontSize=\"$xs\" color=\"$gray600\">\n {isStreaming\n ? 'Running deep-search...'\n : `Completed with ${sources.length} sources`}\n </Text>\n </View>\n </View>\n ) : (\n <Text fontSize=\"$sm\" color=\"$gray600\">\n No query started yet.\n </Text>\n )}\n </View>\n )}\n </View>\n\n <View style={styles.accordionCard}>\n <Pressable onPress={onToggleSourcesAccordion} style={styles.accordionHeader}>\n <Text fontSize=\"$sm\" color=\"$gray900\" fontWeight=\"$semibold\">\n Sources\n </Text>\n <View style={styles.accordionHeaderRight}>\n <Text fontSize=\"$xs\" color=\"$gray600\">\n {sources.length} sources\n </Text>\n <MaterialCommunityIcons\n name={sourcesAccordionOpen ? 'chevron-up' : 'chevron-down'}\n size={16}\n color=\"#6b7280\"\n />\n </View>\n </Pressable>\n {sourcesAccordionOpen && (\n <View style={styles.accordionBody}>\n {sources.length > 0 ? (\n sources.map((item, index) => (\n <Pressable\n key={`${item.url ?? item.title}-${index}`}\n onPress={() => {\n if (item.url) {\n void Linking.openURL(item.url);\n }\n }}\n disabled={!item.url}\n style={({ pressed }) => [\n styles.sourceRow,\n !item.url && styles.sourceRowNoLink,\n pressed && item.url ? styles.sourceRowPressed : undefined,\n ]}\n >\n <Text fontSize=\"$xs\" color=\"$green800\" mb=\"$1\" fontWeight=\"$semibold\">\n {index + 1}. {item.title || 'Source'}\n </Text>\n {item.url ? (\n <Text fontSize=\"$xs\" color=\"$gray700\" numberOfLines={1}>\n {item.url}\n </Text>\n ) : (\n <Text fontSize=\"$xs\" color=\"$gray500\" numberOfLines={1}>\n Source title detected from summary\n </Text>\n )}\n </Pressable>\n ))\n ) : (\n <Text fontSize=\"$sm\" color=\"$gray700\">\n {isStreaming\n ? 'Collecting sources...'\n : 'No source links detected in the response.'}\n </Text>\n )}\n </View>\n )}\n </View>\n </ScrollView>\n <View style={styles.modalActionsRow}>\n {isStreaming ? (\n <Pressable onPress={onStop} style={styles.modalActionButton}>\n <Text fontSize=\"$sm\" color=\"$gray900\">\n Stop\n </Text>\n </Pressable>\n ) : null}\n <Pressable onPress={onClose} style={styles.modalActionButton}>\n <Text fontSize=\"$sm\" color=\"$gray900\">\n Close\n </Text>\n </Pressable>\n </View>\n </View>\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n modalBackdrop: {\n flex: 1,\n backgroundColor: 'rgba(15, 23, 42, 0.45)',\n justifyContent: 'center',\n padding: 16,\n },\n modalCard: {\n maxHeight: '88%',\n backgroundColor: mobileTokens.color.surface,\n borderRadius: 18,\n padding: 16,\n width: '100%',\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n },\n modalHeaderRow: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 10,\n paddingBottom: 10,\n borderBottomWidth: 1,\n borderBottomColor: mobileTokens.color.border,\n },\n modalHeaderLeft: {\n flexDirection: 'column',\n },\n iconButton: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: mobileTokens.color.surfaceMuted,\n },\n modalBody: {\n flexGrow: 1,\n minHeight: 140,\n marginBottom: 10,\n },\n modalBodyContent: {\n paddingBottom: 8,\n },\n summaryCard: {\n backgroundColor: mobileTokens.color.surfaceMuted,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n borderRadius: 14,\n padding: 12,\n marginBottom: 10,\n },\n summaryActionRow: {\n marginTop: 8,\n borderTopWidth: 1,\n borderTopColor: '#e5e7eb',\n paddingTop: 8,\n flexDirection: 'row',\n justifyContent: 'flex-start',\n gap: 8,\n },\n summaryActionButton: {\n paddingVertical: 6,\n paddingHorizontal: 12,\n borderRadius: 10,\n backgroundColor: mobileTokens.color.surface,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n },\n summaryActionDisabled: {\n opacity: 0.5,\n },\n accordionCard: {\n backgroundColor: mobileTokens.color.surface,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n borderRadius: 12,\n marginBottom: 10,\n overflow: 'hidden',\n },\n accordionHeader: {\n paddingHorizontal: 10,\n paddingVertical: 10,\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n accordionHeaderRight: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n },\n accordionBody: {\n borderTopWidth: 1,\n borderTopColor: '#e5e7eb',\n padding: 10,\n },\n processItem: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n gap: 8,\n },\n processDot: {\n marginTop: 6,\n width: 8,\n height: 8,\n borderRadius: 4,\n },\n markdownBody: {\n color: '#111827',\n fontSize: 14,\n lineHeight: 20,\n },\n markdownHeading1: {\n color: '#111827',\n fontSize: 18,\n marginTop: 6,\n marginBottom: 6,\n fontWeight: '700',\n },\n markdownHeading2: {\n color: '#111827',\n fontSize: 16,\n marginTop: 6,\n marginBottom: 6,\n fontWeight: '700',\n },\n markdownHeading3: {\n color: '#111827',\n fontSize: 15,\n marginTop: 6,\n marginBottom: 6,\n fontWeight: '700',\n },\n markdownParagraph: {\n color: '#111827',\n fontSize: 14,\n lineHeight: 20,\n marginTop: 2,\n marginBottom: 8,\n },\n markdownList: {\n marginTop: 2,\n marginBottom: 8,\n },\n markdownListItem: {\n color: '#111827',\n fontSize: 14,\n lineHeight: 20,\n },\n markdownLink: {\n color: '#166534',\n textDecorationLine: 'underline',\n },\n markdownBlockquote: {\n borderLeftColor: '#d1d5db',\n borderLeftWidth: 3,\n paddingLeft: 8,\n color: '#4b5563',\n },\n markdownInlineCode: {\n backgroundColor: '#f3f4f6',\n color: '#111827',\n paddingHorizontal: 4,\n borderRadius: 4,\n },\n markdownCodeBlock: {\n backgroundColor: '#f3f4f6',\n color: '#111827',\n padding: 8,\n borderRadius: 6,\n },\n sourceRow: {\n backgroundColor: mobileTokens.color.surface,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n borderRadius: 10,\n padding: 10,\n marginBottom: 6,\n },\n sourceRowPressed: {\n opacity: 0.7,\n },\n sourceRowNoLink: {\n backgroundColor: '#f3f4f6',\n },\n modalActionsRow: {\n marginTop: 12,\n flexDirection: 'row',\n justifyContent: 'flex-end',\n gap: 10,\n },\n modalActionButton: {\n minHeight: 38,\n paddingVertical: 8,\n paddingHorizontal: 16,\n borderRadius: 11,\n backgroundColor: mobileTokens.color.surfaceMuted,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n justifyContent: 'center',\n },\n});\n\nconst markdownStyles = {\n body: styles.markdownBody,\n heading1: styles.markdownHeading1,\n heading2: styles.markdownHeading2,\n heading3: styles.markdownHeading3,\n bullet_list: styles.markdownList,\n ordered_list: styles.markdownList,\n list_item: styles.markdownListItem,\n link: styles.markdownLink,\n paragraph: styles.markdownParagraph,\n blockquote: styles.markdownBlockquote,\n code_inline: styles.markdownInlineCode,\n code_block: styles.markdownCodeBlock,\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {useMemo,useEffect}from'react';import {config}from'../../../config/env-config.js';import'../../../bridge/WebViewManager.js';import'react-native';import'@react-native-async-storage/async-storage';import'expo-secure-store';import'@react-navigation/native';import {getPackagerHost,resolveMobileWebUrl}from'../../../bridge/resolveMobileWebUrl.js';import {useObtainSystemToken}from'../../../hooks/useObtainSystemToken.js';import {warmWebBuilderSession}from'../../WebBuilder/webbuilderWarmCache.js';function WebBuilderPrewarm({
|
|
2
2
|
enabled,
|
|
3
3
|
orgName,
|
|
4
4
|
projectId,
|
|
@@ -9,22 +9,13 @@ import {jsx}from'react/jsx-runtime';import {useMemo,useState,useEffect}from'reac
|
|
|
9
9
|
} = useObtainSystemToken(enabled);
|
|
10
10
|
const packagerHost = getPackagerHost();
|
|
11
11
|
const graphqlUrl = useMemo(() => resolveMobileWebUrl(config.GRAPHQL_URL, packagerHost), [packagerHost]);
|
|
12
|
-
const surfaceBase = useMemo(() => resolveMobileWebUrl(config.WEB_BUILDER_URL, packagerHost), [packagerHost]);
|
|
13
|
-
const [token, setToken] = useState(() => {
|
|
14
|
-
var _a, _b;
|
|
15
|
-
return (_b = (_a = getWarmWebBuilderSession(graphqlUrl)) == null ? void 0 : _a.token) != null ? _b : null;
|
|
16
|
-
});
|
|
17
|
-
const [backend, setBackend] = useState(() => {
|
|
18
|
-
var _a, _b;
|
|
19
|
-
return (_b = (_a = getWarmWebBuilderSession(graphqlUrl)) == null ? void 0 : _a.backend) != null ? _b : null;
|
|
20
|
-
});
|
|
21
12
|
useEffect(() => {
|
|
22
13
|
if (!enabled) return;
|
|
23
14
|
if (!orgName || !projectId) return;
|
|
24
15
|
let cancelled = false;
|
|
25
16
|
(async () => {
|
|
26
17
|
try {
|
|
27
|
-
|
|
18
|
+
await warmWebBuilderSession({
|
|
28
19
|
graphqlUrl,
|
|
29
20
|
orgName,
|
|
30
21
|
projectId,
|
|
@@ -32,8 +23,6 @@ import {jsx}from'react/jsx-runtime';import {useMemo,useState,useEffect}from'reac
|
|
|
32
23
|
obtainSystemToken
|
|
33
24
|
});
|
|
34
25
|
if (cancelled) return;
|
|
35
|
-
setToken(session.token);
|
|
36
|
-
setBackend(session.backend);
|
|
37
26
|
if (__DEV__) {
|
|
38
27
|
console.log("[WebBuilderPrewarm] session ready");
|
|
39
28
|
}
|
|
@@ -47,37 +36,5 @@ import {jsx}from'react/jsx-runtime';import {useMemo,useState,useEffect}from'reac
|
|
|
47
36
|
cancelled = true;
|
|
48
37
|
};
|
|
49
38
|
}, [enabled, graphqlUrl, obtainSystemToken, orgName, projectId, tagId]);
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const base = webbuilderPreloadUrl(surfaceBase);
|
|
53
|
-
return appendSurfaceAuthParams(base, token, "mobile-webview-prewarm");
|
|
54
|
-
}, [backend, surfaceBase, token]);
|
|
55
|
-
const injected = useMemo(() => {
|
|
56
|
-
if (!token || !backend) return WEB_BRIDGE_BOOTSTRAP;
|
|
57
|
-
return `${buildCdecliTokenInjection(token, backend, "mobile-webview-prewarm")}
|
|
58
|
-
${WEB_BRIDGE_BOOTSTRAP}`;
|
|
59
|
-
}, [backend, token]);
|
|
60
|
-
if (!enabled || !preloadUri) return null;
|
|
61
|
-
return /* @__PURE__ */ jsx(View, { style: styles.host, pointerEvents: "none", collapsable: false, children: /* @__PURE__ */ jsx(WebView, { source: {
|
|
62
|
-
uri: preloadUri
|
|
63
|
-
}, style: styles.webview, injectedJavaScriptBeforeContentLoaded: injected, javaScriptEnabled: true, domStorageEnabled: true, sharedCookiesEnabled: true, thirdPartyCookiesEnabled: true, originWhitelist: ["*"], onError: () => {
|
|
64
|
-
}, onHttpError: () => {
|
|
65
|
-
} }) });
|
|
66
|
-
}
|
|
67
|
-
const styles = StyleSheet.create({
|
|
68
|
-
host: {
|
|
69
|
-
position: "absolute",
|
|
70
|
-
width: 1,
|
|
71
|
-
height: 1,
|
|
72
|
-
opacity: 0,
|
|
73
|
-
overflow: "hidden",
|
|
74
|
-
left: 0,
|
|
75
|
-
top: 0,
|
|
76
|
-
zIndex: -1
|
|
77
|
-
},
|
|
78
|
-
webview: {
|
|
79
|
-
width: 1,
|
|
80
|
-
height: 1,
|
|
81
|
-
opacity: 0
|
|
82
|
-
}
|
|
83
|
-
});export{WebBuilderPrewarm};//# sourceMappingURL=WebBuilderPrewarm.js.map
|
|
39
|
+
return null;
|
|
40
|
+
}export{WebBuilderPrewarm};//# sourceMappingURL=WebBuilderPrewarm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebBuilderPrewarm.js","sources":["../../../../src/screens/Home/components/WebBuilderPrewarm.tsx"],"sourcesContent":["/**\n *
|
|
1
|
+
{"version":3,"file":"WebBuilderPrewarm.js","sources":["../../../../src/screens/Home/components/WebBuilderPrewarm.tsx"],"sourcesContent":["/**\n * Warm the Web Builder system JWT while the user is in Build mode on Home.\n * Token mint is enough for a fast handoff. A hidden 1×1 WKWebView under\n * Fabric has crashed Expo Go in Scheduler::uiManagerDidFinishTransaction.\n *\n * Receives org/project from Home (do NOT call usePrerequisiteIds here — a second\n * instance can steal the project bootstrap and leave Home without projectId).\n */\nimport React, { useEffect, useMemo } from 'react';\nimport { config } from '../../../config/env-config';\nimport { getPackagerHost, resolveMobileWebUrl } from '../../../bridge';\nimport { useObtainSystemToken } from '../../../hooks/useObtainSystemToken';\nimport { warmWebBuilderSession } from '../../WebBuilder/webbuilderWarmCache';\n\ntype Props = {\n /** Only warm while Build mode is active. */\n enabled: boolean;\n orgName?: string | null;\n projectId?: string | null;\n tagId?: string | null;\n};\n\nexport function WebBuilderPrewarm({ enabled, orgName, projectId, tagId }: Props): null {\n const { obtainSystemToken } = useObtainSystemToken(enabled);\n const packagerHost = getPackagerHost();\n const graphqlUrl = useMemo(() => resolveMobileWebUrl(config.GRAPHQL_URL, packagerHost), [packagerHost]);\n\n useEffect(() => {\n if (!enabled) return;\n if (!orgName || !projectId) return;\n\n let cancelled = false;\n (async () => {\n try {\n await warmWebBuilderSession({\n graphqlUrl,\n orgName,\n projectId,\n tagId,\n obtainSystemToken,\n });\n if (cancelled) return;\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.log('[WebBuilderPrewarm] session ready');\n }\n } catch (err) {\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[WebBuilderPrewarm] warm failed:', err);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [enabled, graphqlUrl, obtainSystemToken, orgName, projectId, tagId]);\n\n return null;\n}\n"],"names":[],"mappings":"ofAoBO,SAAS,iBAAkB,CAAA;AAAA,EAChC,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAgB,EAAA;AACd,EAAM,MAAA;AAAA,IACJ;AAAA,GACF,GAAI,qBAAqB,OAAO,CAAA;AAChC,EAAA,MAAM,eAAe,eAAgB,EAAA;AACrC,EAAM,MAAA,UAAA,GAAa,OAAQ,CAAA,MAAM,mBAAoB,CAAA,MAAA,CAAO,aAAa,YAAY,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AACtG,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAS,EAAA;AACd,IAAI,IAAA,CAAC,OAAW,IAAA,CAAC,SAAW,EAAA;AAC5B,IAAA,IAAI,SAAY,GAAA,KAAA;AAChB,IAAA,CAAC,YAAY;AACX,MAAI,IAAA;AACF,QAAA,MAAM,qBAAsB,CAAA;AAAA,UAC1B,UAAA;AAAA,UACA,OAAA;AAAA,UACA,SAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,IAAI,SAAW,EAAA;AACf,QAAA,IAAI,OAAS,EAAA;AAEX,UAAA,OAAA,CAAQ,IAAI,mCAAmC,CAAA;AAAA;AACjD,eACO,GAAK,EAAA;AACZ,QAAA,IAAI,OAAS,EAAA;AAEX,UAAQ,OAAA,CAAA,IAAA,CAAK,oCAAoC,GAAG,CAAA;AAAA;AACtD;AACF,KACC,GAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAY,SAAA,GAAA,IAAA;AAAA,KACd;AAAA,GACF,EAAG,CAAC,OAAS,EAAA,UAAA,EAAY,mBAAmB,OAAS,EAAA,SAAA,EAAW,KAAK,CAAC,CAAA;AACtE,EAAO,OAAA,IAAA;AACT"}
|
|
@@ -81,18 +81,4 @@ async function warmWebBuilderSession(input) {
|
|
|
81
81
|
promise
|
|
82
82
|
};
|
|
83
83
|
return promise;
|
|
84
|
-
}
|
|
85
|
-
function webbuilderPreloadUrl(surfaceBase) {
|
|
86
|
-
const raw = (surfaceBase || "").trim() || "http://localhost:5174/";
|
|
87
|
-
try {
|
|
88
|
-
const url = new URL(raw);
|
|
89
|
-
url.searchParams.set("embed", "mobile");
|
|
90
|
-
for (const key of ["message", "snapshotId", "channelId", "projectId", "templateId", "templateTitle", "seedTemplate", "token", "code", "state"]) {
|
|
91
|
-
url.searchParams.delete(key);
|
|
92
|
-
}
|
|
93
|
-
return url.toString();
|
|
94
|
-
} catch (e) {
|
|
95
|
-
const sep = raw.includes("?") ? "&" : "?";
|
|
96
|
-
return `${raw}${sep}embed=mobile`;
|
|
97
|
-
}
|
|
98
|
-
}export{clearWarmWebBuilderSession,getWarmWebBuilderSession,setWarmWebBuilderSession,warmWebBuilderSession,webbuilderPreloadUrl};//# sourceMappingURL=webbuilderWarmCache.js.map
|
|
84
|
+
}export{clearWarmWebBuilderSession,getWarmWebBuilderSession,setWarmWebBuilderSession,warmWebBuilderSession};//# sourceMappingURL=webbuilderWarmCache.js.map
|