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