UNPKG

@100mslive/react-native-room-kit

Version:

100ms Room Kit provides simple & easy to use UI components to build Live Streaming & Video Conferencing experiences in your apps.

1,049 lines (1,045 loc) 43.7 kB
import React, { useEffect, useState } from 'react'; import { View, TouchableOpacity, Text, ScrollView, TextInput, StyleSheet, Image, useWindowDimensions } from 'react-native'; import { useDispatch, useSelector } from 'react-redux'; import { HMSTrackType, HMSTrackSource, HMSAudioDevice, HMSAudioMixingMode, HMSHLSConfig } from '@100mslive/react-native-hms'; import { styles } from './styles'; import { CustomButton } from './CustomButton'; import { Menu, MenuItem } from './MenuModal'; import { addNotification, changeHLSAspectRatio, changeShowStats } from '../redux/actions'; import { getTime } from '../utils/functions'; import { ModalTypes, SUPPORTED_ASPECT_RATIOS } from '../utils/types'; import { COLORS } from '../utils/theme'; import { SwitchRow } from './SwitchRow'; import { useHMSInstance } from '../hooks-util'; import { ChevronIcon } from '../Icons'; import { NotificationTypes } from '../types'; export const ChangeRoleModal = ({ cancelModal }) => { var _peer$role2; const instance = useHMSInstance(); const dispatch = useDispatch(); const allRoles = useSelector(state => state.hmsStates.roles); let peer = useSelector(state => state.app.peerToUpdate); useEffect(() => { let validRoles = allRoles.filter(role => { var _peer$role; return role.name !== (peer === null || peer === void 0 || (_peer$role = peer.role) === null || _peer$role === void 0 ? void 0 : _peer$role.name) && role.name !== '__internal_recorder'; }); setValidRoles(validRoles); if (validRoles.length > 0) { setNewRole(validRoles[0]); } }, [allRoles, peer]); const [validRoles, setValidRoles] = useState(undefined); const [newRole, setNewRole] = useState(undefined); const [visible, setVisible] = useState(false); const hideMenu = () => setVisible(false); const showMenu = () => setVisible(true); const switchRole = () => { if (newRole) { instance === null || instance === void 0 || instance.changeRoleOfPeer(peer, newRole, true).catch(e => { console.log('Switch Role of Peer Error: ', e); dispatch(addNotification({ id: Math.random().toString(16).slice(2), type: NotificationTypes.ERROR, title: e.message })); }); } else { dispatch(addNotification({ id: Math.random().toString(16).slice(2), type: NotificationTypes.ERROR, title: 'Please select a role' })); } cancelModal(); }; return /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModal }, /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeModalHeading }, "Switch Role"), /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeModalDescription }, "Switch the role of '", peer === null || peer === void 0 ? void 0 : peer.name, "' from '", peer === null || peer === void 0 || (_peer$role2 = peer.role) === null || _peer$role2 === void 0 ? void 0 : _peer$role2.name, "' to"), /*#__PURE__*/React.createElement(Menu, { visible: visible, anchor: /*#__PURE__*/React.createElement(TouchableOpacity, { style: styles.participantChangeRoleContainer, onPress: showMenu, disabled: validRoles && (validRoles === null || validRoles === void 0 ? void 0 : validRoles.length) <= 1 }, /*#__PURE__*/React.createElement(Text, { style: styles.participantFilterText, numberOfLines: 1 }, newRole === null || newRole === void 0 ? void 0 : newRole.name), validRoles && (validRoles === null || validRoles === void 0 ? void 0 : validRoles.length) > 1 && /*#__PURE__*/React.createElement(ChevronIcon, { direction: 'down' })), onRequestClose: hideMenu, style: styles.participantsMenuContainer }, validRoles === null || validRoles === void 0 ? void 0 : validRoles.map(knownRole => { return /*#__PURE__*/React.createElement(MenuItem, { onPress: () => { hideMenu(); setNewRole(knownRole); }, key: knownRole.name }, /*#__PURE__*/React.createElement(View, { style: styles.participantMenuItem }, /*#__PURE__*/React.createElement(Text, { style: styles.participantMenuItemName }, knownRole === null || knownRole === void 0 ? void 0 : knownRole.name))); })), /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModalPermissionContainer }, /*#__PURE__*/React.createElement(CustomButton, { title: "Cancel", onPress: cancelModal, viewStyle: styles.roleChangeModalCancelButton, textStyle: styles.roleChangeModalButtonText }), /*#__PURE__*/React.createElement(CustomButton, { title: "Switch Role", onPress: switchRole, viewStyle: styles.roleChangeModalSuccessButton, textStyle: styles.roleChangeModalButtonText }))); }; export const SaveScreenshot = ({ imageSource, cancelModal }) => { const peer = useSelector(state => state.hmsStates.localPeer || undefined); return /*#__PURE__*/React.createElement(View, { style: [{ flexGrow: 1 }, styles.volumeModalContainer] }, /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeModalHeading }, peer ? `${peer.name}'s Snapshot` : 'Snapshot'), imageSource ? /*#__PURE__*/React.createElement(Image, { source: imageSource, style: styles.screenshotImage, resizeMode: "contain" }) : null, /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModalPermissionContainer }, /*#__PURE__*/React.createElement(CustomButton, { title: "Done", onPress: cancelModal, viewStyle: [styles.roleChangeModalCancelButton, { width: '100%' }], textStyle: styles.roleChangeModalButtonText }))); }; export const RtcStatsModal = () => { var _currentTrack$track; const dispatch = useDispatch(); const instance = useSelector(state => state.user.hmsInstance); const showStatsOnTiles = useSelector(state => state.app.joinConfig.showStats); const [localPeer, setLocalPeer] = useState(null); const [remotePeers, setRemotePeers] = useState([]); const [tracksListModalVisible, setTracksListModalVisible] = useState(false); const [currentTrack, setCurrentTrack] = useState(null); const hideMenu = () => setTracksListModalVisible(false); const showMenu = () => setTracksListModalVisible(true); const getStatsList = () => { var _localPeer$audioTrack, _localPeer$videoTrack; const list = []; if (localPeer !== null && localPeer !== void 0 && (_localPeer$audioTrack = localPeer.audioTrack) !== null && _localPeer$audioTrack !== void 0 && _localPeer$audioTrack.trackId) { list.push({ name: (localPeer === null || localPeer === void 0 ? void 0 : localPeer.name) + "'s audio", peerId: localPeer === null || localPeer === void 0 ? void 0 : localPeer.peerID, track: localPeer === null || localPeer === void 0 ? void 0 : localPeer.audioTrack }); } if (localPeer !== null && localPeer !== void 0 && (_localPeer$videoTrack = localPeer.videoTrack) !== null && _localPeer$videoTrack !== void 0 && _localPeer$videoTrack.trackId) { list.push({ name: (localPeer === null || localPeer === void 0 ? void 0 : localPeer.name) + "'s video", track: localPeer === null || localPeer === void 0 ? void 0 : localPeer.videoTrack }); } remotePeers.forEach(remotePeer => { var _remotePeer$audioTrac, _remotePeer$videoTrac; if (remotePeer !== null && remotePeer !== void 0 && (_remotePeer$audioTrac = remotePeer.audioTrack) !== null && _remotePeer$audioTrac !== void 0 && _remotePeer$audioTrac.trackId) { list.push({ name: (remotePeer === null || remotePeer === void 0 ? void 0 : remotePeer.name) + "'s audio", peerId: remotePeer === null || remotePeer === void 0 ? void 0 : remotePeer.peerID, track: remotePeer === null || remotePeer === void 0 ? void 0 : remotePeer.audioTrack }); } if (remotePeer !== null && remotePeer !== void 0 && (_remotePeer$videoTrac = remotePeer.videoTrack) !== null && _remotePeer$videoTrac !== void 0 && _remotePeer$videoTrac.trackId) { list.push({ name: (remotePeer === null || remotePeer === void 0 ? void 0 : remotePeer.name) + "'s video", track: remotePeer === null || remotePeer === void 0 ? void 0 : remotePeer.videoTrack }); } }); return list; }; // Getting Local Peer from hms instance useEffect(() => { if (instance) { const updateLocalPeer = async () => { setLocalPeer(await instance.getLocalPeer()); }; updateLocalPeer(); } }, [instance]); // Getting Remote Peers from hms instance useEffect(() => { if (instance) { const updateRemotePeers = async () => { setRemotePeers(await instance.getRemotePeers()); }; updateRemotePeers(); } }, [instance]); const isCurrentTrackSelected = currentTrack !== null; const statsList = getStatsList(); const firstTrackInStatsList = statsList.length > 0 ? statsList[0] : null; // If currentTrack is null and we have valid item in StatsList // then showing stats for the first valid item in StatsList useEffect(() => { if (!isCurrentTrackSelected && firstTrackInStatsList) { setCurrentTrack(firstTrackInStatsList); } }, [isCurrentTrackSelected, firstTrackInStatsList]); const selectedTrackId = currentTrack ? currentTrack.peerId || ((_currentTrack$track = currentTrack.track) === null || _currentTrack$track === void 0 ? void 0 : _currentTrack$track.trackId) : null; const rtcStatsData = useSelector(state => selectedTrackId ? state.app.rtcStats[selectedTrackId] : null); return /*#__PURE__*/React.createElement(View, { style: styles.participantContainer }, /*#__PURE__*/React.createElement(View, { style: styles.participantsHeaderContainer }, /*#__PURE__*/React.createElement(Text, { style: styles.participantsHeading }, "Stats for Nerds")), /*#__PURE__*/React.createElement(SwitchRow, { text: "Show Stats on Tiles", value: showStatsOnTiles, onChange: value => dispatch(changeShowStats(value)) }), /*#__PURE__*/React.createElement(Menu, { visible: tracksListModalVisible, anchor: /*#__PURE__*/React.createElement(TouchableOpacity, { style: styles.statsModalMenu, onPress: showMenu }, /*#__PURE__*/React.createElement(Text, { style: styles.participantFilterText, numberOfLines: 1 }, (currentTrack === null || currentTrack === void 0 ? void 0 : currentTrack.name) ?? 'Choose')), onRequestClose: hideMenu, style: styles.participantsMenuContainer }, statsList.map(trackObj => { var _trackObj$track; return /*#__PURE__*/React.createElement(MenuItem, { onPress: () => { hideMenu(); setCurrentTrack(trackObj); }, key: trackObj === null || trackObj === void 0 || (_trackObj$track = trackObj.track) === null || _trackObj$track === void 0 ? void 0 : _trackObj$track.trackId }, /*#__PURE__*/React.createElement(View, { style: styles.participantMenuItem }, /*#__PURE__*/React.createElement(Text, { style: styles.participantMenuItemName }, trackObj === null || trackObj === void 0 ? void 0 : trackObj.name))); })), /*#__PURE__*/React.createElement(ScrollView, { contentContainerStyle: Array.isArray(rtcStatsData) ? null : styles.statsModalCardContainer }, rtcStatsData ? Array.isArray(rtcStatsData) ? /*#__PURE__*/React.createElement(View, null, rtcStatsData.map(rtcStatsItem => { return /*#__PURE__*/React.createElement(View, { style: { marginBottom: 12 } }, /*#__PURE__*/React.createElement(Text, { style: styles.statsModalCardDescription }, rtcStatsItem.layer), /*#__PURE__*/React.createElement(View, { style: styles.statsModalCardContainer }, Object.entries(rtcStatsItem).filter(item => item[0] !== 'layer').map(item => { const [key, value] = item; return /*#__PURE__*/React.createElement(View, { style: styles.statsModalCard, key: key }, /*#__PURE__*/React.createElement(Text, { style: styles.statsModalCardHeading }, key), /*#__PURE__*/React.createElement(Text, { style: styles.statsModalCardDescription }, key === 'resolution' ? `Height: ${(value === null || value === void 0 ? void 0 : value.height) ?? 0}, Width: ${(value === null || value === void 0 ? void 0 : value.width) ?? 0}` : key === 'qualityLimitationReasons' ? value.reason : value)); }))); })) : Object.entries(rtcStatsData).map(item => { const [key, value] = item; return /*#__PURE__*/React.createElement(View, { style: styles.statsModalCard, key: key }, /*#__PURE__*/React.createElement(Text, { style: styles.statsModalCardHeading }, key), /*#__PURE__*/React.createElement(Text, { style: styles.statsModalCardDescription }, key === 'resolution' ? `Height: ${(value === null || value === void 0 ? void 0 : value.height) ?? 0}, Width: ${(value === null || value === void 0 ? void 0 : value.width) ?? 0}` : value)); }) : null)); }; export const ChangeAudioOutputModal = ({ cancelModal }) => { const instance = useHMSInstance(); const [currentOutputDevice, setCurrentOutputDevice] = useState(HMSAudioDevice.SPEAKER_PHONE); const [audioOutputDevicesList, setAudioOutputDevicesList] = useState([]); const switchAudioOutput = () => { instance === null || instance === void 0 || instance.switchAudioOutput(currentOutputDevice); cancelModal(); }; useEffect(() => { const getList = async () => { setAudioOutputDevicesList(await (instance === null || instance === void 0 ? void 0 : instance.getAudioDevicesList())); setCurrentOutputDevice(await (instance === null || instance === void 0 ? void 0 : instance.getAudioOutputRouteType())); }; getList(); }, [instance]); return /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModal }, /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeModalHeading }, "Switch Audio Output"), audioOutputDevicesList.map(device => { return /*#__PURE__*/React.createElement(TouchableOpacity, { key: device, style: styles.roleChangeModalPermissionContainer, onPress: () => { setCurrentOutputDevice(device); } }, /*#__PURE__*/React.createElement(Text, { style: [styles.roleChangeModalPermission, currentOutputDevice === device ? { color: COLORS.PRIMARY.DEFAULT } : null] }, device)); }), /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModalPermissionContainer }, /*#__PURE__*/React.createElement(CustomButton, { title: "Cancel", onPress: cancelModal, viewStyle: styles.roleChangeModalCancelButton, textStyle: styles.roleChangeModalButtonText }), /*#__PURE__*/React.createElement(CustomButton, { title: "Change", onPress: switchAudioOutput, viewStyle: styles.roleChangeModalSuccessButton, textStyle: styles.roleChangeModalButtonText }))); }; export const ChangeAspectRatio = ({ cancelModal }) => { const { height } = useWindowDimensions(); const dispatch = useDispatch(); const hlsPlayerAspectRatio = useSelector(state => state.app.hlsAspectRatio); const [selectedRatio, setSelectedRatio] = useState(hlsPlayerAspectRatio); const handleChangePress = () => { cancelModal(); if (hlsPlayerAspectRatio.id !== selectedRatio.id) { dispatch(changeHLSAspectRatio(selectedRatio)); } }; return /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModal }, /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeModalHeading }, "Change Aspect Ratio"), /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeModalDescription }, "Current: ", hlsPlayerAspectRatio.id), /*#__PURE__*/React.createElement(ScrollView, { style: { maxHeight: height * 0.4 } }, SUPPORTED_ASPECT_RATIOS.map(ratio => { return /*#__PURE__*/React.createElement(TouchableOpacity, { key: ratio.id, style: styles.roleChangeModalPermissionContainer, onPress: () => setSelectedRatio(ratio) }, /*#__PURE__*/React.createElement(Text, { style: [styles.roleChangeModalPermission, selectedRatio.id === ratio.id ? { color: COLORS.PRIMARY.DEFAULT } : null] }, ratio.id)); })), /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModalPermissionContainer }, /*#__PURE__*/React.createElement(CustomButton, { title: "Cancel", onPress: cancelModal, viewStyle: styles.roleChangeModalCancelButton, textStyle: styles.roleChangeModalButtonText }), /*#__PURE__*/React.createElement(CustomButton, { title: "Change", onPress: handleChangePress, viewStyle: styles.roleChangeModalSuccessButton, textStyle: styles.roleChangeModalButtonText }))); }; export const ChangeAudioModeModal = ({ cancelModal, audioMode, setAudioMode }) => { const instance = useHMSInstance(); const [currentAudioMode, setCurrentAudioMode] = useState(audioMode); const AudioModeList = ['MODE_NORMAL', 'MODE_RINGTONE', 'MODE_IN_CALL', 'MODE_IN_COMMUNICATION', 'MODE_CALL_SCREENING']; const switchAudioMode = () => { instance === null || instance === void 0 || instance.setAudioMode(currentAudioMode); setAudioMode(currentAudioMode); cancelModal(); }; return /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModal }, /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeModalHeading }, "Switch Audio Output"), AudioModeList.map(mode => { return /*#__PURE__*/React.createElement(TouchableOpacity, { key: mode, style: styles.roleChangeModalPermissionContainer, onPress: () => { setCurrentAudioMode(AudioModeList.indexOf(mode)); } }, /*#__PURE__*/React.createElement(Text, { style: [styles.roleChangeModalPermission, currentAudioMode === AudioModeList.indexOf(mode) ? { color: COLORS.PRIMARY.DEFAULT } : null] }, mode)); }), /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModalPermissionContainer }, /*#__PURE__*/React.createElement(CustomButton, { title: "Cancel", onPress: cancelModal, viewStyle: styles.roleChangeModalCancelButton, textStyle: styles.roleChangeModalButtonText }), /*#__PURE__*/React.createElement(CustomButton, { title: "Change", onPress: switchAudioMode, viewStyle: styles.roleChangeModalSuccessButton, textStyle: styles.roleChangeModalButtonText }))); }; export const ChangeAudioMixingModeModal = ({ newAudioMixingMode, cancelModal, setNewAudioMixingMode }) => { const instance = useHMSInstance(); const changeAudioMixingMode = async () => { await (instance === null || instance === void 0 ? void 0 : instance.setAudioMixingMode(newAudioMixingMode)); cancelModal(); }; return /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModal }, /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeModalHeading }, "Change Audio Mixing Mode"), /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeModalDescription }, "TALK_ONLY : only data captured by mic will be streamed in the room, TALK_AND_MUSIC : data captured by mic as well as playback audio being captured from device will be streamed in the room, MUSIC_ONLY : only the playback audio being captured from device will be streamed in the room"), Object.keys(HMSAudioMixingMode).map(audioMixingMode => { return /*#__PURE__*/React.createElement(TouchableOpacity, { key: audioMixingMode, style: styles.roleChangeModalPermissionContainer, onPress: () => { setNewAudioMixingMode(audioMixingMode); } }, /*#__PURE__*/React.createElement(Text, { style: [styles.roleChangeModalPermission, newAudioMixingMode === audioMixingMode ? { color: COLORS.PRIMARY.DEFAULT } : null] }, audioMixingMode)); }), /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModalPermissionContainer }, /*#__PURE__*/React.createElement(CustomButton, { title: "Cancel", onPress: cancelModal, viewStyle: styles.roleChangeModalCancelButton, textStyle: styles.roleChangeModalButtonText }), /*#__PURE__*/React.createElement(CustomButton, { title: "Change", onPress: changeAudioMixingMode, viewStyle: styles.roleChangeModalSuccessButton, textStyle: styles.roleChangeModalButtonText }))); }; export const ChangeTrackStateForRoleModal = ({ cancelModal }) => { var _localPeerRole$permis, _localPeerRole$permis2; const instance = useHMSInstance(); const roles = useSelector(state => state.hmsStates.roles); const localPeerRole = useSelector(state => { var _state$hmsStates$loca; return (_state$hmsStates$loca = state.hmsStates.localPeer) === null || _state$hmsStates$loca === void 0 ? void 0 : _state$hmsStates$loca.role; }); const [role, setRole] = useState(localPeerRole); const [visible, setVisible] = useState(false); const [trackType, setTrackType] = useState(HMSTrackType.VIDEO); const [trackState, setTrackState] = useState(false); const hideMenu = () => setVisible(false); const showMenu = () => setVisible(true); const changeTrackState = async () => { const source = HMSTrackSource.REGULAR; await (instance === null || instance === void 0 ? void 0 : instance.changeTrackStateForRoles(trackState, trackType, source, [role]).then(d => console.log('Change Track State For Role Success: ', d)).catch(e => console.log('Change Track State For Role Error: ', e))); cancelModal(); }; return /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModal }, /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeModalHeading }, "Change Track State For Role"), /*#__PURE__*/React.createElement(Menu, { visible: visible, anchor: /*#__PURE__*/React.createElement(TouchableOpacity, { style: styles.participantChangeRoleContainer, onPress: showMenu }, /*#__PURE__*/React.createElement(Text, { style: styles.participantFilterText, numberOfLines: 1 }, role === null || role === void 0 ? void 0 : role.name)), onRequestClose: hideMenu, style: styles.participantsMenuContainer }, roles === null || roles === void 0 ? void 0 : roles.map(knownRole => { return /*#__PURE__*/React.createElement(MenuItem, { onPress: () => { hideMenu(); setRole(knownRole); }, key: knownRole.name }, /*#__PURE__*/React.createElement(View, { style: styles.participantMenuItem }, /*#__PURE__*/React.createElement(Text, { style: styles.participantMenuItemName }, knownRole === null || knownRole === void 0 ? void 0 : knownRole.name))); })), /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModalPermissionContainer }, /*#__PURE__*/React.createElement(Text, { style: styles.changeTrackStateRoleOptionHeading }, 'Track State: '), (localPeerRole === null || localPeerRole === void 0 || (_localPeerRole$permis = localPeerRole.permissions) === null || _localPeerRole$permis === void 0 ? void 0 : _localPeerRole$permis.mute) && /*#__PURE__*/React.createElement(TouchableOpacity, { style: styles.changeTrackStateRoleOption, onPress: () => setTrackState(true) }, /*#__PURE__*/React.createElement(Text, { style: [styles.roleChangeModalPermission, trackState ? { color: COLORS.PRIMARY.DEFAULT } : null] }, "MUTE")), (localPeerRole === null || localPeerRole === void 0 || (_localPeerRole$permis2 = localPeerRole.permissions) === null || _localPeerRole$permis2 === void 0 ? void 0 : _localPeerRole$permis2.unmute) && /*#__PURE__*/React.createElement(TouchableOpacity, { style: styles.changeTrackStateRoleOption, onPress: () => setTrackState(false) }, /*#__PURE__*/React.createElement(Text, { style: [styles.roleChangeModalPermission, !trackState ? { color: COLORS.PRIMARY.DEFAULT } : null] }, "UNMUTE"))), /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModalPermissionContainer }, /*#__PURE__*/React.createElement(Text, { style: styles.changeTrackStateRoleOptionHeading }, 'Track Type: '), /*#__PURE__*/React.createElement(TouchableOpacity, { style: styles.changeTrackStateRoleOption, onPress: () => setTrackType(HMSTrackType.AUDIO) }, /*#__PURE__*/React.createElement(Text, { style: [styles.roleChangeModalPermission, trackType === HMSTrackType.AUDIO ? { color: COLORS.PRIMARY.DEFAULT } : null] }, HMSTrackType.AUDIO)), /*#__PURE__*/React.createElement(TouchableOpacity, { style: styles.changeTrackStateRoleOption, onPress: () => setTrackType(HMSTrackType.VIDEO) }, /*#__PURE__*/React.createElement(Text, { style: [styles.roleChangeModalPermission, trackType === HMSTrackType.VIDEO ? { color: COLORS.PRIMARY.DEFAULT } : null] }, HMSTrackType.VIDEO))), /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModalPermissionContainer }, /*#__PURE__*/React.createElement(CustomButton, { title: "Cancel", onPress: cancelModal, viewStyle: styles.roleChangeModalCancelButton, textStyle: styles.roleChangeModalButtonText }), /*#__PURE__*/React.createElement(CustomButton, { title: "Change", onPress: changeTrackState, viewStyle: styles.roleChangeModalSuccessButton, textStyle: styles.roleChangeModalButtonText }))); }; export const ChangeTrackStateModal = ({ roleChangeRequest, cancelModal }) => { var _roleChangeRequest$re, _roleChangeRequest$su2; const localPeer = useSelector(state => state.hmsStates.localPeer); const changeLayout = () => { var _roleChangeRequest$su; if ((roleChangeRequest === null || roleChangeRequest === void 0 || (_roleChangeRequest$su = roleChangeRequest.suggestedRole) === null || _roleChangeRequest$su === void 0 ? void 0 : _roleChangeRequest$su.toLocaleLowerCase()) === 'video') { var _localPeer$localVideo; localPeer === null || localPeer === void 0 || (_localPeer$localVideo = localPeer.localVideoTrack()) === null || _localPeer$localVideo === void 0 || _localPeer$localVideo.setMute(false); } else { var _localPeer$localAudio; localPeer === null || localPeer === void 0 || (_localPeer$localAudio = localPeer.localAudioTrack()) === null || _localPeer$localAudio === void 0 || _localPeer$localAudio.setMute(false); } cancelModal(); }; return /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModal }, /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeModalHeading }, "Change Track State Request"), /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeText }, `${roleChangeRequest === null || roleChangeRequest === void 0 || (_roleChangeRequest$re = roleChangeRequest.requestedBy) === null || _roleChangeRequest$re === void 0 ? void 0 : _roleChangeRequest$re.toLocaleUpperCase()} requested to unmute your regular ${roleChangeRequest === null || roleChangeRequest === void 0 || (_roleChangeRequest$su2 = roleChangeRequest.suggestedRole) === null || _roleChangeRequest$su2 === void 0 ? void 0 : _roleChangeRequest$su2.toLocaleUpperCase()}`), /*#__PURE__*/React.createElement(View, { style: styles.sortingButtonContainer }, /*#__PURE__*/React.createElement(CustomButton, { title: "Reject", onPress: cancelModal, viewStyle: styles.roleChangeModalCancelButton, textStyle: styles.roleChangeModalButtonText }), /*#__PURE__*/React.createElement(CustomButton, { title: "Accept", onPress: changeLayout, viewStyle: styles.roleChangeModalSuccessButton, textStyle: styles.roleChangeModalButtonText }))); }; export const HlsStreamingModal = ({ cancelModal }) => { const instance = useHMSInstance(); const roomID = useSelector(state => state.user.roomID); const [hlsStreamingDetails, setHLSStreamingDetails] = useState({ meetingUrl: roomID ? roomID + '?skip_preview=true' : '', metadata: '' }); const [startHlsRetry, setStartHlsRetry] = useState(true); const [hlsRecordingDetails, setHLSRecordingDetails] = useState({ singleFilePerLayer: false, videoOnDemand: false }); const changeLayout = () => { instance === null || instance === void 0 || instance.startHLSStreaming().then(d => console.log('Start HLS Streaming Success: ', d)).catch(err => { if (startHlsRetry) { setStartHlsRetry(false); const hmsHLSConfig = new HMSHLSConfig({ hlsRecordingConfig: hlsRecordingDetails, meetingURLVariants: [hlsStreamingDetails] }); instance === null || instance === void 0 || instance.startHLSStreaming(hmsHLSConfig).then(d => console.log('Start HLS Streaming Success: ', d)).catch(e => console.log('Start HLS Streaming Error: ', e)); } else { console.log('Start HLS Streaming Error: ', err); } }); cancelModal(); }; return /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModal }, /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeModalHeading }, "HLS Streaming Details"), /*#__PURE__*/React.createElement(TextInput, { onChangeText: value => { setHLSStreamingDetails({ ...hlsStreamingDetails, meetingUrl: value }); }, placeholderTextColor: COLORS.SECONDARY.DEFAULT, placeholder: "Enter meeting url", style: styles.input, defaultValue: hlsStreamingDetails.meetingUrl, returnKeyType: "done", multiline: true, blurOnSubmit: true }), /*#__PURE__*/React.createElement(TouchableOpacity, { style: styles.checkboxButtonContainer, onPress: () => { setHLSRecordingDetails({ ...hlsRecordingDetails, singleFilePerLayer: !hlsRecordingDetails.singleFilePerLayer }); } }, /*#__PURE__*/React.createElement(Text, { style: [styles.roleChangeModalPermission, hlsRecordingDetails.singleFilePerLayer ? { color: COLORS.PRIMARY.DEFAULT } : null] }, "SingleFilePerLayer")), /*#__PURE__*/React.createElement(TouchableOpacity, { style: styles.checkboxButtonContainer, onPress: () => { setHLSRecordingDetails({ ...hlsRecordingDetails, videoOnDemand: !hlsRecordingDetails.videoOnDemand }); } }, /*#__PURE__*/React.createElement(Text, { style: [styles.roleChangeModalPermission, hlsRecordingDetails.videoOnDemand ? { color: COLORS.PRIMARY.DEFAULT } : null] }, "VideoOnDemand")), /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModalPermissionContainer }, /*#__PURE__*/React.createElement(CustomButton, { title: "Cancel", onPress: cancelModal, viewStyle: styles.roleChangeModalCancelButton, textStyle: styles.roleChangeModalButtonText }), /*#__PURE__*/React.createElement(CustomButton, { title: "Start", onPress: changeLayout, viewStyle: styles.roleChangeModalSuccessButton, textStyle: styles.roleChangeModalButtonText }))); }; export const RecordingModal = ({ setModalVisible }) => { const instance = useHMSInstance(); const roomID = useSelector(state => state.user.roomID); const [recordingDetails, setRecordingDetails] = useState({ record: false, meetingURL: roomID ? roomID + '?token=beam_recording' : undefined }); const changeLayout = () => { instance === null || instance === void 0 || instance.startRTMPOrRecording(recordingDetails).then(d => console.log('Start RTMP Or Recording Success: ', d)).catch(e => console.log('Start RTMP Or Recording Error: ', e)); setModalVisible(ModalTypes.DEFAULT); }; return /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModal }, /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeModalHeading }, "Recording Details"), /*#__PURE__*/React.createElement(TextInput, { onChangeText: value => { setRecordingDetails({ ...recordingDetails, meetingURL: value }); }, placeholderTextColor: COLORS.SECONDARY.DEFAULT, placeholder: "Enter meeting url", style: styles.input, defaultValue: recordingDetails.meetingURL || '', returnKeyType: "done", multiline: true, blurOnSubmit: true }), /*#__PURE__*/React.createElement(TextInput, { onChangeText: value => { if (value === '') { setRecordingDetails({ ...recordingDetails, rtmpURLs: undefined }); } else { setRecordingDetails({ ...recordingDetails, rtmpURLs: [value] }); } }, placeholderTextColor: COLORS.SECONDARY.DEFAULT, placeholder: "Enter rtmp url", style: styles.input, defaultValue: recordingDetails.rtmpURLs ? recordingDetails.rtmpURLs[0] : '', returnKeyType: "done", multiline: true, blurOnSubmit: true }), /*#__PURE__*/React.createElement(TouchableOpacity, { style: styles.checkboxButtonContainer, onPress: () => { setRecordingDetails({ ...recordingDetails, record: !recordingDetails.record }); } }, /*#__PURE__*/React.createElement(Text, { style: [styles.roleChangeModalPermission, recordingDetails.record ? { color: COLORS.PRIMARY.DEFAULT } : null] }, "Record")), /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModalPermissionContainer }, /*#__PURE__*/React.createElement(CustomButton, { title: "Cancel", onPress: () => setModalVisible(ModalTypes.DEFAULT), viewStyle: styles.roleChangeModalCancelButton, textStyle: styles.roleChangeModalButtonText }), /*#__PURE__*/React.createElement(CustomButton, { title: "Start", onPress: changeLayout, viewStyle: styles.roleChangeModalSuccessButton, textStyle: styles.roleChangeModalButtonText }))); }; export const ChangeRoleAccepteModal = ({ instance, roleChangeRequest, cancelModal }) => { var _roleChangeRequest$re2, _roleChangeRequest$su3; const changeLayout = () => { instance === null || instance === void 0 || instance.acceptRoleChange(); cancelModal(); }; return /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModal }, /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeModalHeading }, "Role Change Details"), /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeText }, `Role change requested by ${roleChangeRequest === null || roleChangeRequest === void 0 || (_roleChangeRequest$re2 = roleChangeRequest.requestedBy) === null || _roleChangeRequest$re2 === void 0 ? void 0 : _roleChangeRequest$re2.toLocaleUpperCase()}. Changing role to ${roleChangeRequest === null || roleChangeRequest === void 0 || (_roleChangeRequest$su3 = roleChangeRequest.suggestedRole) === null || _roleChangeRequest$su3 === void 0 ? void 0 : _roleChangeRequest$su3.toLocaleUpperCase()}`), /*#__PURE__*/React.createElement(View, { style: styles.sortingButtonContainer }, /*#__PURE__*/React.createElement(CustomButton, { title: "Reject", onPress: cancelModal, viewStyle: styles.roleChangeModalCancelButton, textStyle: styles.roleChangeModalButtonText }), /*#__PURE__*/React.createElement(CustomButton, { title: "Accept", onPress: changeLayout, viewStyle: styles.roleChangeModalSuccessButton, textStyle: styles.roleChangeModalButtonText }))); }; export const RealTime = ({ startedAt }) => { const [hour, setHour] = useState(0); const [minute, setMinute] = useState(0); const [second, setSecond] = useState(0); useEffect(() => { if (startedAt) { const millisecs = Date.now() - startedAt.getTime(); const [h, min, sec] = getTime(Math.abs(millisecs)); if (h > 0) { setHour(h); } if (min > 0) { setMinute(min); } if (sec > 0) { setSecond(sec); } } }, [startedAt]); useEffect(() => { const updatePostInfo = setInterval(() => { setSecond(sec => sec + 1); }, 1000); return () => { clearInterval(updatePostInfo); }; }, []); useEffect(() => { if (second === 60) { setSecond(0); setMinute(min => min + 1); } }, [second]); useEffect(() => { if (minute === 60) { setMinute(0); setHour(hr => hr + 1); } }, [minute]); return /*#__PURE__*/React.createElement(View, { style: styles.liveTextContainer }, hour > 0 && /*#__PURE__*/React.createElement(Text, { style: styles.liveTimeText }, hour < 10 ? '0' + hour : hour, ":"), /*#__PURE__*/React.createElement(Text, { style: styles.liveTimeText }, minute < 10 ? '0' + minute : minute, ":"), /*#__PURE__*/React.createElement(Text, { style: styles.liveTimeText }, second < 10 ? '0' + second : second)); }; var RoleSelection = /*#__PURE__*/function (RoleSelection) { RoleSelection["TARGET"] = "TARGET"; RoleSelection["TO_CHANGE"] = "TO_CHANGE"; return RoleSelection; }(RoleSelection || {}); export const ChangeBulkRoleModal = ({ cancelModal }) => { const hmsInstance = useSelector(state => state.user.hmsInstance); const roles = useSelector(state => state.hmsStates.roles); const [showRolesSelectionView, setShowRolesSelectionView] = useState(null); const [targetRole, setTargetRole] = useState(null); const [rolesToChange, setRolesToChange] = useState([]); const changeRole = async () => { if (!hmsInstance || !targetRole) { return; } hmsInstance.changeRoleOfPeersWithRoles(rolesToChange.filter(roleToChange => roleToChange.name !== targetRole.name), targetRole); cancelModal(); }; const handleRoleSelection = roleSelected => { if (showRolesSelectionView === RoleSelection.TARGET) { setTargetRole(roleSelected); } else { setRolesToChange(prevRolesToChange => { if (prevRolesToChange.findIndex(role => role.name === roleSelected.name) >= 0) { return prevRolesToChange.filter(role => role.name !== roleSelected.name); } return [...prevRolesToChange, roleSelected]; }); } }; // if targetRole is not available, OR // role or rolesToChange is not available. then "Change" button should be disabled const changeSubmitDisabled = !targetRole || rolesToChange.length === 0; return /*#__PURE__*/React.createElement(View, { style: bulkRoleStyles.container }, /*#__PURE__*/React.createElement(Text, { style: styles.roleChangeModalHeading }, "Bulk Role Change"), /*#__PURE__*/React.createElement(View, { style: bulkRoleStyles.contentContainer }, /*#__PURE__*/React.createElement(View, { style: bulkRoleStyles.row }, /*#__PURE__*/React.createElement(Text, { style: bulkRoleStyles.label }, "Select Roles to Change"), /*#__PURE__*/React.createElement(TouchableOpacity, { style: bulkRoleStyles.btn, onPress: () => setShowRolesSelectionView(RoleSelection.TO_CHANGE) }, /*#__PURE__*/React.createElement(Text, { style: bulkRoleStyles.value, numberOfLines: 1 }, rolesToChange.map(role => role.name).join(', ') || 'Select Roles'))), /*#__PURE__*/React.createElement(View, { style: bulkRoleStyles.row }, /*#__PURE__*/React.createElement(Text, { style: bulkRoleStyles.label }, "Target Role"), /*#__PURE__*/React.createElement(TouchableOpacity, { style: bulkRoleStyles.btn, onPress: () => setShowRolesSelectionView(RoleSelection.TARGET) }, /*#__PURE__*/React.createElement(Text, { style: bulkRoleStyles.value }, targetRole ? targetRole.name : 'Select Role')))), /*#__PURE__*/React.createElement(View, { style: styles.roleChangeModalPermissionContainer }, /*#__PURE__*/React.createElement(CustomButton, { title: "Cancel", onPress: cancelModal, viewStyle: styles.roleChangeModalCancelButton, textStyle: styles.roleChangeModalButtonText }), /*#__PURE__*/React.createElement(CustomButton, { disabled: changeSubmitDisabled, title: "Change", onPress: changeRole, viewStyle: styles.roleChangeModalSuccessButton, textStyle: styles.roleChangeModalButtonText })), showRolesSelectionView ? /*#__PURE__*/React.createElement(View, { style: bulkRoleStyles.roleSelectionBackdrop }, /*#__PURE__*/React.createElement(View, { style: bulkRoleStyles.roleSelectionContainer }, /*#__PURE__*/React.createElement(Text, { style: bulkRoleStyles.heading }, showRolesSelectionView === RoleSelection.TARGET ? 'Select Target Role' : 'Select Role to Change'), /*#__PURE__*/React.createElement(ScrollView, { centerContent: true, contentContainerStyle: bulkRoleStyles.scrollContainer }, roles.map(role => { const selected = showRolesSelectionView === RoleSelection.TARGET ? role.name === (targetRole === null || targetRole === void 0 ? void 0 : targetRole.name) : rolesToChange.findIndex(roleToChange => roleToChange.name === role.name) >= 0; return /*#__PURE__*/React.createElement(TouchableOpacity, { key: role.name, style: bulkRoleStyles.roleBtn, onPress: () => handleRoleSelection(role) }, /*#__PURE__*/React.createElement(Text, { style: { color: selected ? COLORS.PRIMARY.DEFAULT : COLORS.TEXT.MEDIUM_EMPHASIS } }, role.name)); })), /*#__PURE__*/React.createElement(TouchableOpacity, { style: bulkRoleStyles.roleSelectionDone, onPress: () => setShowRolesSelectionView(null) }, /*#__PURE__*/React.createElement(Text, { style: bulkRoleStyles.roleSelectionDoneText }, "Done")))) : null); }; const bulkRoleStyles = StyleSheet.create({ container: { padding: 24, position: 'relative', height: 320 }, contentContainer: { flex: 1, justifyContent: 'center', marginTop: 24 }, row: { // flexGrow: 1, marginVertical: 20, flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' }, label: { color: COLORS.TEXT.HIGH_EMPHASIS }, value: { flex: 1, color: COLORS.TEXT.MEDIUM_EMPHASIS, textAlign: 'right' }, toggleContainer: { width: 160, borderRadius: 6, backgroundColor: COLORS.SECONDARY.DARK, flexDirection: 'row', paddingVertical: 2, paddingHorizontal: 2 }, toggleItem: { flex: 1, alignItems: 'center', paddingVertical: 6 }, toggleActiveItem: { flex: 1, alignItems: 'center', paddingVertical: 6, borderRadius: 4, backgroundColor: COLORS.SECONDARY.DEFAULT }, btn: { flex: 1, flexDirection: 'row', alignItems: 'center', justifyContent: 'flex-end', marginLeft: 4 }, chevronIcon: { color: COLORS.TEXT.MEDIUM_EMPHASIS }, roleSelectionBackdrop: { position: 'absolute', top: 24, left: 24, width: '100%', height: '100%', shadowColor: COLORS.SURFACE.LIGHT, shadowOpacity: 0.5, shadowRadius: 24, padding: 8 }, roleSelectionContainer: { flex: 1, padding: 12, backgroundColor: COLORS.SURFACE.LIGHT, borderRadius: 8, borderWidth: 0.5, borderColor: COLORS.BORDER.LIGHT }, heading: { fontSize: 16, lineHeight: 24, color: COLORS.TEXT.HIGH_EMPHASIS, marginVertical: 4, marginLeft: 4 }, scrollContainer: { paddingHorizontal: 12 }, checkboxContainer: { marginRight: 12, justifyContent: 'center', alignItems: 'center' }, checkboxLabel: { color: COLORS.TEXT.MEDIUM_EMPHASIS }, roleBtn: { paddingVertical: 12, flexDirection: 'row', alignItems: 'center' }, roleSelectionDone: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', marginTop: 4, paddingVertical: 6 }, roleSelectionDoneText: { fontSize: 14, lineHeight: 22, fontFamily: 'Inter-Medium', color: COLORS.TEXT.HIGH_EMPHASIS } }); //# sourceMappingURL=Modals.js.map