useTranslateReferents.ts
1 import { useState, useCallback } from 'react' 2 import { litProtocolService } from '../lib/litProtocol' 3 import { useLitSession } from './useLitSession' 4 import type { GunDBReferent } from './useGunDBReferents' 5 6 // Lit Action URL will be loaded dynamically 7 8 export interface TranslatedReferent extends GunDBReferent { 9 translation?: string 10 } 11 12 interface UseTranslateReferentsReturn { 13 translateReferents: (referents: GunDBReferent[], targetLanguage?: string) => Promise<TranslatedReferent[]> 14 translateBatch: (referents: GunDBReferent[], startIndex: number, batchSize: number, targetLanguage?: string) => Promise<TranslatedReferent[]> 15 isTranslating: boolean 16 error: string | null 17 processedCount: number 18 totalAvailable: number 19 } 20 21 export function useTranslateReferents(): UseTranslateReferentsReturn { 22 const [isTranslating, setIsTranslating] = useState(false) 23 const [error, setError] = useState<string | null>(null) 24 const [processedCount, setProcessedCount] = useState(0) 25 const [totalAvailable, setTotalAvailable] = useState(0) 26 const { sessionSigs, createSession } = useLitSession() 27 28 const translateReferents = useCallback(async ( 29 referents: GunDBReferent[], 30 targetLanguage?: string 31 ): Promise<TranslatedReferent[]> => { 32 setIsTranslating(true) 33 setError(null) 34 setProcessedCount(0) 35 setTotalAvailable(referents.length) 36 37 try { 38 // Use browser language if not specified 39 const language = targetLanguage || navigator.language || 'en' 40 console.log('🌐 Translating referents to:', language) 41 42 // Ensure we have a valid session 43 let currentSessionSigs = sessionSigs 44 if (!currentSessionSigs) { 45 console.log('🔐 Creating new Lit session for translation...') 46 currentSessionSigs = await createSession() 47 if (!currentSessionSigs) { 48 throw new Error('Failed to create Lit session') 49 } 50 } 51 52 console.log('📚 Executing translation Lit Action...') 53 54 // Load the Lit Action code 55 const baseUrl = window.location.origin + window.location.pathname 56 const litActionUrl = new URL('./lit-actions/genius-translate-and-gen-exercises/genius-translate-and-gen-exercises.js', baseUrl).href 57 const translateAndGenExercisesCode = await fetch(litActionUrl).then(r => r.text()) 58 59 const result = await litProtocolService.litNodeClient!.executeJs({ 60 code: translateAndGenExercisesCode, 61 sessionSigs: currentSessionSigs, 62 jsParams: { 63 referents, 64 targetLanguage: language 65 } 66 }) 67 68 console.log('🔍 Lit Action raw result:', result) 69 const response = JSON.parse(result.response as string) 70 71 if (!response.success) { 72 console.error('❌ Lit Action error details:', response) 73 throw new Error(response.error || 'Failed to translate referents') 74 } 75 76 console.log(`✅ Translated ${response.processedCount} referents to ${response.languageName}`) 77 setProcessedCount(response.processedCount) 78 79 return response.referents as TranslatedReferent[] 80 } catch (err) { 81 const errorMessage = err instanceof Error ? err.message : 'Failed to translate referents' 82 console.error('❌ Translation error:', errorMessage) 83 setError(errorMessage) 84 return referents // Return original referents on error 85 } finally { 86 setIsTranslating(false) 87 } 88 }, [sessionSigs, createSession]) 89 90 const translateBatch = useCallback(async ( 91 referents: GunDBReferent[], 92 startIndex: number, 93 batchSize: number, 94 targetLanguage?: string 95 ): Promise<TranslatedReferent[]> => { 96 const batch = referents.slice(startIndex, startIndex + batchSize) 97 return translateReferents(batch, targetLanguage) 98 }, [translateReferents]) 99 100 return { 101 translateReferents, 102 translateBatch, 103 isTranslating, 104 error, 105 processedCount, 106 totalAvailable 107 } 108 }