UNPKG

@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
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