@adminide-stack/yantra-mobile 12.0.69-alpha.10 → 12.0.69-alpha.12
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/features/agent-chat/NativeAgentChat.js +2 -0
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/chat/ChatCodeBlock.js +7 -3
- package/lib/features/chat/ChatCodeBlock.js.map +1 -1
- package/lib/features/chat/ConnectorConnectCard.js +164 -0
- package/lib/features/chat/ConnectorConnectCard.js.map +1 -0
- package/lib/features/chat/ConnectorConnectPrompt.js +254 -0
- package/lib/features/chat/ConnectorConnectPrompt.js.map +1 -0
- package/lib/features/chat/MessageActionBar.js.map +1 -1
- package/lib/features/chat/connectorConnect.js +194 -0
- package/lib/features/chat/connectorConnect.js.map +1 -0
- package/lib/features/chat/connectorConnectHandbacks.js +55 -0
- package/lib/features/chat/connectorConnectHandbacks.js.map +1 -0
- package/lib/hooks/useCdecliChannel.js +2 -2
- package/lib/hooks/useCdecliChannel.js.map +1 -1
- package/lib/hooks/useChatApi.js +4 -2
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useHostConnectorCard.js +24 -0
- package/lib/hooks/useHostConnectorCard.js.map +1 -0
- package/lib/screens/Chat/index.js +12 -2
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js +12 -6
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
- package/lib/screens/ResumeNative/useResumeHostChat.js +12 -6
- package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
- package/lib/screens/ShoppingNative/useShoppingHostChat.js +12 -6
- package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
- package/lib/screens/TravelNative/useTravelHostChat.js +12 -6
- package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
- package/lib/services/brainQuickReply.js.map +1 -1
- package/package.json +5 -4
|
@@ -20,6 +20,7 @@ function NativeAgentChat({
|
|
|
20
20
|
onClose,
|
|
21
21
|
messages,
|
|
22
22
|
onSend,
|
|
23
|
+
renderConnectorCard,
|
|
23
24
|
onClear,
|
|
24
25
|
busy = false,
|
|
25
26
|
streamingContent = null,
|
|
@@ -183,6 +184,7 @@ ${prev}` : composerSeed);
|
|
|
183
184
|
paddingBottom: Math.max(insets.bottom, 10)
|
|
184
185
|
}], children: [
|
|
185
186
|
composerLead,
|
|
187
|
+
renderConnectorCard == null ? void 0 : renderConnectorCard(isDark),
|
|
186
188
|
banner ? /* @__PURE__ */ jsx(View, { style: [styles.errorBanner, {
|
|
187
189
|
backgroundColor: isDark ? "#2b1a1d" : "#fef2f2"
|
|
188
190
|
}], children: /* @__PURE__ */ jsx(Text, { style: styles.errorText, children: banner }) }) : null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeAgentChat.js","sources":["../../../src/features/agent-chat/NativeAgentChat.tsx"],"sourcesContent":["/**\n * Reusable native Agent panel (header + transcript + composer).\n * Composer matches web Shopping Agent: text + mic/send on the first row,\n * image + paperclip under the field. Surface cards (`beforeComposer`) scroll\n * with the thread as the list footer.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n InteractionManager,\n Keyboard,\n KeyboardAvoidingView,\n PanResponder,\n Platform,\n Pressable,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n View,\n} from 'react-native';\nimport { dismissKeyboard } from '../../utils/keyboardController';\nimport { Feather, MaterialCommunityIcons } from '@expo/vector-icons';\nimport { useSafeInsets } from '../canvas/withRemoteSafeArea';\nimport type { NativeAgentChatProps } from './types';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport { useImageAttachments } from '../attachments/useImageAttachments';\nimport { ComposerAttachmentBar } from '../attachments/ComposerAttachmentBar';\nimport { NativeDictationBar } from '../audio-input/NativeDictationBar';\nimport { AudioRecorderPanel } from '../audio-input/AudioRecorderPanel';\nimport { MicErrorBoundary } from '../audio-input/MicErrorBoundary';\nimport { isNativeDictationAvailable } from '../audio-input/nativeDictation';\nimport { requestMicPermission } from '../audio-input/useAudioPermission';\nimport { ChatTranscript } from '../chat/ChatTranscript';\nimport ThinkingIndicator from '../../components/ThinkingIndicator';\n\nexport function NativeAgentChat({\n title,\n visible,\n onClose,\n messages,\n onSend,\n onClear,\n busy = false,\n streamingContent = null,\n error = null,\n placeholder = 'Ask anything…',\n emptyTitle,\n emptyBody,\n suggestions = [],\n beforeComposer,\n composerAccessory,\n paneOverlay,\n headerTrailing,\n belowHeader,\n composerLead,\n draft: draftProp,\n onDraftChange,\n composerSeed,\n composerSeedKey,\n onComposerSeedConsumed,\n embedded = false,\n onSwipeLeft,\n enableVoice = true,\n enableAttachments = true,\n isDark = false,\n ink = '#0f172a',\n muted = '#64748b',\n screen = '#f8fafc',\n border = '#e8ecf1',\n}: NativeAgentChatProps) {\n const insets = useSafeInsets();\n const draftControlled = onDraftChange !== undefined;\n const [internalDraft, setInternalDraft] = useState('');\n const draft = draftControlled ? (draftProp ?? '') : internalDraft;\n const draftRef = useRef(draft);\n draftRef.current = draft;\n const setDraft = (next: string | ((prev: string) => string)) => {\n const value = typeof next === 'function' ? next(draftRef.current) : next;\n if (draftControlled) onDraftChange?.(value);\n else setInternalDraft(value);\n };\n useEffect(() => {\n if (composerSeed == null) return;\n setDraft((prev) => (prev.trim() ? `${composerSeed}\\n\\n${prev}` : composerSeed));\n onComposerSeedConsumed?.();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [composerSeed, composerSeedKey]);\n const attachments = useImageAttachments();\n const [showNativeDictation, setShowNativeDictation] = useState(false);\n const [showAudioRecorder, setShowAudioRecorder] = useState(false);\n const [voiceError, setVoiceError] = useState<string | null>(null);\n\n const canSend = draft.trim().length > 0 || attachments.pending.length > 0;\n const listening = showNativeDictation || showAudioRecorder;\n\n const submit = (text = draft, files?: MessageAttachment[]) => {\n const trimmed = text.trim();\n const pending = files ?? attachments.forSend();\n if (!trimmed && !pending?.length) return;\n setDraft('');\n attachments.clear();\n onSend(trimmed, pending);\n };\n\n const openWhisperRecorder = useCallback(() => {\n setVoiceError(null);\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 }, []);\n\n const handleMicPress = useCallback(() => {\n if (listening) {\n setShowNativeDictation(false);\n setShowAudioRecorder(false);\n return;\n }\n setVoiceError(null);\n Keyboard.dismiss();\n if (isNativeDictationAvailable()) {\n setShowNativeDictation(true);\n return;\n }\n openWhisperRecorder();\n }, [listening, openWhisperRecorder]);\n\n const pasteTranscript = useCallback((text: string) => {\n const cleaned = (text ?? '').trim();\n if (!cleaned) return;\n setDraft((prev) => (prev.trim() ? `${prev.trim()} ${cleaned}` : cleaned));\n }, []);\n\n const openPicker = useCallback((fn: () => Promise<void>) => {\n Keyboard.dismiss();\n InteractionManager.runAfterInteractions(() => {\n setTimeout(() => {\n void fn();\n }, 350);\n });\n }, []);\n\n const banner = voiceError || attachments.error || error;\n\n const swipeAway = useMemo(() => {\n if (!onSwipeLeft) return null;\n return PanResponder.create({\n onMoveShouldSetPanResponder: (_e, g) => g.dx > 10 && Math.abs(g.dx) > Math.abs(g.dy),\n onPanResponderRelease: (_e, g) => {\n if (g.dx >= 48 && Math.abs(g.dx) > Math.abs(g.dy) * 1.15) onSwipeLeft();\n },\n });\n }, [onSwipeLeft]);\n\n if (!visible) return null;\n\n return (\n <View style={[StyleSheet.absoluteFill, styles.overlay, { backgroundColor: screen }]} pointerEvents=\"auto\">\n {swipeAway ? <View style={styles.dismissSwipeEdge} {...swipeAway.panHandlers} /> : null}\n <KeyboardAvoidingView\n style={[styles.fill, { backgroundColor: screen, paddingTop: embedded ? 8 : Math.max(insets.top, 8) }]}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <View style={[styles.head, { borderColor: border }]}>\n <View style={styles.headTitle}>\n <MaterialCommunityIcons name=\"creation\" size={16} color={ink} />\n <Text style={[styles.title, { color: ink }]}>{title}</Text>\n </View>\n <View style={styles.headActions}>\n {onClear && (messages.length > 0 || Boolean(streamingContent?.trim())) ? (\n <Pressable\n onPress={onClear}\n hitSlop={10}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Clear chat\"\n >\n <Feather name=\"trash-2\" size={18} color={muted} />\n </Pressable>\n ) : null}\n {headerTrailing}\n <Pressable onPress={onClose} hitSlop={10} accessibilityLabel={`Close ${title}`}>\n <MaterialCommunityIcons name=\"close\" size={22} color={muted} />\n </Pressable>\n </View>\n </View>\n {belowHeader}\n\n {messages.length === 0 && !streamingContent ? (\n <ScrollView\n style={styles.fill}\n contentContainerStyle={styles.emptyScroll}\n keyboardShouldPersistTaps=\"handled\"\n keyboardDismissMode={Platform.OS === 'ios' ? 'interactive' : 'on-drag'}\n showsVerticalScrollIndicator={false}\n >\n <Pressable style={styles.empty} onPress={dismissKeyboard} accessible={false}>\n {emptyTitle ? <Text style={[styles.emptyTitle, { color: ink }]}>{emptyTitle}</Text> : null}\n {emptyBody ? <Text style={[styles.emptyBody, { color: muted }]}>{emptyBody}</Text> : null}\n {suggestions.length > 0 ? (\n <View style={styles.chips}>\n {suggestions.map((chip) => (\n <Pressable\n key={chip.id}\n onPress={() => {\n dismissKeyboard();\n submit(chip.prompt ?? chip.label);\n }}\n style={[\n styles.chip,\n {\n borderColor: border,\n backgroundColor: isDark ? '#1e293b' : '#fff',\n },\n ]}\n >\n <Text style={[styles.chipText, { color: ink }]}>{chip.label}</Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n </Pressable>\n </ScrollView>\n ) : (\n <View style={styles.fill}>\n <ChatTranscript\n messages={messages}\n streamingContent={streamingContent ?? undefined}\n isDark={isDark}\n listFooter={beforeComposer}\n />\n {busy && !streamingContent?.trim() ? (\n <View style={styles.thinking}>\n <ThinkingIndicator variant=\"awaiting\" color={muted} isDark={isDark} />\n </View>\n ) : null}\n </View>\n )}\n\n <View\n style={[styles.composerWrap, { borderColor: border, paddingBottom: Math.max(insets.bottom, 10) }]}\n >\n {composerLead}\n {banner ? (\n <View style={[styles.errorBanner, { backgroundColor: isDark ? '#2b1a1d' : '#fef2f2' }]}>\n <Text style={styles.errorText}>{banner}</Text>\n </View>\n ) : null}\n\n {showNativeDictation ? (\n <MicErrorBoundary\n onCancel={() => setShowNativeDictation(false)}\n onError={() => {\n setShowNativeDictation(false);\n openWhisperRecorder();\n }}\n >\n <NativeDictationBar\n isDark={isDark}\n onInterim={() => undefined}\n onTranscriptionComplete={(text) => {\n setShowNativeDictation(false);\n pasteTranscript(text);\n }}\n onCancel={() => setShowNativeDictation(false)}\n onFallback={() => {\n setShowNativeDictation(false);\n openWhisperRecorder();\n }}\n />\n </MicErrorBoundary>\n ) : showAudioRecorder ? (\n <MicErrorBoundary\n onCancel={() => setShowAudioRecorder(false)}\n onError={(err) => {\n setShowAudioRecorder(false);\n setVoiceError(err);\n }}\n >\n <AudioRecorderPanel\n isDark={isDark}\n onTranscriptionComplete={(text) => {\n setShowAudioRecorder(false);\n pasteTranscript(text);\n }}\n onCancel={() => setShowAudioRecorder(false)}\n onError={(err) => {\n setShowAudioRecorder(false);\n setVoiceError(err);\n }}\n />\n </MicErrorBoundary>\n ) : (\n <View\n style={[\n styles.composerCard,\n { borderColor: border, backgroundColor: isDark ? '#111827' : '#fff' },\n ]}\n >\n {enableAttachments ? (\n <ComposerAttachmentBar\n attachments={attachments.pending}\n onRemove={attachments.remove}\n isDark={isDark}\n />\n ) : null}\n <View style={styles.inputRow}>\n <TextInput\n value={draft}\n onChangeText={(next) => {\n setDraft(next);\n if (voiceError) setVoiceError(null);\n }}\n placeholder={listening ? 'Listening… speak your request' : placeholder}\n placeholderTextColor={muted}\n multiline\n textAlignVertical=\"top\"\n onSubmitEditing={() => submit()}\n style={[styles.input, { color: ink }]}\n accessibilityLabel={placeholder}\n />\n {enableVoice ? (\n <Pressable\n onPress={handleMicPress}\n style={[styles.mic, listening && styles.micLive]}\n accessibilityRole=\"button\"\n accessibilityLabel={listening ? 'Stop listening' : 'Start voice input'}\n >\n <Feather\n name={listening ? 'square' : 'mic'}\n size={16}\n color={listening ? '#b91c1c' : muted}\n />\n </Pressable>\n ) : null}\n {canSend ? (\n <Pressable\n onPress={() => submit()}\n style={[styles.send, busy && { opacity: 0.85 }]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Send\"\n >\n <Feather name=\"send\" size={14} color=\"#fff\" style={styles.sendIcon} />\n </Pressable>\n ) : null}\n </View>\n {enableAttachments || composerAccessory ? (\n <View style={styles.tools}>\n {enableAttachments ? (\n <>\n <Pressable\n onPress={() => openPicker(attachments.pickFromLibrary)}\n onLongPress={() => openPicker(attachments.captureFromCamera)}\n disabled={attachments.busy}\n style={styles.toolBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Add image or screenshot\"\n >\n {attachments.busyKind === 'library' ||\n attachments.busyKind === 'camera' ? (\n <ActivityIndicator size=\"small\" />\n ) : (\n <Feather name=\"image\" size={18} color={muted} />\n )}\n </Pressable>\n <Pressable\n onPress={() => openPicker(attachments.pickDocuments)}\n disabled={attachments.busy}\n style={styles.toolBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Attach files\"\n >\n {attachments.busyKind === 'documents' ? (\n <ActivityIndicator size=\"small\" />\n ) : (\n <Feather name=\"paperclip\" size={18} color={muted} />\n )}\n </Pressable>\n </>\n ) : null}\n {composerAccessory ? (\n <View style={styles.toolsAccessory}>{composerAccessory}</View>\n ) : null}\n </View>\n ) : null}\n </View>\n )}\n </View>\n </KeyboardAvoidingView>\n {paneOverlay}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: { zIndex: 200, elevation: 200 },\n dismissSwipeEdge: {\n position: 'absolute',\n top: 0,\n left: 0,\n bottom: 0,\n width: 40,\n zIndex: 220,\n },\n fill: { flex: 1, overflow: 'hidden' },\n head: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingBottom: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n headTitle: { flexDirection: 'row', alignItems: 'center', gap: 8 },\n headActions: { flexDirection: 'row', alignItems: 'center', gap: 12 },\n title: { fontSize: 16, fontWeight: '700' },\n emptyScroll: { flexGrow: 1 },\n empty: { flexGrow: 1, gap: 10, paddingTop: 20, paddingHorizontal: 16 },\n thinking: { paddingHorizontal: 16, paddingBottom: 8 },\n emptyTitle: { fontSize: 18, fontWeight: '700', letterSpacing: -0.3 },\n emptyBody: { fontSize: 14, lineHeight: 20 },\n chips: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, marginTop: 4 },\n chip: { borderWidth: 1, borderRadius: 999, paddingHorizontal: 12, paddingVertical: 8 },\n chipText: { fontSize: 13, fontWeight: '600' },\n composerWrap: { paddingHorizontal: 12, paddingTop: 8, gap: 8 },\n errorBanner: { borderRadius: 10, padding: 8 },\n errorText: { color: '#991b1b', fontSize: 12 },\n composerCard: {\n borderWidth: StyleSheet.hairlineWidth,\n borderRadius: 18,\n paddingHorizontal: 12,\n paddingTop: 10,\n paddingBottom: 8,\n gap: 4,\n overflow: 'visible',\n },\n inputRow: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: 4,\n minHeight: 44,\n },\n input: { flex: 1, fontSize: 15, maxHeight: 120, minHeight: 40, paddingVertical: 8, paddingHorizontal: 2 },\n tools: { flexDirection: 'row', alignItems: 'center', gap: 2, paddingTop: 2, overflow: 'visible' },\n toolsAccessory: { marginLeft: 'auto', flexShrink: 1 },\n mic: {\n width: 32,\n height: 32,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 2,\n },\n micLive: { backgroundColor: 'rgba(185,28,28,0.12)' },\n send: {\n width: 32,\n height: 32,\n borderRadius: 16,\n backgroundColor: '#ea580c',\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 2,\n },\n sendIcon: { transform: [{ rotate: '45deg' }] },\n toolBtn: {\n width: 36,\n height: 36,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n"],"names":["error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NativeAgentChat.js","sources":["../../../src/features/agent-chat/NativeAgentChat.tsx"],"sourcesContent":["/**\n * Reusable native Agent panel (header + transcript + composer).\n * Composer matches web Shopping Agent: text + mic/send on the first row,\n * image + paperclip under the field. Surface cards (`beforeComposer`) scroll\n * with the thread as the list footer.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n InteractionManager,\n Keyboard,\n KeyboardAvoidingView,\n PanResponder,\n Platform,\n Pressable,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n View,\n} from 'react-native';\nimport { dismissKeyboard } from '../../utils/keyboardController';\nimport { Feather, MaterialCommunityIcons } from '@expo/vector-icons';\nimport { useSafeInsets } from '../canvas/withRemoteSafeArea';\nimport type { NativeAgentChatProps } from './types';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport { useImageAttachments } from '../attachments/useImageAttachments';\nimport { ComposerAttachmentBar } from '../attachments/ComposerAttachmentBar';\nimport { NativeDictationBar } from '../audio-input/NativeDictationBar';\nimport { AudioRecorderPanel } from '../audio-input/AudioRecorderPanel';\nimport { MicErrorBoundary } from '../audio-input/MicErrorBoundary';\nimport { isNativeDictationAvailable } from '../audio-input/nativeDictation';\nimport { requestMicPermission } from '../audio-input/useAudioPermission';\nimport { ChatTranscript } from '../chat/ChatTranscript';\nimport ThinkingIndicator from '../../components/ThinkingIndicator';\n\nexport function NativeAgentChat({\n title,\n visible,\n onClose,\n messages,\n onSend,\n renderConnectorCard,\n onClear,\n busy = false,\n streamingContent = null,\n error = null,\n placeholder = 'Ask anything…',\n emptyTitle,\n emptyBody,\n suggestions = [],\n beforeComposer,\n composerAccessory,\n paneOverlay,\n headerTrailing,\n belowHeader,\n composerLead,\n draft: draftProp,\n onDraftChange,\n composerSeed,\n composerSeedKey,\n onComposerSeedConsumed,\n embedded = false,\n onSwipeLeft,\n enableVoice = true,\n enableAttachments = true,\n isDark = false,\n ink = '#0f172a',\n muted = '#64748b',\n screen = '#f8fafc',\n border = '#e8ecf1',\n}: NativeAgentChatProps) {\n const insets = useSafeInsets();\n const draftControlled = onDraftChange !== undefined;\n const [internalDraft, setInternalDraft] = useState('');\n const draft = draftControlled ? (draftProp ?? '') : internalDraft;\n const draftRef = useRef(draft);\n draftRef.current = draft;\n const setDraft = (next: string | ((prev: string) => string)) => {\n const value = typeof next === 'function' ? next(draftRef.current) : next;\n if (draftControlled) onDraftChange?.(value);\n else setInternalDraft(value);\n };\n useEffect(() => {\n if (composerSeed == null) return;\n setDraft((prev) => (prev.trim() ? `${composerSeed}\\n\\n${prev}` : composerSeed));\n onComposerSeedConsumed?.();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [composerSeed, composerSeedKey]);\n const attachments = useImageAttachments();\n const [showNativeDictation, setShowNativeDictation] = useState(false);\n const [showAudioRecorder, setShowAudioRecorder] = useState(false);\n const [voiceError, setVoiceError] = useState<string | null>(null);\n\n const canSend = draft.trim().length > 0 || attachments.pending.length > 0;\n const listening = showNativeDictation || showAudioRecorder;\n\n const submit = (text = draft, files?: MessageAttachment[]) => {\n const trimmed = text.trim();\n const pending = files ?? attachments.forSend();\n if (!trimmed && !pending?.length) return;\n setDraft('');\n attachments.clear();\n onSend(trimmed, pending);\n };\n\n const openWhisperRecorder = useCallback(() => {\n setVoiceError(null);\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 }, []);\n\n const handleMicPress = useCallback(() => {\n if (listening) {\n setShowNativeDictation(false);\n setShowAudioRecorder(false);\n return;\n }\n setVoiceError(null);\n Keyboard.dismiss();\n if (isNativeDictationAvailable()) {\n setShowNativeDictation(true);\n return;\n }\n openWhisperRecorder();\n }, [listening, openWhisperRecorder]);\n\n const pasteTranscript = useCallback((text: string) => {\n const cleaned = (text ?? '').trim();\n if (!cleaned) return;\n setDraft((prev) => (prev.trim() ? `${prev.trim()} ${cleaned}` : cleaned));\n }, []);\n\n const openPicker = useCallback((fn: () => Promise<void>) => {\n Keyboard.dismiss();\n InteractionManager.runAfterInteractions(() => {\n setTimeout(() => {\n void fn();\n }, 350);\n });\n }, []);\n\n const banner = voiceError || attachments.error || error;\n\n const swipeAway = useMemo(() => {\n if (!onSwipeLeft) return null;\n return PanResponder.create({\n onMoveShouldSetPanResponder: (_e, g) => g.dx > 10 && Math.abs(g.dx) > Math.abs(g.dy),\n onPanResponderRelease: (_e, g) => {\n if (g.dx >= 48 && Math.abs(g.dx) > Math.abs(g.dy) * 1.15) onSwipeLeft();\n },\n });\n }, [onSwipeLeft]);\n\n if (!visible) return null;\n\n return (\n <View style={[StyleSheet.absoluteFill, styles.overlay, { backgroundColor: screen }]} pointerEvents=\"auto\">\n {swipeAway ? <View style={styles.dismissSwipeEdge} {...swipeAway.panHandlers} /> : null}\n <KeyboardAvoidingView\n style={[styles.fill, { backgroundColor: screen, paddingTop: embedded ? 8 : Math.max(insets.top, 8) }]}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <View style={[styles.head, { borderColor: border }]}>\n <View style={styles.headTitle}>\n <MaterialCommunityIcons name=\"creation\" size={16} color={ink} />\n <Text style={[styles.title, { color: ink }]}>{title}</Text>\n </View>\n <View style={styles.headActions}>\n {onClear && (messages.length > 0 || Boolean(streamingContent?.trim())) ? (\n <Pressable\n onPress={onClear}\n hitSlop={10}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Clear chat\"\n >\n <Feather name=\"trash-2\" size={18} color={muted} />\n </Pressable>\n ) : null}\n {headerTrailing}\n <Pressable onPress={onClose} hitSlop={10} accessibilityLabel={`Close ${title}`}>\n <MaterialCommunityIcons name=\"close\" size={22} color={muted} />\n </Pressable>\n </View>\n </View>\n {belowHeader}\n\n {messages.length === 0 && !streamingContent ? (\n <ScrollView\n style={styles.fill}\n contentContainerStyle={styles.emptyScroll}\n keyboardShouldPersistTaps=\"handled\"\n keyboardDismissMode={Platform.OS === 'ios' ? 'interactive' : 'on-drag'}\n showsVerticalScrollIndicator={false}\n >\n <Pressable style={styles.empty} onPress={dismissKeyboard} accessible={false}>\n {emptyTitle ? <Text style={[styles.emptyTitle, { color: ink }]}>{emptyTitle}</Text> : null}\n {emptyBody ? <Text style={[styles.emptyBody, { color: muted }]}>{emptyBody}</Text> : null}\n {suggestions.length > 0 ? (\n <View style={styles.chips}>\n {suggestions.map((chip) => (\n <Pressable\n key={chip.id}\n onPress={() => {\n dismissKeyboard();\n submit(chip.prompt ?? chip.label);\n }}\n style={[\n styles.chip,\n {\n borderColor: border,\n backgroundColor: isDark ? '#1e293b' : '#fff',\n },\n ]}\n >\n <Text style={[styles.chipText, { color: ink }]}>{chip.label}</Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n </Pressable>\n </ScrollView>\n ) : (\n <View style={styles.fill}>\n <ChatTranscript\n messages={messages}\n streamingContent={streamingContent ?? undefined}\n isDark={isDark}\n listFooter={beforeComposer}\n />\n {busy && !streamingContent?.trim() ? (\n <View style={styles.thinking}>\n <ThinkingIndicator variant=\"awaiting\" color={muted} isDark={isDark} />\n </View>\n ) : null}\n </View>\n )}\n\n <View\n style={[styles.composerWrap, { borderColor: border, paddingBottom: Math.max(insets.bottom, 10) }]}\n >\n {composerLead}\n {renderConnectorCard?.(isDark)}\n {banner ? (\n <View style={[styles.errorBanner, { backgroundColor: isDark ? '#2b1a1d' : '#fef2f2' }]}>\n <Text style={styles.errorText}>{banner}</Text>\n </View>\n ) : null}\n\n {showNativeDictation ? (\n <MicErrorBoundary\n onCancel={() => setShowNativeDictation(false)}\n onError={() => {\n setShowNativeDictation(false);\n openWhisperRecorder();\n }}\n >\n <NativeDictationBar\n isDark={isDark}\n onInterim={() => undefined}\n onTranscriptionComplete={(text) => {\n setShowNativeDictation(false);\n pasteTranscript(text);\n }}\n onCancel={() => setShowNativeDictation(false)}\n onFallback={() => {\n setShowNativeDictation(false);\n openWhisperRecorder();\n }}\n />\n </MicErrorBoundary>\n ) : showAudioRecorder ? (\n <MicErrorBoundary\n onCancel={() => setShowAudioRecorder(false)}\n onError={(err) => {\n setShowAudioRecorder(false);\n setVoiceError(err);\n }}\n >\n <AudioRecorderPanel\n isDark={isDark}\n onTranscriptionComplete={(text) => {\n setShowAudioRecorder(false);\n pasteTranscript(text);\n }}\n onCancel={() => setShowAudioRecorder(false)}\n onError={(err) => {\n setShowAudioRecorder(false);\n setVoiceError(err);\n }}\n />\n </MicErrorBoundary>\n ) : (\n <View\n style={[\n styles.composerCard,\n { borderColor: border, backgroundColor: isDark ? '#111827' : '#fff' },\n ]}\n >\n {enableAttachments ? (\n <ComposerAttachmentBar\n attachments={attachments.pending}\n onRemove={attachments.remove}\n isDark={isDark}\n />\n ) : null}\n <View style={styles.inputRow}>\n <TextInput\n value={draft}\n onChangeText={(next) => {\n setDraft(next);\n if (voiceError) setVoiceError(null);\n }}\n placeholder={listening ? 'Listening… speak your request' : placeholder}\n placeholderTextColor={muted}\n multiline\n textAlignVertical=\"top\"\n onSubmitEditing={() => submit()}\n style={[styles.input, { color: ink }]}\n accessibilityLabel={placeholder}\n />\n {enableVoice ? (\n <Pressable\n onPress={handleMicPress}\n style={[styles.mic, listening && styles.micLive]}\n accessibilityRole=\"button\"\n accessibilityLabel={listening ? 'Stop listening' : 'Start voice input'}\n >\n <Feather\n name={listening ? 'square' : 'mic'}\n size={16}\n color={listening ? '#b91c1c' : muted}\n />\n </Pressable>\n ) : null}\n {canSend ? (\n <Pressable\n onPress={() => submit()}\n style={[styles.send, busy && { opacity: 0.85 }]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Send\"\n >\n <Feather name=\"send\" size={14} color=\"#fff\" style={styles.sendIcon} />\n </Pressable>\n ) : null}\n </View>\n {enableAttachments || composerAccessory ? (\n <View style={styles.tools}>\n {enableAttachments ? (\n <>\n <Pressable\n onPress={() => openPicker(attachments.pickFromLibrary)}\n onLongPress={() => openPicker(attachments.captureFromCamera)}\n disabled={attachments.busy}\n style={styles.toolBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Add image or screenshot\"\n >\n {attachments.busyKind === 'library' ||\n attachments.busyKind === 'camera' ? (\n <ActivityIndicator size=\"small\" />\n ) : (\n <Feather name=\"image\" size={18} color={muted} />\n )}\n </Pressable>\n <Pressable\n onPress={() => openPicker(attachments.pickDocuments)}\n disabled={attachments.busy}\n style={styles.toolBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Attach files\"\n >\n {attachments.busyKind === 'documents' ? (\n <ActivityIndicator size=\"small\" />\n ) : (\n <Feather name=\"paperclip\" size={18} color={muted} />\n )}\n </Pressable>\n </>\n ) : null}\n {composerAccessory ? (\n <View style={styles.toolsAccessory}>{composerAccessory}</View>\n ) : null}\n </View>\n ) : null}\n </View>\n )}\n </View>\n </KeyboardAvoidingView>\n {paneOverlay}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: { zIndex: 200, elevation: 200 },\n dismissSwipeEdge: {\n position: 'absolute',\n top: 0,\n left: 0,\n bottom: 0,\n width: 40,\n zIndex: 220,\n },\n fill: { flex: 1, overflow: 'hidden' },\n head: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingBottom: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n headTitle: { flexDirection: 'row', alignItems: 'center', gap: 8 },\n headActions: { flexDirection: 'row', alignItems: 'center', gap: 12 },\n title: { fontSize: 16, fontWeight: '700' },\n emptyScroll: { flexGrow: 1 },\n empty: { flexGrow: 1, gap: 10, paddingTop: 20, paddingHorizontal: 16 },\n thinking: { paddingHorizontal: 16, paddingBottom: 8 },\n emptyTitle: { fontSize: 18, fontWeight: '700', letterSpacing: -0.3 },\n emptyBody: { fontSize: 14, lineHeight: 20 },\n chips: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, marginTop: 4 },\n chip: { borderWidth: 1, borderRadius: 999, paddingHorizontal: 12, paddingVertical: 8 },\n chipText: { fontSize: 13, fontWeight: '600' },\n composerWrap: { paddingHorizontal: 12, paddingTop: 8, gap: 8 },\n errorBanner: { borderRadius: 10, padding: 8 },\n errorText: { color: '#991b1b', fontSize: 12 },\n composerCard: {\n borderWidth: StyleSheet.hairlineWidth,\n borderRadius: 18,\n paddingHorizontal: 12,\n paddingTop: 10,\n paddingBottom: 8,\n gap: 4,\n overflow: 'visible',\n },\n inputRow: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: 4,\n minHeight: 44,\n },\n input: { flex: 1, fontSize: 15, maxHeight: 120, minHeight: 40, paddingVertical: 8, paddingHorizontal: 2 },\n tools: { flexDirection: 'row', alignItems: 'center', gap: 2, paddingTop: 2, overflow: 'visible' },\n toolsAccessory: { marginLeft: 'auto', flexShrink: 1 },\n mic: {\n width: 32,\n height: 32,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 2,\n },\n micLive: { backgroundColor: 'rgba(185,28,28,0.12)' },\n send: {\n width: 32,\n height: 32,\n borderRadius: 16,\n backgroundColor: '#ea580c',\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 2,\n },\n sendIcon: { transform: [{ rotate: '45deg' }] },\n toolBtn: {\n width: 36,\n height: 36,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n"],"names":["error"],"mappings":"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"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import {jsxs,jsx}from'react/jsx-runtime';import {memo,useState,useRef,useEffect,useCallback}from'react';import {Clipboard,Share,View,StyleSheet,Pressable,Platform}from'react-native';import {Feather}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {memo,useState,useRef,useEffect,useCallback}from'react';import {Clipboard,Share,View,StyleSheet,Pressable,Platform}from'react-native';import {Feather}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';function snippetExtension(language) {
|
|
2
|
+
if (language === "jsx" || language === "tsx") return "tsx";
|
|
3
|
+
if (language === "js" || language === "ts") return "ts";
|
|
4
|
+
return "txt";
|
|
5
|
+
}
|
|
6
|
+
const ChatCodeBlock = memo(function ChatCodeBlock2({
|
|
2
7
|
language,
|
|
3
8
|
code,
|
|
4
9
|
isDark = false
|
|
@@ -17,10 +22,9 @@ import {jsxs,jsx}from'react/jsx-runtime';import {memo,useState,useRef,useEffect,
|
|
|
17
22
|
copiedTimer.current = setTimeout(() => setCopied(false), 2e3);
|
|
18
23
|
}, [body]);
|
|
19
24
|
const handleDownload = useCallback(() => {
|
|
20
|
-
const ext = language === "jsx" || language === "tsx" ? "tsx" : language === "js" || language === "ts" ? "ts" : "txt";
|
|
21
25
|
void Share.share({
|
|
22
26
|
message: body,
|
|
23
|
-
title: `snippet.${
|
|
27
|
+
title: `snippet.${snippetExtension(language)}`
|
|
24
28
|
});
|
|
25
29
|
}, [body, language]);
|
|
26
30
|
const border = isDark ? "rgba(148, 163, 184, 0.28)" : "#ebeef3";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatCodeBlock.js","sources":["../../../src/features/chat/ChatCodeBlock.tsx"],"sourcesContent":["import React, { memo, useCallback, useEffect, useRef, useState } from 'react';\
|
|
1
|
+
{"version":3,"file":"ChatCodeBlock.js","sources":["../../../src/features/chat/ChatCodeBlock.tsx"],"sourcesContent":["import React, { memo, useCallback, useEffect, useRef, useState } from 'react';\n// Clipboard is deprecated in React Native core but still works; MessageActionBar\n// explains why it is used instead of a community package.\nimport { Clipboard, Platform, Pressable, Share, StyleSheet, View } from 'react-native';\nimport { Feather } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\n\n/** The shared snippet's file extension: JS and TS snippets share as TypeScript. */\nfunction snippetExtension(language: string | undefined): string {\n if (language === 'jsx' || language === 'tsx') return 'tsx';\n if (language === 'js' || language === 'ts') return 'ts';\n return 'txt';\n}\n\n/**\n * Same chrome as web `CodeBlockWithActions` in tailwind-chat-pro: language\n * header, wrapping monospace body, copy + share/download. Long lines wrap\n * (browser `whitespace-pre-wrap`) instead of a nested horizontal ScrollView,\n * which collapsed the card to empty height inside the transcript list.\n */\nexport const ChatCodeBlock = memo(function ChatCodeBlock({\n language,\n code,\n isDark = false,\n}: {\n language?: string;\n code: string;\n isDark?: boolean;\n}) {\n const label = ((language || 'code').trim() || 'code').toUpperCase();\n const body = code.replace(/\\n$/, '');\n const [copied, setCopied] = useState(false);\n const copiedTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(\n () => () => {\n if (copiedTimer.current) clearTimeout(copiedTimer.current);\n },\n [],\n );\n\n const handleCopy = useCallback(() => {\n Clipboard.setString(body);\n setCopied(true);\n if (copiedTimer.current) clearTimeout(copiedTimer.current);\n copiedTimer.current = setTimeout(() => setCopied(false), 2000);\n }, [body]);\n\n const handleDownload = useCallback(() => {\n void Share.share({ message: body, title: `snippet.${snippetExtension(language)}` });\n }, [body, language]);\n\n const border = isDark ? 'rgba(148, 163, 184, 0.28)' : '#ebeef3';\n const headerBg = isDark ? 'rgba(148, 163, 184, 0.10)' : '#f6f7f8';\n const bodyBg = isDark ? '#171a20' : '#ffffff';\n const muted = isDark ? '#94a3b8' : '#667085';\n const ink = isDark ? '#f3f5f8' : '#121926';\n\n return (\n <View style={[styles.wrap, { borderColor: border, backgroundColor: bodyBg }]}>\n <View style={[styles.header, { backgroundColor: headerBg, borderBottomColor: border }]}>\n <Text style={[styles.lang, { color: muted }]}>{label}</Text>\n <Pressable\n onPress={handleCopy}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel={copied ? 'Copied' : 'Copy code'}\n >\n <Feather name={copied ? 'check' : 'copy'} size={14} color={copied ? '#10b981' : muted} />\n </Pressable>\n </View>\n <Text selectable style={[styles.code, { color: ink }]}>\n {body}\n </Text>\n <View style={styles.footer}>\n <Pressable\n onPress={handleCopy}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel={copied ? 'Copied' : 'Copy code'}\n style={styles.footerBtn}\n >\n <Feather name={copied ? 'check' : 'copy'} size={15} color={copied ? '#10b981' : muted} />\n </Pressable>\n <Pressable\n onPress={handleDownload}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Share code\"\n style={styles.footerBtn}\n >\n <Feather name=\"download\" size={15} color={muted} />\n </Pressable>\n </View>\n </View>\n );\n});\n\nconst styles = StyleSheet.create({\n wrap: {\n alignSelf: 'stretch',\n flexGrow: 0,\n borderWidth: 1,\n borderRadius: 14,\n overflow: 'hidden',\n marginVertical: 12,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderBottomWidth: 1,\n },\n lang: {\n fontSize: 10,\n fontWeight: '600',\n letterSpacing: 0.6,\n },\n code: {\n fontFamily: Platform.OS === 'ios' ? 'Menlo' : 'monospace',\n fontSize: 13,\n lineHeight: 20,\n paddingHorizontal: 16,\n paddingTop: 14,\n paddingBottom: 8,\n },\n footer: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 10,\n paddingBottom: 10,\n },\n footerBtn: {\n padding: 6,\n marginRight: 4,\n borderRadius: 6,\n },\n});\n"],"names":["ChatCodeBlock"],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {memo,useMemo}from'react';import {View,StyleSheet,Text,Pressable,ActivityIndicator}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';const ACCENT = "#2563eb";
|
|
2
|
+
const styles = StyleSheet.create({
|
|
3
|
+
card: {
|
|
4
|
+
width: "100%",
|
|
5
|
+
borderWidth: 1,
|
|
6
|
+
borderRadius: 16,
|
|
7
|
+
padding: 14,
|
|
8
|
+
marginTop: 4,
|
|
9
|
+
marginBottom: 8
|
|
10
|
+
},
|
|
11
|
+
row: {
|
|
12
|
+
flexDirection: "row",
|
|
13
|
+
alignItems: "flex-start",
|
|
14
|
+
gap: 12
|
|
15
|
+
},
|
|
16
|
+
icon: {
|
|
17
|
+
width: 36,
|
|
18
|
+
height: 36,
|
|
19
|
+
borderRadius: 10,
|
|
20
|
+
alignItems: "center",
|
|
21
|
+
justifyContent: "center"
|
|
22
|
+
},
|
|
23
|
+
body: {
|
|
24
|
+
flex: 1,
|
|
25
|
+
minWidth: 0
|
|
26
|
+
},
|
|
27
|
+
titleRow: {
|
|
28
|
+
flexDirection: "row",
|
|
29
|
+
alignItems: "center",
|
|
30
|
+
gap: 8
|
|
31
|
+
},
|
|
32
|
+
title: {
|
|
33
|
+
flexShrink: 1,
|
|
34
|
+
fontSize: 15,
|
|
35
|
+
fontWeight: "700",
|
|
36
|
+
lineHeight: 20
|
|
37
|
+
},
|
|
38
|
+
badge: {
|
|
39
|
+
borderRadius: 999,
|
|
40
|
+
paddingHorizontal: 8,
|
|
41
|
+
paddingVertical: 2
|
|
42
|
+
},
|
|
43
|
+
badgeText: {
|
|
44
|
+
fontSize: 11,
|
|
45
|
+
fontWeight: "700"
|
|
46
|
+
},
|
|
47
|
+
reason: {
|
|
48
|
+
fontSize: 13,
|
|
49
|
+
lineHeight: 18,
|
|
50
|
+
marginTop: 2
|
|
51
|
+
},
|
|
52
|
+
actions: {
|
|
53
|
+
flexDirection: "row",
|
|
54
|
+
alignItems: "center",
|
|
55
|
+
justifyContent: "flex-end",
|
|
56
|
+
marginTop: 12,
|
|
57
|
+
gap: 4
|
|
58
|
+
},
|
|
59
|
+
secondary: {
|
|
60
|
+
paddingHorizontal: 12,
|
|
61
|
+
minHeight: 44,
|
|
62
|
+
justifyContent: "center"
|
|
63
|
+
},
|
|
64
|
+
secondaryText: {
|
|
65
|
+
fontSize: 13,
|
|
66
|
+
fontWeight: "600"
|
|
67
|
+
},
|
|
68
|
+
primary: {
|
|
69
|
+
paddingHorizontal: 18,
|
|
70
|
+
borderRadius: 12,
|
|
71
|
+
minHeight: 44,
|
|
72
|
+
minWidth: 104,
|
|
73
|
+
alignItems: "center",
|
|
74
|
+
justifyContent: "center"
|
|
75
|
+
},
|
|
76
|
+
primaryText: {
|
|
77
|
+
fontSize: 14,
|
|
78
|
+
fontWeight: "700"
|
|
79
|
+
},
|
|
80
|
+
pressed: {
|
|
81
|
+
opacity: 0.75
|
|
82
|
+
},
|
|
83
|
+
note: {
|
|
84
|
+
fontSize: 12,
|
|
85
|
+
lineHeight: 16,
|
|
86
|
+
marginTop: 6,
|
|
87
|
+
textAlign: "right"
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
function ConnectorConnectCardView({
|
|
91
|
+
name,
|
|
92
|
+
reason,
|
|
93
|
+
siteLogin,
|
|
94
|
+
connected,
|
|
95
|
+
actionLabel,
|
|
96
|
+
busy = false,
|
|
97
|
+
actionPending = false,
|
|
98
|
+
note,
|
|
99
|
+
isDark = false,
|
|
100
|
+
onAction,
|
|
101
|
+
onDismiss
|
|
102
|
+
}) {
|
|
103
|
+
const palette = useMemo(() => ({
|
|
104
|
+
card: isDark ? "#111827" : "#ffffff",
|
|
105
|
+
border: isDark ? "#1f2937" : "#e5e7eb",
|
|
106
|
+
title: isDark ? "#f1f5f9" : "#111827",
|
|
107
|
+
muted: isDark ? "#94a3b8" : "#6b7280",
|
|
108
|
+
iconBg: isDark ? "#1e293b" : "#f3f4f6",
|
|
109
|
+
badgeBg: isDark ? "#064e3b" : "#d1fae5",
|
|
110
|
+
badgeText: isDark ? "#6ee7b7" : "#047857",
|
|
111
|
+
outline: isDark ? "#334155" : "#d1d5db"
|
|
112
|
+
}), [isDark]);
|
|
113
|
+
const actionDisabled = busy || actionPending;
|
|
114
|
+
return /* @__PURE__ */ jsxs(View, { style: [styles.card, {
|
|
115
|
+
backgroundColor: palette.card,
|
|
116
|
+
borderColor: palette.border
|
|
117
|
+
}], children: [
|
|
118
|
+
/* @__PURE__ */ jsxs(View, { style: styles.row, children: [
|
|
119
|
+
/* @__PURE__ */ jsx(View, { style: [styles.icon, {
|
|
120
|
+
backgroundColor: palette.iconBg
|
|
121
|
+
}], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: siteLogin ? "key-variant" : "power-plug-outline", size: 18, color: palette.muted }) }),
|
|
122
|
+
/* @__PURE__ */ jsxs(View, { style: styles.body, children: [
|
|
123
|
+
/* @__PURE__ */ jsxs(View, { style: styles.titleRow, children: [
|
|
124
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.title, {
|
|
125
|
+
color: palette.title
|
|
126
|
+
}], numberOfLines: 1, children: name }),
|
|
127
|
+
connected ? /* @__PURE__ */ jsx(View, { style: [styles.badge, {
|
|
128
|
+
backgroundColor: palette.badgeBg
|
|
129
|
+
}], children: /* @__PURE__ */ jsx(Text, { style: [styles.badgeText, {
|
|
130
|
+
color: palette.badgeText
|
|
131
|
+
}], children: "Connected" }) }) : null
|
|
132
|
+
] }),
|
|
133
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.reason, {
|
|
134
|
+
color: palette.muted
|
|
135
|
+
}], children: reason })
|
|
136
|
+
] })
|
|
137
|
+
] }),
|
|
138
|
+
/* @__PURE__ */ jsxs(View, { style: styles.actions, children: [
|
|
139
|
+
/* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", accessibilityState: {
|
|
140
|
+
disabled: busy
|
|
141
|
+
}, onPress: onDismiss, disabled: busy, hitSlop: 6, style: styles.secondary, children: /* @__PURE__ */ jsx(Text, { style: [styles.secondaryText, {
|
|
142
|
+
color: palette.muted
|
|
143
|
+
}], children: "Not now" }) }),
|
|
144
|
+
/* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: `${actionLabel} ${name}`, accessibilityState: {
|
|
145
|
+
disabled: actionDisabled,
|
|
146
|
+
busy: actionDisabled
|
|
147
|
+
}, onPress: onAction, disabled: actionDisabled, style: ({
|
|
148
|
+
pressed
|
|
149
|
+
}) => [styles.primary, connected ? {
|
|
150
|
+
backgroundColor: "transparent",
|
|
151
|
+
borderColor: palette.outline,
|
|
152
|
+
borderWidth: 1
|
|
153
|
+
} : {
|
|
154
|
+
backgroundColor: ACCENT
|
|
155
|
+
}, (pressed || actionDisabled) && styles.pressed], children: actionDisabled ? /* @__PURE__ */ jsx(ActivityIndicator, { size: "small", color: connected ? palette.title : "#ffffff" }) : /* @__PURE__ */ jsx(Text, { style: [styles.primaryText, {
|
|
156
|
+
color: connected ? palette.title : "#ffffff"
|
|
157
|
+
}], children: actionLabel }) })
|
|
158
|
+
] }),
|
|
159
|
+
note ? /* @__PURE__ */ jsx(Text, { style: [styles.note, {
|
|
160
|
+
color: palette.muted
|
|
161
|
+
}], children: note }) : null
|
|
162
|
+
] });
|
|
163
|
+
}
|
|
164
|
+
const ConnectorConnectCard = memo(ConnectorConnectCardView);export{ConnectorConnectCard};//# sourceMappingURL=ConnectorConnectCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectorConnectCard.js","sources":["../../../src/features/chat/ConnectorConnectCard.tsx"],"sourcesContent":["/**\n * <ConnectorConnectCard> - the `[CONNECTOR_CONNECT]` request as a touch card.\n *\n * Phone twin of the web ConnectorConnectCard: icon, name (+ \"Connected\" when a\n * matching credential is already saved), the agent's reason, then the primary\n * action (\"Save login\" / \"Connect\", or \"Update\" for a saved one) and \"Not now\".\n * Presentational only: status, the browser session and the reply live in\n * ConnectorConnectPrompt.\n */\nimport React, { memo, useMemo } from 'react';\nimport { ActivityIndicator, Pressable, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\n\nconst ACCENT = '#2563eb';\n\nconst styles = StyleSheet.create({\n card: {\n width: '100%',\n borderWidth: 1,\n borderRadius: 16,\n padding: 14,\n marginTop: 4,\n marginBottom: 8,\n },\n row: { flexDirection: 'row', alignItems: 'flex-start', gap: 12 },\n icon: { width: 36, height: 36, borderRadius: 10, alignItems: 'center', justifyContent: 'center' },\n body: { flex: 1, minWidth: 0 },\n titleRow: { flexDirection: 'row', alignItems: 'center', gap: 8 },\n title: { flexShrink: 1, fontSize: 15, fontWeight: '700', lineHeight: 20 },\n badge: { borderRadius: 999, paddingHorizontal: 8, paddingVertical: 2 },\n badgeText: { fontSize: 11, fontWeight: '700' },\n reason: { fontSize: 13, lineHeight: 18, marginTop: 2 },\n actions: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n marginTop: 12,\n gap: 4,\n },\n secondary: { paddingHorizontal: 12, minHeight: 44, justifyContent: 'center' },\n secondaryText: { fontSize: 13, fontWeight: '600' },\n primary: {\n paddingHorizontal: 18,\n borderRadius: 12,\n minHeight: 44,\n minWidth: 104,\n alignItems: 'center',\n justifyContent: 'center',\n },\n primaryText: { fontSize: 14, fontWeight: '700' },\n pressed: { opacity: 0.75 },\n note: { fontSize: 12, lineHeight: 16, marginTop: 6, textAlign: 'right' },\n});\n\nexport interface ConnectorConnectCardProps {\n name: string;\n reason: string;\n /** A website sign-in (key icon) rather than a catalog connector (plug icon). */\n siteLogin: boolean;\n /** A matching credential is already saved: badge it, and the action updates it. */\n connected: boolean;\n actionLabel: string;\n /** The browser session is open, or its result is being checked. */\n busy?: boolean;\n /**\n * What is saved is still being read: the primary action waits (spinner, not\n * tappable) so it never opens \"Save login\" for a login that exists. \"Not now\"\n * stays available.\n */\n actionPending?: boolean;\n /** One line under the actions, e.g. why nothing was sent after the browser closed. */\n note?: string | null;\n isDark?: boolean;\n onAction: () => void;\n onDismiss: () => void;\n}\n\nfunction ConnectorConnectCardView({\n name,\n reason,\n siteLogin,\n connected,\n actionLabel,\n busy = false,\n actionPending = false,\n note,\n isDark = false,\n onAction,\n onDismiss,\n}: ConnectorConnectCardProps) {\n const palette = useMemo(\n () => ({\n card: isDark ? '#111827' : '#ffffff',\n border: isDark ? '#1f2937' : '#e5e7eb',\n title: isDark ? '#f1f5f9' : '#111827',\n muted: isDark ? '#94a3b8' : '#6b7280',\n iconBg: isDark ? '#1e293b' : '#f3f4f6',\n badgeBg: isDark ? '#064e3b' : '#d1fae5',\n badgeText: isDark ? '#6ee7b7' : '#047857',\n outline: isDark ? '#334155' : '#d1d5db',\n }),\n [isDark],\n );\n const actionDisabled = busy || actionPending;\n\n return (\n <View style={[styles.card, { backgroundColor: palette.card, borderColor: palette.border }]}>\n <View style={styles.row}>\n <View style={[styles.icon, { backgroundColor: palette.iconBg }]}>\n <MaterialCommunityIcons\n name={siteLogin ? 'key-variant' : 'power-plug-outline'}\n size={18}\n color={palette.muted}\n />\n </View>\n <View style={styles.body}>\n <View style={styles.titleRow}>\n <Text style={[styles.title, { color: palette.title }]} numberOfLines={1}>\n {name}\n </Text>\n {connected ? (\n <View style={[styles.badge, { backgroundColor: palette.badgeBg }]}>\n <Text style={[styles.badgeText, { color: palette.badgeText }]}>Connected</Text>\n </View>\n ) : null}\n </View>\n <Text style={[styles.reason, { color: palette.muted }]}>{reason}</Text>\n </View>\n </View>\n\n <View style={styles.actions}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: busy }}\n onPress={onDismiss}\n disabled={busy}\n hitSlop={6}\n style={styles.secondary}\n >\n <Text style={[styles.secondaryText, { color: palette.muted }]}>Not now</Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={`${actionLabel} ${name}`}\n accessibilityState={{ disabled: actionDisabled, busy: actionDisabled }}\n onPress={onAction}\n disabled={actionDisabled}\n style={({ pressed }) => [\n styles.primary,\n connected\n ? { backgroundColor: 'transparent', borderColor: palette.outline, borderWidth: 1 }\n : { backgroundColor: ACCENT },\n (pressed || actionDisabled) && styles.pressed,\n ]}\n >\n {actionDisabled ? (\n <ActivityIndicator size=\"small\" color={connected ? palette.title : '#ffffff'} />\n ) : (\n <Text style={[styles.primaryText, { color: connected ? palette.title : '#ffffff' }]}>\n {actionLabel}\n </Text>\n )}\n </Pressable>\n </View>\n {note ? <Text style={[styles.note, { color: palette.muted }]}>{note}</Text> : null}\n </View>\n );\n}\n\nexport const ConnectorConnectCard = memo(ConnectorConnectCardView);\n"],"names":[],"mappings":"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"}
|