useTranslateMessage.ts
1 import { useState, useCallback } from 'react' 2 import { useTranslation } from 'react-i18next' 3 import { litProtocolService } from '../lib/litProtocol' 4 import { useLitSession } from './useLitSession' 5 6 interface UseTranslateMessageReturn { 7 translateMessage: (text: string, sourceLang?: string) => Promise<string> 8 isTranslating: boolean 9 error: string | null 10 } 11 12 export function useTranslateMessage(): UseTranslateMessageReturn { 13 const [isTranslating, setIsTranslating] = useState(false) 14 const [error, setError] = useState<string | null>(null) 15 const { sessionSigs, createSession } = useLitSession() 16 const { i18n } = useTranslation() 17 18 const translateMessage = useCallback(async ( 19 text: string, 20 sourceLang: string = 'en' 21 ): Promise<string> => { 22 // Don't translate if target language is the same as source 23 if (i18n.language === sourceLang) { 24 return text 25 } 26 27 setIsTranslating(true) 28 setError(null) 29 30 try { 31 // Ensure we have a Lit session 32 let sigs = sessionSigs 33 if (!sigs) { 34 console.log('🔐 Creating Lit session for translation...') 35 sigs = await createSession() 36 if (!sigs) { 37 throw new Error('Failed to create Lit session') 38 } 39 } 40 41 // Ensure Lit Protocol is connected 42 if (!litProtocolService.litNodeClient) { 43 await litProtocolService.connect() 44 } 45 46 // Load and execute the translation Lit Action 47 const litActionCode = await fetch('/lit-actions/chat/translate-message.js').then(r => r.text()) 48 49 console.log('🌍 Executing translation with params:') 50 console.log(`- Text length: ${text.length} chars`) 51 console.log(`- Source language: ${sourceLang}`) 52 console.log(`- Target language: ${i18n.language}`) 53 54 const result = await litProtocolService.getClient().executeJs({ 55 code: litActionCode, 56 sessionSigs: sigs, 57 jsParams: { 58 textToTranslate: text, 59 sourceLang: sourceLang, 60 targetLanguage: i18n.language 61 } 62 }) 63 64 // Parse the response 65 let response 66 try { 67 if (typeof result.response === 'string') { 68 response = JSON.parse(result.response) 69 } else { 70 response = result.response 71 } 72 } catch (error) { 73 console.error('Failed to parse translation response:', result.response) 74 throw new Error('Failed to parse translation response') 75 } 76 77 if (!response.success) { 78 throw new Error(response.error || 'Translation failed') 79 } 80 81 console.log('✅ Translation completed') 82 return response.translation 83 84 } catch (err) { 85 const errorMessage = err instanceof Error ? err.message : 'Translation failed' 86 setError(errorMessage) 87 throw err 88 } finally { 89 setIsTranslating(false) 90 } 91 }, [sessionSigs, createSession, i18n.language]) 92 93 return { 94 translateMessage, 95 isTranslating, 96 error 97 } 98 }