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
JavaScript
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