VOIP/Video Consultations
VoipConfig Object
interface VoipConfig {
  id?: number;
  consultation_id?: number;
  apiKey?: string;
  call_id?: string;
  token?: string;
}
For
VOIPconsultation the config data will be invoipConfigand forVIDEOwill be invideoConfigbut it will be the same data structure so will be using one interface for bothVoipConfig
VOIP and Video consultations are rendered and handled the same way,
the difference is ro enable the video on Video consultations and disable it for VOIP consultations.
VOIP/Video Components
These are the components we have to handle these consultations:
TBIPublisher
TBISession
TBISubscriber
TBISubscriberView
VOIP/Video Example
Check the below code example of using our ready-to-use components to handle VOIP/Video consultations:
import React, { useRef, useState } from 'react';
import {
  TBIPublisher,
  TBISession,
  TBISubscriber,
  TBISubscriberView,
} from 'react-native-altibbi';
import { Dimensions, View, Text } from 'react-native';
const Video = (props) => {
  const data = props.route.params.event;
  const voip = props.route.params.voip;
  const [audio, setAudio] = useState<boolean>(true);
  const [video, setVideo] = useState<boolean>(!voip);
  const [camera, setCamera] = useState<'front' | 'back'>('front');
  const sessionRef = useRef(null);
  const toggleVideo = () => setVideo((prev) => !prev);
  const toggleAudio = () => setAudio((prev) => !prev);
  const switchCamera = () =>
    setCamera((prev) => {
      if (prev === 'front') {
        return 'back';
      } else {
        return 'front';
      }
    });
  const renderSubscribers = (subscribers) => {
    if (subscribers && subscribers.length > 0) {
      const { width: screenWidth, height: screenHeight } =
        Dimensions.get('window');
      return subscribers.map((streamId) => (
        <TBISubscriberView
          streamId={streamId}
          style={{ width: screenWidth, height: screenHeight }}
        />
      ));
    }
  };
  return (
    <TBISession
      options={{
        androidZOrder: 'onTop',
        androidOnTop: 'publisher',
      }}
      ref={(ref) => (sessionRef.current = ref)}
      apiKey={data.api_key}
      sessionId={data.call_id}
      token={data.token}
      eventHandlers={{
        streamDestroyed: (event) => {},
        error: (event) => {},
        otrnError: (event) => {},
      }}
    >
      <TBISubscriber
        eventHandlers={{
          error: (event) => {},
          otrnError: (event) => {},
        }}
      >
        {renderSubscribers}
      </TBISubscriber>
      <TBIPublisher
        style={{
          position: 'absolute',
          width: 100,
          height: 100,
          top: 0,
          margin: 5,
          right: 0,
        }}
        properties={{
          cameraPosition: camera,
          publishVideo: video,
          publishAudio: audio,
          enableDtx: true,
        }}
        eventHandlers={{
          streamDestroyed: (event) => {},
          error: (event) => {},
          otrnError: (event) => {},
        }}
      />
      <View
        style={{
          flexDirection: 'row',
          padding: 8,
          position: 'absolute',
          backgroundColor: 'white',
          bottom: 0,
          left: 0,
          right: 0,
          justifyContent: 'center',
        }}
      >
        <Text
          style={{
            fontSize: 20,
            marginRight: 10,
            color: video ? 'blue' : 'red',
          }}
          onPress={() => toggleVideo()}
        >
          {`Video ${video ? 'On' : 'Off'}`}
        </Text>
        <Text
          style={{
            fontSize: 20,
            marginRight: 10,
            color: audio ? 'blue' : 'red',
          }}
          onPress={() => toggleAudio()}
        >
          {`Audio ${audio ? 'On' : 'Off'}`}
        </Text>
        <Text
          style={{ fontSize: 20, marginRight: 10 }}
          onPress={() => switchCamera()}
        >
          camera ({camera})
        </Text>
      </View>
    </TBISession>
  );
};
export default Video;