import { useThemeColor } from '@/hooks/useThemeColor'; import { ChatMessage } from '@/store/useAppStore'; import Markdown from '@ronradtke/react-native-markdown-display'; import * as Clipboard from 'expo-clipboard'; import React, { useMemo, useState } from 'react'; import { StyleSheet, Text } from 'react-native'; import { CodeBlock } from './CodeBlock'; import { createMarkdownStyles } from './markdownStyles'; interface MessageContentProps { message: ChatMessage; /** True while this message is the answer currently being streamed. */ showingStreaming: boolean; } export function MessageContent({ message, showingStreaming }: MessageContentProps) { const colors = useThemeColor(); const [copiedText, setCopiedText] = useState(null); const handleCopy = async (text: string) => { await Clipboard.setStringAsync(text); setCopiedText(text); setTimeout(() => setCopiedText(null), 2000); }; const markdownStyles = useMemo(() => createMarkdownStyles(colors), [colors]); const markdownRules = useMemo(() => ({ fence: (node: any) => ( ), code_block: (node: any) => ( ), }), [copiedText]); if (message.role === 'user') { return ( {message.content} ); } if (!message.content && showingStreaming) { return null; // TypingIndicator handled externally } return ( {message.content} ); } const styles = StyleSheet.create({ text: { fontSize: 15, lineHeight: 22, }, });