@sendbird/calls-react-native
Version:
Sendbird Calls SDK for React Native: Empower React Native apps with seamless audio, video, and group calling. Build interactive communication easily.
186 lines (163 loc) • 5.76 kB
text/typescript
/* eslint-disable @typescript-eslint/no-unused-vars */
import { Platform } from 'react-native';
import type { LocalParticipantMethods, ParticipantProperties, RoomListener } from '../types';
import { ControllableModuleType } from '../types';
import type NativeBinder from './NativeBinder';
import type { InternalEvents } from './Room';
export class Participant implements ParticipantProperties {
/** @internal **/
public static get(
props: ParticipantProperties | null,
_binder?: NativeBinder,
_internalEvents?: InternalEvents<RoomListener>,
_roomId?: string,
) {
if (!props) return null;
const localParticipant = new Participant(props);
return localParticipant._updateInternal(props);
}
constructor(props: ParticipantProperties) {
this._props = props;
}
protected _props: ParticipantProperties;
private _updateInternal(props: ParticipantProperties) {
this._props = props;
return this;
}
public get participantId() {
return this._props.participantId;
}
public get user() {
return this._props.user;
}
public get state() {
return this._props.state;
}
public get enteredAt() {
return this._props.enteredAt;
}
public get exitedAt() {
return this._props.exitedAt;
}
public get duration() {
return this._props.duration;
}
public get isAudioEnabled() {
return this._props.isAudioEnabled;
}
public get isVideoEnabled() {
return this._props.isVideoEnabled;
}
public get updatedAt() {
return this._props.updatedAt;
}
}
export class LocalParticipant extends Participant implements LocalParticipantMethods {
/** @internal **/
public static get(
props: ParticipantProperties | null,
binder: NativeBinder,
internalEvents: InternalEvents<RoomListener>,
roomId: string,
) {
if (!props) return null;
return new LocalParticipant(props, binder, internalEvents, roomId);
}
constructor(
props: ParticipantProperties,
binder: NativeBinder,
internalEvents: InternalEvents<RoomListener>,
roomId: string,
) {
super(props);
this._binder = binder;
this._internalEvents = internalEvents;
this._roomId = roomId;
}
private _binder: NativeBinder;
private _internalEvents: InternalEvents<RoomListener>;
private _roomId: string;
/**
* Mutes the audio of the local user.
* Will trigger {@link RoomListener.onRemoteAudioSettingsChanged} method of remote participants.
* If the remote user changes their audio settings, the local user will be notified via the same method.
*
* @since 1.0.0
*/
public muteMicrophone = () => {
this._binder.nativeModule.muteMicrophone(ControllableModuleType.GROUP_CALL, this._roomId);
// NOTE: native doesn't have onLocalAudioSettingsChanged event
this._props.isAudioEnabled = false;
this._internalEvents.emit('onPropertyUpdatedManually', this);
};
/**
* Unmutes the audio of the local user.
* Will trigger {@link RoomListener.onRemoteAudioSettingsChanged} method of remote participants.
* If the remote user changes their audio settings, the local user will be notified via the same method.
*
* @since 1.0.0
*/
public unmuteMicrophone = () => {
this._binder.nativeModule.unmuteMicrophone(ControllableModuleType.GROUP_CALL, this._roomId);
// NOTE: native doesn't have onLocalAudioSettingsChanged event
this._props.isAudioEnabled = true;
this._internalEvents.emit('onPropertyUpdatedManually', this);
};
/**
* Unmutes the audio of the local user.
* Will trigger {@link RoomListener.onRemoteVideoSettingsChanged} method of remote participants.
* If the remote user changes their video settings, the local user will be notified via the same method.
*
* @since 1.0.0
*/
public stopVideo = () => {
this._binder.nativeModule.stopVideo(ControllableModuleType.GROUP_CALL, this._roomId);
// NOTE: native doesn't have onLocalAudioSettingsChanged event
this._props.isVideoEnabled = false;
this._internalEvents.emit('onPropertyUpdatedManually', this);
};
/**
* Unmutes the audio of the local user.
* Will trigger {@link RoomListener.onRemoteVideoSettingsChanged} method of remote participants.
* If the remote user changes their video settings, the local user will be notified via the same method.
*
* @since 1.0.0
*/
public startVideo = () => {
this._binder.nativeModule.startVideo(ControllableModuleType.GROUP_CALL, this._roomId);
// NOTE: native doesn't have onLocalAudioSettingsChanged event
this._props.isVideoEnabled = true;
this._internalEvents.emit('onPropertyUpdatedManually', this);
};
/**
* Toggles the selection between the front and the back camera.
*
* on Android, In case of more than two cameras, the next camera will be selected.
* If the last camera is already selected, the first one will be selected again.
*
* @since 1.0.0
*/
public switchCamera = () => {
return this._binder.nativeModule.switchCamera(ControllableModuleType.GROUP_CALL, this._roomId);
};
/**
* Connects the device camera and Sendbird Calls SDK to stream video for local participant.
*
* @platform Android
* @since 1.1.3
* */
public android_resumeVideoCapturer = () => {
if (Platform.OS !== 'android') return;
return this._binder.nativeModule.resumeVideoCapturer(ControllableModuleType.GROUP_CALL, this._roomId);
};
/**
* Connects the device audio and Sendbird Calls SDK to stream audio.
*
* @platform Android
* @since 1.1.5
* */
public android_resumeAudioTrack = () => {
if (Platform.OS !== 'android') return;
return this._binder.nativeModule.resumeAudioTrack(ControllableModuleType.GROUP_CALL, this._roomId);
};
}