/ apps / web / src / hooks / useTranslateMessage.ts
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  }