Ejemplos
Uso Avanzado
Patrones avanzados para manejo de errores, soporte offline y más.
Uso Avanzado
Patrones avanzados y mejores prácticas para aplicaciones en producción.
Manejo de Errores
import { VidtreoRecorder } from '@vidtreo/recorder-react';
import { useState } from 'react';
function RobustRecorder() {
const [error, setError] = useState<string | null>(null);
const handleError = (err: Error) => {
if (err.message.includes('NotAllowedError')) {
setError('Acceso a cámara denegado. Por favor permite los permisos.');
} else if (err.message.includes('NotFoundError')) {
setError('No se encontró cámara. Por favor conecta una cámara.');
} else if (err.message.includes('NotSupportedError')) {
setError('Tu navegador no soporta grabación de video.');
} else if (err.message.includes('Upload failed')) {
setError('Subida fallida. Por favor verifica tu conexión.');
} else {
setError(err.message);
}
};
return (
<div>
<VidtreoRecorder
apiKey={import.meta.env.VITE_VIDTREO_API_KEY}
lang="es"
onError={handleError}
onUploadError={handleError}
/>
{error && (
<div className="error-banner">
<p>{error}</p>
<button onClick={() => setError(null)}>Cerrar</button>
</div>
)}
</div>
);
}Soporte Offline
El SDK automáticamente encola grabaciones cuando está offline:
function OfflineAwareRecorder() {
const [isOnline, setIsOnline] = useState(navigator.onLine);
useEffect(() => {
const handleOnline = () => setIsOnline(true);
const handleOffline = () => setIsOnline(false);
window.addEventListener('online', handleOnline);
window.addEventListener('offline', handleOffline);
return () => {
window.removeEventListener('online', handleOnline);
window.removeEventListener('offline', handleOffline);
};
}, []);
return (
<div>
{!isOnline && (
<div className="offline-banner">
Estás offline. Las grabaciones se subirán cuando te conectes.
</div>
)}
<VidtreoRecorder
apiKey={import.meta.env.VITE_VIDTREO_API_KEY}
lang="es"
/>
</div>
);
}Integración con Formularios
function FeedbackForm() {
const [videoUrl, setVideoUrl] = useState<string | null>(null);
const [feedback, setFeedback] = useState('');
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
await submitFeedback({ text: feedback, videoUrl });
};
return (
<form onSubmit={handleSubmit}>
<textarea
value={feedback}
onChange={(e) => setFeedback(e.target.value)}
placeholder="Describe tu feedback..."
/>
<VidtreoRecorder
apiKey={import.meta.env.VITE_VIDTREO_API_KEY}
lang="es"
maxRecordingTime={120000}
onUploadComplete={(result) => setVideoUrl(result.uploadUrl)}
/>
{videoUrl && <p>Video adjuntado</p>}
<button type="submit">Enviar Feedback</button>
</form>
);
}Detección de Soporte del Navegador
function BrowserAwareRecorder() {
const [isSupported, setIsSupported] = useState(true);
useEffect(() => {
const supported =
'VideoEncoder' in window &&
'AudioEncoder' in window &&
navigator.mediaDevices?.getUserMedia;
setIsSupported(!!supported);
}, []);
if (!isSupported) {
return (
<div className="unsupported">
<h3>Navegador No Soportado</h3>
<p>Por favor usa Chrome, Edge o Safari 16.4+</p>
</div>
);
}
return <VidtreoRecorder apiKey={import.meta.env.VITE_VIDTREO_API_KEY} lang="es" />;
}Ver También
- Configuración — Todas las opciones
- Callbacks — Manejo de eventos
- Referencia de API — API completa