Getting Started

Types

Complete TypeScript type definitions for the RIXL SDK

Component Props

VideoProps

interface VideoProps extends Omit<HTMLProps<HTMLVideoElement>, "onEnded"> {
  id: string;
  progressBar?: boolean;
  allowPlayPause?: boolean;
  allowFullscreen?: boolean;
  allowPictureInPicture?: boolean;
  volume?: number;
  theme?: VideoTheme;
  lang?: SupportedLanguage;
  analytics?: boolean;
  analyticsPage?: Page;
  heatmap?: boolean;
  hotSegments?: boolean;
  resumeProgress?: boolean;
  userId?: string;
  userProperties?: Record<string, string>;
  chapters?: boolean;
}

type VideoTheme = "default" | "minimal" | "hover" | "feed" | "hideUI";

type SupportedLanguage = "en" | "de" | "es" | "fr" | "it" | "pl" | "ru" | "tr" | "uk";

type Page = "feed" | "standalone" | "profile";

VideoProps also inherits most standard HTML video props such as className, muted, autoPlay, loop, playsInline, and most DOM event handlers. onEnded is excluded from the public <Video /> props surface; use usePlayback().ended inside the player scope when you need end-of-playback state for custom UI.

VideoPlayerProps

interface VideoPlayerProps {
  children?: ReactNode;
}

VideoPlayer establishes a player scope for detached controls — render a <Video> and sibling hook consumers as children to share a single player instance without prop wiring.

ImageProps

interface ImageProps extends HTMLProps<HTMLImageElement> {
  id?: string;
  alt?: string;
  analytics?: boolean;
  analyticsPage?: Page;
  className?: string;
}

FeedProps

interface FeedProps extends HTMLProps<HTMLDivElement> {
  feedId: string;
  lang?: SupportedLanguage;
  feedFont?: FontFamilyKey;
}

type FontFamilyKey =
  | "monospace_serif"
  | "proportional_serif"
  | "monospace_sans"
  | "proportional_sans"
  | "casual"
  | "cursive"
  | "small_caps";

Hook Types

Player-Scoped Hooks

These hooks read state from the enclosing player scope. Call them inside a component rendered within <Video> or <VideoPlayer> — they take no arguments and automatically bind to the current player.

interface UseMediaSettingsResult {
  muted: boolean;
  volume: number;
  previousVolume: number;
  mute: () => void;
  unmute: () => void;
  toggleMute: () => void;
  setVolume: (volume: number) => void;
}

declare function useMediaSettings(): UseMediaSettingsResult;

interface UsePlaybackResult {
  paused: boolean;
  loading: boolean;
  ended: boolean;
  hasInteracted: boolean;
  playbackRate: number;
  play: () => Promise<void>;
  pause: () => void;
  togglePlay: () => Promise<void>;
  setPlaybackRate: (playbackRate: number) => void;
  pauseOthers: () => void;
}

declare function usePlayback(): UsePlaybackResult;

interface UsePlayerProgressResult {
  currentTime: number;
  duration: number;
  progress: number;
  buffered: number;
  seekTo: (seconds: number) => void;
  seekBy: (deltaSeconds: number) => void;
}

declare function usePlayerProgress(): UsePlayerProgressResult;

interface UsePlayerUIResult {
  controlsVisible: boolean;
  isFullscreen: boolean;
  isPictureInPicture: boolean;
  showControls: () => void;
  hideControls: () => void;
  toggleFullscreen: () => Promise<void>;
  togglePictureInPicture: () => Promise<void>;
}

declare function usePlayerUI(): UsePlayerUIResult;

interface UsePlayerTracksResult {
  audioTrack: number;
  availableAudioTracks: {
    index: number;
    label: string;
    language: string;
    kind: string;
  }[];
  subtitleTrack: number;
  availableSubtitleTracks: {
    index: number;
    label: string;
    language: string;
    kind: string;
  }[];
  setAudioTrack: (trackIndex: number) => void;
  setSubtitleTrack: (trackIndex: number) => void;
}

declare function usePlayerTracks(): UsePlayerTracksResult;

Global Hook

interface UseGlobalPlayerSettingsResult {
  muted: boolean;
  volume: number;
  playbackRate: number;
  preferredQuality: number | undefined;
  preferredAudioLanguage: string | undefined;
  preferredSubtitleLanguage: string | undefined;
  setMuted: (muted: boolean) => void;
  setVolume: (volume: number) => void;
  setPlaybackRate: (rate: number) => void;
  setPreferredQuality: (quality: number | undefined) => void;
  setPreferredAudioLanguage: (language: string | undefined) => void;
  setPreferredSubtitleLanguage: (language: string | undefined) => void;
  pauseAll: () => void;
}

declare function useGlobalPlayerSettings(): UseGlobalPlayerSettingsResult;

To pause every other player relative to the current scope, use the scoped pauseOthers() returned from usePlayback().

DOM Progress Helper

useProgressBar is a lower-level hook for a raw HTMLVideoElement. For the public Video component, prefer usePlayerProgress() when building custom controls.

interface UseProgressBarProps {
  video: HTMLVideoElement | null;
}

declare function useProgressBar(props: UseProgressBarProps): {
  progress: number;
  isDragging: boolean;
  handleDragStart: (event: MouseEvent | TouchEvent) => void;
};

Data Types

VideoData

Represents video metadata returned from the API.

interface VideoData {
  id: string;
  file: FileData;
  poster: ImageData;
  duration: number;
  width: number;
  height: number;
  codec: string;
  bitrate: number;
  framerate: string;
  hdr: boolean;
  chapters?: Chapter[];
}

interface Chapter {
  title: string;
  start_time_sec: number;
  end_time_sec: number;
  duration_label: string;
}

ImageData

Represents image metadata returned from the API.

interface ImageData {
  id: string;
  thumbhash: string;
  width: number;
  height: number;
  attached_to_video: boolean;
  file: FileData;
}

FeedPost

Represents a post within a feed.

interface FeedPost {
  id: string;
  projectId: string;
  creatorId: string;
  type: "image" | "video";
  feedId: string;
  description: string;
  image?: ImageData;
  video?: VideoData;
  createdAt: string;
  updatedAt: string;
}

interface FeedPostsResponse {
  posts: FeedPost[];
  total: number;
  offset: number;
  limit: number;
}

FileData

Represents file metadata for videos and images.

interface FileData {
  id: string;
  project_id: string;
  format: string;
  url: string;
  name: string;
  size: number;
  status: FileStatus;
  created_at: Date;
  updated_at: Date;
}

type FileStatus = "uploading" | "uploaded" | "processing" | "ready" | "error";

Analytics Types

ContentViewEvent

Event structure for content view tracking.

interface ContentViewEvent {
  _type: "content_views";
  timestamp?: number;
  content_id: string;
  content_type: "video" | "image";
  view_type: "start" | "watch" | "end";
  watch_duration_ms: number;
  page: Page;
  feed_id?: string;
  post_id?: string;
  video_position_ms?: number;
  video_total_duration_ms?: number;
  device_id?: string;
  country?: string;
}

VideoHeatmap

Viewer engagement heatmap data.

interface VideoHeatmap {
  video_id: string;
  total_duration_ms: number;
  data: number[];
}

HotSegment

Represents a high-engagement segment of a video.

interface HotSegment {
  start_second: number;
  end_second: number;
  multiplier: number;
}