Vidtreo
Exemplos

Uso Avançado

Padrões avançados para tratamento de erros, suporte offline e mais.

Uso Avançado

Padrões avançados e melhores práticas para aplicações em produção.

Tratamento de Erros

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('Acesso à câmera negado. Por favor permita as permissões.');
    } else if (err.message.includes('NotFoundError')) {
      setError('Câmera não encontrada. Por favor conecte uma câmera.');
    } else if (err.message.includes('NotSupportedError')) {
      setError('Seu navegador não suporta gravação de vídeo.');
    } else if (err.message.includes('Upload failed')) {
      setError('Upload falhou. Por favor verifique sua conexão.');
    } else {
      setError(err.message);
    }
  };

  return (
    <div>
      <VidtreoRecorder
        apiKey={import.meta.env.VITE_VIDTREO_API_KEY}
        lang="pt"
        onError={handleError}
        onUploadError={handleError}
      />

      {error && (
        <div className="error-banner">
          <p>{error}</p>
          <button onClick={() => setError(null)}>Fechar</button>
        </div>
      )}
    </div>
  );
}

Suporte Offline

O SDK automaticamente enfileira gravações quando 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">
          Você está offline. As gravações serão enviadas quando conectado.
        </div>
      )}

      <VidtreoRecorder
        apiKey={import.meta.env.VITE_VIDTREO_API_KEY}
        lang="pt"
      />
    </div>
  );
}

Integração com Formulários

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="Descreva seu feedback..."
      />

      <VidtreoRecorder
        apiKey={import.meta.env.VITE_VIDTREO_API_KEY}
        lang="pt"
        maxRecordingTime={120000}
        onUploadComplete={(result) => setVideoUrl(result.uploadUrl)}
      />

      {videoUrl && <p>Vídeo anexado</p>}

      <button type="submit">Enviar Feedback</button>
    </form>
  );
}

Detecção de Suporte do 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 Não Suportado</h3>
        <p>Por favor use Chrome, Edge ou Safari 16.4+</p>
      </div>
    );
  }

  return <VidtreoRecorder apiKey={import.meta.env.VITE_VIDTREO_API_KEY} lang="pt" />;
}

Ver Também

Nesta página