import React, { useState, useEffect } from "react"; import { ScrollView, Text, TouchableHighlight, View } from "react-native"; import { useNavigation, Route } from "@react-navigation/native"; import { Conversation, Message } from "@/app/lib/conversation"; import MessageBubble from "@/components/ui/MessageBubble"; import { WhisperContext } from "whisper.rn"; import { NavigationProp, ParamListBase } from "@react-navigation/native"; import { CachedTranslator, LanguageServer } from "@/app/i18n/api"; import { getDb } from "@/app/lib/db"; import LiveAudioStream from "react-native-live-audio-stream"; const lasOptions = { sampleRate: 32000, // default is 44100 but 32000 is adequate for accurate voice recognition channels: 1, // 1 or 2, default 1 bitsPerSample: 16, // 8 or 16, default 16 audioSource: 6, // android only (see below) bufferSize: 4096, // default is 2048 }; // LiveAudioStream.init(lasOptions as any); const ConversationThread = ({ route } : {route?: Route<"Conversation", {conversation : Conversation}>}) => { const navigation = useNavigation(); if (!route) { return (Missing Params!) } /* 2. Get the param */ const { conversation } = route?.params; const [messages, setMessages] = useState([]); const [guestSpeak, setGuestSpeak] = useState(); const [guestSpeakLoaded, setGuestSpeakLoaded] = useState(false); const [cachedTranslator, setCachedTranslator] = useState< undefined | CachedTranslator >(); useEffect(() => { (async () => { setCachedTranslator( new CachedTranslator( "en", conversation.guest.language, await LanguageServer.getDefault() ) ); if (!cachedTranslator) throw new Error("cachedTranslator is undefined"); setGuestSpeak(await cachedTranslator.translate("Speak")); })(); const updateMessages = (c: Conversation) => { setMessages([...c]); }; conversation.onAddMessage = updateMessages; conversation.onTranslationDone = updateMessages; return () => { conversation.onAddMessage = undefined; conversation.onTranslationDone = undefined; }; }, [conversation, guestSpeak]); const renderMessages = () => messages.map((message, index) => ( )); return cachedTranslator ? ( {renderMessages()} Speak Go Back {guestSpeak ? guestSpeak : "Speak"} ) : ( Loading... ); }; export default ConversationThread;