Vidtreo

Callbacks

Handle recording events and state changes with VIDTREO callbacks.

Callbacks

VIDTREO provides callbacks to handle recording events, upload progress, and errors. This enables you to build responsive UIs and integrate with your application logic.

Recording Lifecycle

onRecordingStart

Fired when recording begins (after countdown completes).

<VidtreoRecorder
  onRecordingStart={() => {
    console.log('Recording started');
    setIsRecording(true);
    // Hide other UI elements
    // Start a timer
    // Log analytics event
  }}
/>

onRecordingStop

Fired when recording ends (before upload begins).

<VidtreoRecorder
  onRecordingStop={() => {
    console.log('Recording stopped');
    setIsRecording(false);
    setIsProcessing(true);
    // Show processing indicator
  }}
/>

Upload Events

onUploadProgress

Fired periodically during upload with progress value (0-1).

<VidtreoRecorder
  onUploadProgress={(progress) => {
    // progress is between 0 and 1
    const percent = Math.round(progress * 100);
    console.log(`Upload progress: ${percent}%`);
    setUploadProgress(percent);
  }}
/>

Progress Bar Example:

function Recorder() {
  const [progress, setProgress] = useState(0);
  const [isUploading, setIsUploading] = useState(false);

  return (
    <>
      <VidtreoRecorder
        onRecordingStop={() => setIsUploading(true)}
        onUploadProgress={(p) => setProgress(Math.round(p * 100))}
        onUploadComplete={() => setIsUploading(false)}
      />

      {isUploading && (
        <div className="progress-bar">
          <div
            className="progress-fill"
            style={{ width: `${progress}%` }}
          />
          <span>{progress}%</span>
        </div>
      )}
    </>
  );
}

onUploadComplete

Fired when upload completes successfully.

<VidtreoRecorder
  onUploadComplete={(result) => {
    console.log('Video URL:', result.uploadUrl);
    console.log('Recording ID:', result.recordingId);

    // Save to your database
    saveVideoToDatabase({
      url: result.uploadUrl,
      id: result.recordingId
    });

    // Show success message
    showNotification('Video uploaded successfully!');

    // Navigate to video page
    router.push(`/videos/${result.recordingId}`);
  }}
/>

Result Object:

interface UploadCompleteResult {
  uploadUrl: string;    // Direct URL to the video file
  recordingId: string;  // Unique identifier for the recording
}

onUploadError

Fired when upload fails.

<VidtreoRecorder
  onUploadError={(error) => {
    console.error('Upload failed:', error.message);

    // Show error to user
    showNotification('Upload failed. Please try again.', 'error');

    // Log to error tracking service
    errorTracker.capture(error);

    // Offer retry option
    setShowRetryButton(true);
  }}
/>

Error Handling

onError

Fired for any error during the recording process.

<VidtreoRecorder
  onError={(error) => {
    console.error('Recorder error:', error);

    // Handle specific error types
    if (error.message.includes('permission')) {
      showNotification('Please allow camera access');
    } else if (error.message.includes('NotSupported')) {
      showNotification('Your browser does not support recording');
    } else {
      showNotification('An error occurred');
    }
  }}
/>

Common Errors:

ErrorCauseSolution
NotAllowedErrorUser denied camera/mic permissionPrompt user to allow access
NotFoundErrorNo camera or microphone foundCheck device connections
NotSupportedErrorBrowser doesn't support WebCodecsUse a supported browser
OverconstrainedErrorRequested constraints not satisfiableUse default constraints
Upload failedNetwork error during uploadRetry with exponential backoff

Complete Example

import { VidtreoRecorder } from '@vidtreo/recorder-react';
import { useState } from 'react';

function VideoRecorderWithCallbacks() {
  const [status, setStatus] = useState<'idle' | 'recording' | 'uploading' | 'complete' | 'error'>('idle');
  const [progress, setProgress] = useState(0);
  const [videoUrl, setVideoUrl] = useState<string | null>(null);
  const [error, setError] = useState<string | null>(null);

  return (
    <div className="recorder-container">
      <VidtreoRecorder
        apiKey={import.meta.env.VITE_VIDTREO_API_KEY}
        onRecordingStart={() => {
          setStatus('recording');
          setError(null);
        }}
        onRecordingStop={() => {
          setStatus('uploading');
        }}
        onUploadProgress={(p) => {
          setProgress(Math.round(p * 100));
        }}
        onUploadComplete={(result) => {
          setStatus('complete');
          setVideoUrl(result.uploadUrl);
          setProgress(0);
        }}
        onUploadError={(err) => {
          setStatus('error');
          setError(`Upload failed: ${err.message}`);
        }}
        onError={(err) => {
          setStatus('error');
          setError(err.message);
        }}
      />

      {/* Status indicator */}
      <div className="status">
        {status === 'idle' && <span>Ready to record</span>}
        {status === 'recording' && <span className="recording">ā— Recording</span>}
        {status === 'uploading' && <span>Uploading: {progress}%</span>}
        {status === 'complete' && <span className="success">āœ“ Complete</span>}
        {status === 'error' && <span className="error">āœ— {error}</span>}
      </div>

      {/* Video result */}
      {videoUrl && (
        <div className="result">
          <video src={videoUrl} controls />
          <a href={videoUrl} download>Download Video</a>
        </div>
      )}
    </div>
  );
}

Web Component Events

For Web Components, use addEventListener:

const recorder = document.querySelector('vidtreo-recorder');

recorder.addEventListener('recording-start', () => {
  console.log('Recording started');
});

recorder.addEventListener('recording-stop', () => {
  console.log('Recording stopped');
});

recorder.addEventListener('upload-progress', (e) => {
  console.log('Progress:', e.detail.progress);
});

recorder.addEventListener('upload-complete', (e) => {
  console.log('URL:', e.detail.uploadUrl);
});

recorder.addEventListener('upload-error', (e) => {
  console.log('Error:', e.detail.error);
});

recorder.addEventListener('error', (e) => {
  console.log('Error:', e.detail.error);
});

Hook Callbacks

When using useVidtreoRecorder, pass callbacks to the config:

const { state, actions } = useVidtreoRecorder({
  apiKey: '...',
  onRecordingStart: () => console.log('Started'),
  onRecordingStop: () => console.log('Stopped'),
  onUploadProgress: (p) => console.log(`${p * 100}%`),
  onUploadComplete: (result) => console.log(result.uploadUrl),
  onUploadError: (error) => console.error(error),
  onError: (error) => console.error(error),
});

Callbacks are optional. The SDK handles all recording and upload logic automatically. Use callbacks to update your UI or integrate with your application.

Next Steps

On this page