@nswitfy/jitsi-meet
Version:
A plugin which uses jitsi open source video conference SDK for both platforms, Android and IOS;
195 lines • 8.96 kB
JavaScript
import { Observable } from '@nativescript/core';
class MyJitsiMeetViewDelegateImpl extends NSObject {
constructor() {
super(...arguments);
this._hasJoined = false;
}
static initWithOwner(owner) {
let delegate = this.new();
delegate._owner = owner;
return delegate;
}
static new() {
return super.new();
}
conferenceJoined(data) {
this._hasJoined = true;
if (!this._owner) {
return;
}
this._owner.get()._callEventListeners('conferenceJoined', data);
}
conferenceTerminated(data) {
if (!this._owner) {
closeViewController(null);
}
else {
closeViewController(this._owner.get().lastScanViewController);
this._owner.get()._callEventListeners('conferenceTerminated', data);
}
}
conferenceWillJoin(data) {
if (!this._owner) {
return;
}
this._owner.get()._callEventListeners('conferenceWillJoin', data);
}
enterPictureInPicture(data) {
if (!this._owner) {
return;
}
this._owner.get()._callEventListeners('enterPictureInPicture', data);
}
}
MyJitsiMeetViewDelegateImpl.ObjCProtocols = [JitsiMeetViewDelegate];
class MyUIViewController extends UIViewController {
static alloc() {
return super.alloc();
}
static new() {
return super.new();
}
viewDidDisappear(animated) {
super.viewDidDisappear(animated);
if (!!this.view) {
this.getView().leave();
}
}
getView() {
return this.view;
}
}
export class JitsiMeet extends Observable {
constructor(serverURL) {
super();
this.serverURL = '';
this.events = new Array();
this.serverURL = !!serverURL ? serverURL : 'https://meet.jit.si';
this._jitsiView = JitsiMeetView.new();
this._currentViewController = MyUIViewController.new();
this._currentViewController.modalPresentationStyle = 1 /* PageSheet */;
this._currentViewController.view = this._jitsiView;
const weekRef = new WeakRef(this);
this._jitsiDelegate = MyJitsiMeetViewDelegateImpl.initWithOwner(weekRef);
this._currentViewController.getView().delegate = this._jitsiDelegate;
}
startMeeting(options) {
let jitsiMeetOptions = JitsiMeetConferenceOptions.fromBuilder((builder) => {
builder.audioOnly = options.audioOnly;
builder.videoMuted = options.videoMuted;
builder.serverURL = new NSURL({ string: this.serverURL });
builder.room = options.roomName;
if (!!options.featureFlags) {
builder.setFeatureFlagWithBoolean('calendar.enabled', options.featureFlags.calendarEnabled !== undefined ? options.featureFlags.calendarEnabled : false);
builder.setFeatureFlagWithBoolean('call-integration.enabled', options.featureFlags.callIntegration !== undefined ? options.featureFlags.callIntegration : false);
builder.setFeatureFlagWithBoolean('close-captions.enabled', options.featureFlags.closeCaptionsEnabled !== undefined ? options.featureFlags.closeCaptionsEnabled : false);
builder.setFeatureFlagWithBoolean('chat.enabled', options.featureFlags.chatEnabled !== undefined ? options.featureFlags.chatEnabled : false);
builder.setFeatureFlagWithBoolean('invite.enabled', options.featureFlags.inviteEnabled !== undefined ? options.featureFlags.inviteEnabled : false);
builder.setFeatureFlagWithBoolean('ios-recording.enabled', options.featureFlags.iosRecordingEnabled !== undefined ? options.featureFlags.iosRecordingEnabled : false);
builder.setFeatureFlagWithBoolean('welcomepage.enabled', options.featureFlags.welcomePageEnabled !== undefined ? options.featureFlags.welcomePageEnabled : false);
}
else {
builder.setFeatureFlagWithBoolean('calendar.enabled', false);
builder.setFeatureFlagWithBoolean('call-integration.enabled', false);
builder.setFeatureFlagWithBoolean('close-captions.enabled', false);
builder.setFeatureFlagWithBoolean('chat.enabled', false);
builder.setFeatureFlagWithBoolean('invite.enabled', false);
builder.setFeatureFlagWithBoolean('ios-recording.enabled', false);
builder.setFeatureFlagWithBoolean('welcomepage.enabled', false);
}
if (!!options.userInfo) {
let userInfo = new JitsiMeetUserInfo();
userInfo.displayName = options.userInfo.displayName !== undefined ? options.userInfo.displayName : null;
userInfo.email = options.userInfo.email !== undefined ? options.userInfo.email : null;
userInfo.avatar = options.userInfo.avatar !== undefined ? new NSURL({ string: options.userInfo.avatar }) : null;
builder.userInfo = userInfo;
}
});
this._currentViewController.getView().join(jitsiMeetOptions);
setTimeout(() => {
this._lastViewController = getViewControllerToPresentFrom(options.presentInRootVewController !== undefined ? options.presentInRootVewController : false);
setTimeout(() => {
this._lastViewController.presentViewControllerAnimatedCompletion(this._currentViewController, true, null);
}, this._isPresentingModally() ? 650 : 0);
}, 650);
}
_isPresentingModally() {
let frame = require('tns-core-modules/ui/frame');
let viewController;
let topMostFrame = frame.Frame.topmost();
if (frame.Frame.topmost()) {
viewController = topMostFrame.currentPage && topMostFrame.currentPage.ios;
if (viewController) {
while (viewController.parentViewController) {
viewController = viewController.parentViewController;
}
return !!viewController.presentedViewController;
}
}
return false;
}
stopMeeting() {
if (!!this._jitsiView) {
this._jitsiView.leave();
}
}
_callEventListeners(eventName, data) {
const eventListener = this.events.find((eventListener) => eventListener.eventNames === eventName);
if (!!eventListener) {
const url = data.objectForKey('url');
const error = data.objectForKey('error');
this.notify({ eventName: eventListener.eventNames });
}
}
on(eventNames, callback, thisArg) {
if (eventNames === 'conferenceWillJoin' || eventNames === 'conferenceJoined' || eventNames === 'conferenceTerminated') {
const event = this.events.find((eventListener) => eventListener.eventNames === eventNames);
if (!event) {
this.events.push({ eventNames: eventNames, callback: callback });
}
else {
this.off(eventNames);
this.events.splice(this.events.indexOf(event), 1, { eventNames: eventNames, callback: callback });
}
console.log('============================= add event');
}
}
addEventListener(eventNames, callback, thisArg) {
this.on(eventNames, callback);
}
get lastScanViewController() {
return this._lastViewController;
}
}
function getViewControllerToPresentFrom(presentInRootViewController) {
let frame = require('tns-core-modules/ui/frame');
let viewController;
let topMostFrame = frame.Frame.topmost();
if (topMostFrame && presentInRootViewController !== true) {
viewController = topMostFrame.currentPage && topMostFrame.currentPage.ios;
if (viewController) {
while (viewController.parentViewController) {
// find top-most view controler
viewController = viewController.parentViewController;
}
while (viewController.presentedViewController) {
// find last presented modal
viewController = viewController.presentedViewController;
}
}
}
if (!viewController) {
viewController = UIApplication.sharedApplication.keyWindow.rootViewController;
}
return viewController;
}
function closeViewController(lastScanViewController) {
if (lastScanViewController) {
lastScanViewController.dismissViewControllerAnimatedCompletion(true, null);
lastScanViewController = undefined;
}
else {
getViewControllerToPresentFrom().dismissViewControllerAnimatedCompletion(true, null);
}
}
//# sourceMappingURL=index.ios.js.map