UNPKG

vlibras-player-webjs

Version:

Biblioteca JavaScript moderna para integração do VLibras Player com React, Vue, Angular e vanilla JS

89 lines 3.37 kB
import { useState, useEffect, useCallback } from 'react'; import { useVLibras } from './useVLibras'; /** * Hook específico para gerenciar traduções de texto para Libras */ export function useVLibrasTranslation(options = {}) { const { autoTranslate = false, debounceMs = 500, onTranslationStart, onTranslationComplete, onTranslationError } = options; const { player, isLoaded } = useVLibras(); const [isTranslating, setIsTranslating] = useState(false); const [error, setError] = useState(null); const [lastTranslation, setLastTranslation] = useState(null); const [translationHistory, setTranslationHistory] = useState([]); const [debounceTimer, setDebounceTimer] = useState(null); const translate = useCallback(async (text) => { if (!player || !isLoaded || !text.trim()) { return; } setIsTranslating(true); setError(null); onTranslationStart?.(text); try { await player.translateAsync(text); setLastTranslation(text); setTranslationHistory(prev => { const updated = [text, ...prev.filter(t => t !== text)]; return updated.slice(0, 10); // Manter apenas últimas 10 traduções }); onTranslationComplete?.(); } catch (err) { const errorMsg = err instanceof Error ? err.message : 'Erro na tradução'; setError(errorMsg); onTranslationError?.(err instanceof Error ? err : new Error(errorMsg)); } finally { setIsTranslating(false); } }, [player, isLoaded, onTranslationStart, onTranslationComplete, onTranslationError]); const translateAndPlay = useCallback(async (text) => { if (!player || !isLoaded || !text.trim()) { return; } try { await translate(text); await player.playAsync(); } catch (err) { const errorMsg = err instanceof Error ? err.message : 'Erro na tradução e reprodução'; setError(errorMsg); onTranslationError?.(err instanceof Error ? err : new Error(errorMsg)); } }, [player, isLoaded, translate, onTranslationError]); const debouncedTranslate = useCallback(async (text) => { if (debounceTimer) { clearTimeout(debounceTimer); } return new Promise((resolve) => { const timer = setTimeout(async () => { if (autoTranslate) { await translate(text); } resolve(); }, debounceMs); setDebounceTimer(timer); }); }, [translate, autoTranslate, debounceMs, debounceTimer]); const clearHistory = useCallback(() => { setTranslationHistory([]); setLastTranslation(null); }, []); // Cleanup do timer quando componente desmonta useEffect(() => { return () => { if (debounceTimer) { clearTimeout(debounceTimer); } }; }, [debounceTimer]); return { translate: autoTranslate ? debouncedTranslate : translate, translateAndPlay, isTranslating, error, lastTranslation, translationHistory, clearHistory }; } //# sourceMappingURL=useVLibrasTranslation.js.map