{"version":3,"sources":["components/LandingPage/vs-logo.png","utils/index.ts","state/settings/settingsReducer.ts","state/index.tsx","components/VideoProvider/useSelectedParticipant/useSelectedParticipant.tsx","hooks/useLocalVideoToggle/useLocalVideoToggle.tsx","components/VideoProvider/AttachVisibilityHandler/AttachVisibilityHandler.tsx","constants.ts","components/VideoProvider/useRoom/useRoom.tsx","components/VideoProvider/index.tsx","components/VideoProvider/useLocalTracks/useLocalTracks.ts","components/VideoProvider/useHandleRoomDisconnectionErrors/useHandleRoomDisconnectionErrors.ts","components/VideoProvider/useHandleTrackPublicationFailed/useHandleTrackPublicationFailed.ts","components/VideoProvider/useHandleOnDisconnect/useHandleOnDisconnect.ts","hooks/useVideoContext/useVideoContext.ts","components/Controls/EndCallButton/EndCallButton.tsx","hooks/useIsTrackEnabled/useIsTrackEnabled.tsx","hooks/useLocalAudioToggle/useLocalAudioToggle.tsx","components/Controls/ToggleAudioButton/ToggleAudioButton.tsx","components/Controls/ToggleVideoButton/ToggleVideoButton.tsx","hooks/useScreenShareParticipant/useScreenShareParticipant.tsx","components/Controls/ToogleScreenShareButton/ToggleScreenShareButton.tsx","hooks/useScreenShareToggle/useScreenShareToggle.tsx","hooks/useRoomState/useRoomState.tsx","components/Controls/Controls.tsx","components/Controls/useIsUserActive/useIsUserActive.ts","components/MenuBar/ToggleFullScreenButton/ToggleFullScreenButton.tsx","hooks/useFullScreenToggle/useFullScreenToggle.tsx","components/MenuBar/ChatDialog/ChatParticipantStrip.tsx","components/MenuBar/ChatDialog/ChatKendo.tsx","components/MenuBar/ChatDialog/ChatDialog.tsx","components/MenuBar/Chat/ChatButton.tsx","hooks/useSendMessage/useSendMessage.tsx","components/MenuBar/Record/RecordButton.tsx","components/MenuBar/AboutDialog/AboutDialog.tsx","state/settings/renderDimensions.ts","components/MenuBar/ConnectionOptions/ConnectionOptions.tsx","hooks/useMediaStreamTrack/useMediaStreamTrack.ts","components/AudioLevelIndicator/AudioLevelIndicator.tsx","components/MenuBar/DeviceSelector/LocalAudioLevelIndicator/LocalAudioLevelIndicator.tsx","components/MenuBar/DeviceSelector/deviceHooks/deviceHooks.tsx","components/MenuBar/DeviceSelector/AudioInputList/AudioInputList.tsx","components/MenuBar/DeviceSelector/AudioOutputList/AudioOutputList.tsx","components/VideoTrack/VideoTrack.tsx","components/MenuBar/DeviceSelector/VideoInputList/VideoInputList.tsx","components/MenuBar/DeviceSelector/DeviceSelector.tsx","components/MenuBar/SettingsDialog/SettingsDialog.tsx","components/MenuBar/Menu/Menu.tsx","components/MenuBar/FlipCameraButton/FlipCameraButton.tsx","components/MenuBar/MenuBar.tsx","components/ReconnectingNotification/ReconnectingNotification.tsx","components/BandwidthWarning/BandwidthWarning.tsx","components/NewtorkQualityLevel/NetworkQualityLevel.tsx","components/ParticipantInfo/ParticipantConnectionIndicator/ParticipantConnectionIndicator.tsx","hooks/useParticipantIsReconnecting/useParticipantIsReconnecting.ts","components/ParticipantInfo/PinIcon/PinIcon.tsx","components/ParticipantInfo/PinMenu/PinMenu.tsx","hooks/usePublications/usePublications.tsx","hooks/useIsTrackSwitchedOff/useIsTrackSwitchedOff.tsx","hooks/useTrack/useTrack.tsx","components/ParticipantInfo/ParticipantInfo.tsx","hooks/useParticipantNetworkQualityLevel/useParticipantNetworkQualityLevel.tsx","components/AudioTrack/AudioTrack.tsx","components/Publication/Publication.tsx","components/ParticipantTracks/ParticipantTracks.tsx","components/Participant/Participant.tsx","hooks/useDominantSpeaker/useDominantSpeaker.tsx","hooks/useParticipants/useParticipants.tsx","components/ParticipantStrip/ParticipantStrip.tsx","components/MainParticipantInfo/MainParticipantInfo.tsx","components/MainParticipant/MainParticipant.tsx","hooks/useMainSpeaker/useMainSpeaker.tsx","components/Room/Room.tsx","components/LandingPage/LandingPage.tsx","App.tsx","hooks/useHeight/useHeight.ts","components/ErrorDialog/ErrorDialog.tsx","components/ErrorDialog/enhanceMessage.ts","components/PrivateRoute/PrivateRoute.tsx","theme.ts","utils/useConnectionOptions/useConnectionOptions.ts","components/UnsupportedBrowserWarning/UnsupportedBrowserWarning.tsx","index.tsx"],"names":["module","exports","isMobile","navigator","userAgent","test","initialSettings","trackSwitchOffMode","undefined","dominantSpeakerPriority","bandwidthProfileMode","maxTracks","maxAudioBitrate","renderDimensionLow","renderDimensionStandard","renderDimensionHigh","inputLabels","target","setting","settingsReducer","state","action","name","value","StateContext","createContext","AppStateProvider","props","useState","error","setError","isFetching","setIsFetching","mySid","setMySid","myUniqueId","setMyUniqueId","isAdmin","setIsAdmin","meetingNum","setMeetingNum","guestName","setGuestName","guestToken","setGuestToken","isAdminMute","setIsAdminMute","meetingTitle","setMeetingTitle","activeSinkId","setActiveSinkId","isRoomRecording","setIsRoomRecording","useReducer","settings","dispatchSetting","contextValue","getToken","userName","roomName","a","id","Guid","create","toString","requestOptions","method","headers","body","JSON","stringify","fetch","then","res","text","getMeetingInfo","accessCode","window","Headers","params","URLSearchParams","mtgNum","code","initRemoteAction","actionName","otherName","otherSid","Provider","room","catch","err","Promise","reject","sid","othersid","children","useAppState","context","useContext","Error","selectedParticipantContext","useSelectedParticipant","SelectedParticipantProvider","selectedParticipant","_setSelectedParticipant","useEffect","onDisconnect","on","off","participant","prevParticipant","useLocalVideoToggle","useVideoContext","localParticipant","localTracks","getLocalVideoTrack","removeLocalVideoTrack","onError","videoTrack","find","track","includes","isPublishing","setIspublishing","previousDeviceIdRef","useRef","toggleVideoEnabled","useCallback","current","mediaStreamTrack","getSettings","deviceId","localTrackPublication","unpublishTrack","emit","exact","publishTrack","priority","finally","AttachVisibilityHandler","isVideoEnabled","shouldRepublishVideoOnForeground","handleVisibilityChange","document","visibilityState","addEventListener","removeEventListener","DEFAULT_VIDEO_CONSTRAINTS","width","height","frameRate","MESSAGE_TYPES","TwilioVideo","Video","VideoContext","VideoProvider","options","onErrorCallback","console","log","message","audioTrack","setAudioTrack","setVideoTrack","dataTrack","setDataTrack","isAcquiringLocalTracks","setIsAcquiringLocalTracks","getLocalAudioTrack","createLocalAudioTrack","newTrack","getLocalDataTrack","localDataTrack","LocalDataTrack","newOptions","Date","now","createLocalVideoTrack","stop","dtTrack","createLocalTracks","video","audio","tracks","push","kind","filter","useLocalTracks","EventEmitter","setRoom","isConnecting","setIsConnecting","localTracksRef","optionsRef","connect","token","newRoom","disconnect","once","setTimeout","twilioRoom","forEach","useRoom","onDisconnected","useHandleRoomDisconnectionErrors","useHandleTrackPublicationFailed","useHandleOnDisconnect","useStyles","makeStyles","theme","createStyles","fab","margin","spacing","EndCallButton","classes","Tooltip","title","onClick","placement","PopperProps","disablePortal","Fab","className","color","useIsTrackEnabled","isEnabled","setIsEnabled","setEnabled","setDisabled","useLocalAudioToggle","toggleAudioEnabled","disable","enable","enableAudio","ToggleAudioButton","isAudioEnabled","disabled","data-cy-audio-toggle","ToggleVideoButton","lastClickTimeRef","toggleVideo","useScreenShareParticipant","screenShareParticipant","setScreenShareParticipant","updateScreenShareParticipant","Array","from","participants","values","concat","trackName","backgroundColor","ToggleScreenShareButton","isSharing","setIsSharing","stopScreenShareRef","shareScreen","mediaDevices","getDisplayMedia","stream","getTracks","trackPublication","onended","toggleScreenShare","useScreenShareToggle","isScreenShared","disableScreenShareButton","isScreenShareSupported","isDisabled","tooltipMessage","style","cursor","useRoomState","setState","setRoomState","container","display","position","right","transform","bottom","zIndex","transition","opacity","visibility","maxWidth","breakpoints","down","sidebarMobileHeight","Controls","roomState","isReconnecting","showControls","isUserActive","setIsUserActive","timeoutIDRef","handleUserActivity","throttle","clearTimeout","timeoutID","useIsUserActive","clsx","ToggleFullscreenButton","fscreen","fullscreenElement","isFullScreen","setIsFullScreen","onFullScreenChange","toggleFullScreen","exitFullscreen","requestFullscreen","documentElement","useFullScreenToggle","fullscreenEnabled","IconButton","aria-label","root","orange","palette","getContrastText","deepOrange","purple","deepPurple","ScrollContainer","styled","ChatParticipantStrip","members","map","member","Avatar","identity","substring","toUpperCase","ChatKendo","user","client","channel","roomNum","isLoading","messages","chatConnected","username","setupChatClient","bind","messagesLoaded","messageAdded","sendMessage","handleError","connectChat","onChannelJoin","onMemberJoin","Chat","this","parse","data","m","ms","strMsg","onMemberLeft","getChannelByUniqueName","createChannel","uniqueName","friendlyName","join","getMessages","strIdentity","author","intId","arrName","split","length","timestamp","dateCreated","messagePage","items","twilioMessageToKendoMessage","prevState","event","shutdown","onMessageSend","Component","DialogTitle","withStyles","padding","closeButton","top","grey","onClose","other","disableTypography","Typography","variant","DialogContent","MuiDialogContent","PaperComponent","handle","cancel","Paper","ChatDialog","open","Dialog","aria-labelledby","disableEnforceFocus","dividers","ChatButton","chatOpen","setChatOpen","useSendMessage","msgType","userSid","send","type","RecordButton","strAction","response","t","msg","toggleRecord","AboutDialog","roomType","fullWidth","DialogContentText","String","isSupported","version","appVersion","process","REACT_APP_GIT_TAG","REACT_APP_GIT_COMMIT","DialogActions","Button","autoFocus","RenderDimensions","label","resolution","getResolution","item","formControl","withDefault","val","RenderDimensionItems","MenuItem","key","ConnectionOptions","hidden","handleChange","e","handleNumberChange","Grid","xs","sm","FormControl","InputLabel","Select","onChange","TextField","placeholder","useMediaStreamTrack","setMediaStreamTrack","handleStarted","audioContext","clipId","AudioContext","webkitAudioContext","initializeAnalyser","audioSource","createMediaStreamSource","analyser","createAnalyser","smoothingTimeConstant","fftSize","React","memo","size","background","SIZE","SVGRectRef","setAnalyser","isTrackEnabled","newMediaStream","MediaStream","clone","stopAllMediaStreamTracks","reinitializeAnalyser","SVGClipElement","sampleArray","Uint8Array","frequencyBinCount","timer","interval","getByteFrequencyData","i","volume","Math","min","max","log10","setAttribute","clipPathId","focusable","viewBox","aria-hidden","ref","x","y","fill","d","clipPath","data-cy-audio-mute-icon","LocalAudioLevelIndicator","useDevices","devices","setDevices","getDevices","enumerateDevices","every","device","shouldAskForMediaPermissions","getUserMedia","mediaStream","alignItems","justifyContent","AudioInputList","audioInputDevices","localAudioTrack","localAudioInputDeviceId","newDeviceId","restart","AudioOutputList","audioOutputDevices","activeOutputLabel","maxHeight","objectFit","VideoTrack","isLocal","el","muted","setPriority","attach","detach","isFrontFacing","facingMode","preview","VideoInputList","videoInputDevices","localVideoTrack","localVideoInputDeviceId","listSection","DeviceSelector","minHeight","button","float","paper","SettingsDialog","selectedTab","setSelectedTab","Tabs","_","newValue","Tab","Menu","signOut","aboutOpen","setAboutOpen","menuOpen","setMenuOpen","settingsOpen","setSettingsOpen","anchorRef","handleSignOut","anchorEl","displayName","FlipCameraButton","supportsFacingMode","setSupportsFacingMode","toggleFacingMode","newFacingMode","default","toolbar","rightButtonContainer","marginLeft","form","flexWrap","up","textField","marginRight","loadingSpinner","minWidth","fontWeight","joinButton","MenuBar","AppBar","Toolbar","snackbar","icon","ReconnectingNotification","Snackbar","anchorOrigin","vertical","horizontal","SnackbarContent","BandwidthWarningContainer","flexDirection","Warning","textAlign","BandwidthWarning","fontSize","Container","border","boxSizing","borderRight","NetworkQualityLevel","qualityLevel","level","indicator","borderRadius","ParticipantConnectionIndicator","setIsReconnecting","handleReconnecting","handleReconnected","useParticipantIsReconnecting","PinIcon","SvgIcon","HtmlTooltip","tooltip","typography","pxToRem","handleClick","messageType","Fragment","ButtonGroup","disableElevation","orientation","interactive","usePublications","publications","setPublications","publicationAdded","publication","prevPublications","publicationRemoved","p","useIsTrackSwitchedOff","isSwitchedOff","setIsSwitchedOff","handleSwitchedOff","handleSwitchedOn","useTrack","setTrack","removeTrack","sidebarWidth","overflow","stroke","strokeWidth","isVideoSwitchedOff","infoContainer","hideVideo","infoRow","ParticipantInfo","isSelected","audioPublication","videoPublication","networkQualityLevel","setNetworkQualityLevel","handleNewtorkQualityLevelChange","newNetworkQualityLevel","useParticipantNetworkQualityLevel","Boolean","isScreenShareEnabled","data-cy-participant","AudioTrack","audioEl","appendChild","remove","setSinkId","Publication","disableAudio","videoPriority","ParticipantTracks","filteredPublications","enableScreenShare","some","Participant","useDominantSpeaker","dominantSpeaker","setDominantSpeaker","handleDominantSpeakerChanged","newDominantSpeaker","handleParticipantDisconnected","prevDominantSpeaker","useParticipants","setParticipants","prevParticipants","participantConnected","participantDisconnected","overflowY","overflowX","ParticipantStrip","setSelectedParticipant","j","gridArea","MainParticipantInfo","screenSharePublication","data-cy-main-participant","MainParticipant","mainParticipant","useMainSpeaker","gridTemplateColumns","gridTemplateAreas","gridTemplateRows","gridGap","Room","snackbarStyle","twilioLogo","vsLogo","videoLogo","marginTop","textTransform","errorMessage","createMuiTheme","LandingPage","setAccessCode","mtgReady","setMtgReady","recordSetting","setrecordSetting","mtgLoading","setMeetingLoading","setAuthError","query","useLocation","search","sMeetingNum","get","sAccCode","getMeetingData","onInit","SnackMessage","newState","meetingNumber","hasEnded","showDisplay","showVisibility","ThemeProvider","justify","elevation","src","vsPngLogo","alt","CircularProgress","showRecordNotice","mtg_num","autoHideDuration","Main","App","innerHeight","visualViewport","scale","setHeight","onResize","useHeight","ErrorDialog","dismissError","enhancedMessage","enhanceMessage","PrivateRoute","rest","isAuthReady","renderChildren","REACT_APP_SET_AUTH","render","location","to","pathname","primary","main","useConnectionOptions","connectionOptions","bandwidthProfile","mode","renderDimensions","low","standard","high","Number","networkQuality","local","remote","preferredVideoCodecs","codec","simulcast","maxSubscriptionBitrate","removeUndefineds","obj","isPlainObject","heading","marginBottom","Link","href","rel","VideoApp","UnsupportedBrowserWarning","Helmet","ReactDOM","CssBaseline","path","getElementById"],"mappings":"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","file":"static/js/main.5ff2511b.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,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\"","import isPlainObject from 'is-plain-object';\r\n\r\nexport const isMobile = (() => {\r\n if (typeof navigator === 'undefined' || typeof navigator.userAgent !== 'string') {\r\n return false;\r\n }\r\n return /Mobile/.test(navigator.userAgent);\r\n})();\r\n\r\n// This function ensures that the user has granted the browser permission to use audio and video\r\n// devices. If permission has not been granted, it will cause the browser to ask for permission\r\n// for audio and video at the same time (as opposed to separate requests).\r\nexport function ensureMediaPermissions() {\r\n return navigator.mediaDevices\r\n .enumerateDevices()\r\n .then(devices => devices.every(device => !(device.deviceId && device.label)))\r\n .then(shouldAskForMediaPermissions => {\r\n if (shouldAskForMediaPermissions) {\r\n return navigator.mediaDevices\r\n .getUserMedia({ audio: true, video: true })\r\n .then(mediaStream => mediaStream.getTracks().forEach(track => track.stop()));\r\n }\r\n });\r\n}\r\n\r\n// Recursively removes any object keys with a value of undefined\r\nexport function removeUndefineds(obj: T): T {\r\n if (!isPlainObject(obj)) return obj;\r\n\r\n const target: { [name: string]: any } = {};\r\n\r\n for (const key in obj) {\r\n const val = obj[key];\r\n if (typeof val !== 'undefined') {\r\n target[key] = removeUndefineds(val);\r\n }\r\n }\r\n\r\n return target as T;\r\n}\r\n","import { isMobile } from '../../utils';\r\nimport { RenderDimensionValue } from './renderDimensions';\r\nimport { Track, VideoBandwidthProfileOptions } from 'twilio-video';\r\n\r\nexport interface Settings {\r\n trackSwitchOffMode: VideoBandwidthProfileOptions['trackSwitchOffMode'];\r\n dominantSpeakerPriority?: Track.Priority;\r\n bandwidthProfileMode: VideoBandwidthProfileOptions['mode'];\r\n maxTracks: string;\r\n maxAudioBitrate: string;\r\n renderDimensionLow?: RenderDimensionValue;\r\n renderDimensionStandard?: RenderDimensionValue;\r\n renderDimensionHigh?: RenderDimensionValue;\r\n}\r\n\r\ntype SettingsKeys = keyof Settings;\r\n\r\nexport interface SettingsAction {\r\n name: SettingsKeys;\r\n value: string;\r\n}\r\n\r\nexport const initialSettings: Settings = {\r\n trackSwitchOffMode: undefined,\r\n dominantSpeakerPriority: 'standard',\r\n bandwidthProfileMode: 'collaboration',\r\n maxTracks: isMobile ? '5' : '10',\r\n maxAudioBitrate: '16000',\r\n renderDimensionLow: 'low',\r\n renderDimensionStandard: '960p',\r\n renderDimensionHigh: 'wide1080p',\r\n};\r\n\r\n// This inputLabels object is used by ConnectionOptions.tsx. It is used to populate the id, name, and label props\r\n// of the various input elements. Using a typed object like this (instead of strings) eliminates the possibility\r\n// of there being a typo.\r\nexport const inputLabels = (() => {\r\n const target: any = {};\r\n for (const setting in initialSettings) {\r\n target[setting] = setting as SettingsKeys;\r\n }\r\n return target as { [key in SettingsKeys]: string };\r\n})();\r\n\r\nexport function settingsReducer(state: Settings, action: SettingsAction) {\r\n return {\r\n ...state,\r\n [action.name]: action.value === 'default' ? undefined : action.value,\r\n };\r\n}\r\n","import React, { createContext, useContext, useReducer, useState } from 'react';\r\nimport { RoomType } from '../types';\r\nimport { TwilioError } from 'twilio-video';\r\nimport { settingsReducer, initialSettings, Settings, SettingsAction } from './settings/settingsReducer';\r\nimport { User } from 'firebase';\r\nimport { Guid } from \"guid-typescript\";\r\n//import $ from \"jquery\";\r\n\r\nexport interface StateContextType {\r\n error: TwilioError | null;\r\n setError(error: TwilioError | null): void;\r\n getToken(name: string, room: string, passcode?: string): Promise;\r\n getChatToken(name: string, room: string, passcode?: string): Promise;\r\n getMeetingInfo(meetingNum: string, accessCode: string): Promise;\r\n initRemoteAction(action: string, otherName: string, otherSid: string): Promise;\r\n user?: User | null | { displayName: undefined; photoURL: undefined; passcode?: string };\r\n guestName: string;\r\n setGuestName(guestName: string): void;\r\n guestToken: string;\r\n setGuestToken(guestToken: string): void;\r\n meetingNum: string;\r\n setMeetingNum(meetingNum: string): void;\r\n signIn?(passcode?: string): Promise;\r\n signOut?(): Promise;\r\n isAuthReady?: boolean;\r\n isMeetingReady?: boolean;\r\n isAdmin?: boolean;\r\n setIsAdmin(isAdmin: boolean): void;\r\n isAdminMute?: boolean;\r\n setIsAdminMute(isAdminMute: boolean): void;\r\n meetingTitle?: string;\r\n pageMessage: string;\r\n setMeetingTitle(meetingTitle: string): void;\r\n isFetching: boolean;\r\n activeSinkId: string;\r\n setActiveSinkId(sinkId: string): void;\r\n mySid: string;\r\n setMySid(mySid: string): void;\r\n myUniqueId: string;\r\n setMyUniqueId(myUniqueId: string): void;\r\n settings: Settings;\r\n isRoomRecording: boolean;\r\n setIsRoomRecording(a: boolean): void;\r\n dispatchSetting: React.Dispatch;\r\n roomType?: RoomType;\r\n}\r\n\r\nexport const StateContext = createContext(null!);\r\n\r\n/*\r\n The 'react-hooks/rules-of-hooks' linting rules prevent React Hooks fron being called\r\n inside of if() statements. This is because hooks must always be called in the same order\r\n every time a component is rendered. The 'react-hooks/rules-of-hooks' rule is disabled below\r\n because the \"if (process.env.REACT_APP_SET_AUTH === 'firebase')\" statements are evaluated\r\n at build time (not runtime). If the statement evaluates to false, then the code is not\r\n included in the bundle that is produced (due to tree-shaking). Thus, in this instance, it\r\n is ok to call hooks inside if() statements.\r\n*/\r\nexport default function AppStateProvider(props: React.PropsWithChildren<{}>) {\r\n const [error, setError] = useState(null);\r\n const [isFetching, setIsFetching] = useState(false);\r\n const [mySid, setMySid] = useState(\"\");\r\n const [myUniqueId, setMyUniqueId] = useState(\"\");\r\n const [isAdmin, setIsAdmin] = useState(false);\r\n const [meetingNum, setMeetingNum] = useState(\"\");\r\n const [guestName, setGuestName] = useState(\"\");\r\n const [guestToken, setGuestToken] = useState(\"\");\r\n const [isAdminMute, setIsAdminMute] = useState(false);\r\n const [meetingTitle, setMeetingTitle] = useState('default');\r\n const [activeSinkId, setActiveSinkId] = useState('default');\r\n const [isRoomRecording, setIsRoomRecording] = useState(false);\r\n const [settings, dispatchSetting] = useReducer(settingsReducer, initialSettings);\r\n\r\n let contextValue = {\r\n error,\r\n isAdmin,\r\n setIsAdmin,\r\n setError,\r\n isFetching,\r\n isRoomRecording,\r\n setIsRoomRecording,\r\n activeSinkId,\r\n setActiveSinkId,\r\n meetingTitle,\r\n setMeetingTitle,\r\n settings,\r\n dispatchSetting,\r\n meetingNum,\r\n setMeetingNum,\r\n guestName,\r\n setGuestName,\r\n guestToken,\r\n setGuestToken,\r\n mySid,\r\n setMySid,\r\n myUniqueId,\r\n setMyUniqueId,\r\n isAdminMute,\r\n setIsAdminMute\r\n } as StateContextType;\r\n\r\n\r\n contextValue = {\r\n ...contextValue,\r\n getToken: async (userName, roomName) => {\r\n const id = Guid.create();\r\n setMyUniqueId(id.toString());\r\n\r\n //TODO change to get user id/is_mod\r\n const requestOptions = {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ \"identity\": userName, \"MeetingNumber\": meetingNum, \"device\": id.toString(), \"IsModerator\": isAdmin ? 1 : 0, \"user_id\": 0 })\r\n };\r\n\r\n const endpoint = '/api/meeting/token';\r\n return fetch(`${endpoint}`, requestOptions).then(res => res.text());\r\n },\r\n getMeetingInfo: async (meetingNum, accessCode) => {\r\n const headers = new window.Headers();\r\n const endpoint = '/api/meeting/info';\r\n const params = new window.URLSearchParams({ mtgNum: meetingNum, code: accessCode });\r\n return fetch(`${endpoint}?${params}`, { headers }).then(res => res.text());\r\n },\r\n initRemoteAction: async (actionName, otherName, otherSid) => {\r\n const endpoint = '/api/meeting/action';\r\n\r\n const requestOptions = {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n \"MeetingNumber\": meetingNum, \"action\": actionName, \"IsModerator\": isAdmin ? 1 : 0, \"OtherIdentity\": otherSid, \"Sid\": mySid, \"UniqueID\": myUniqueId, \"OtherName\": otherName\r\n })\r\n };\r\n\r\n return fetch(`${endpoint}`, requestOptions).then(res => res.text());\r\n }\r\n };\r\n\r\n\r\n const getToken: StateContextType['getToken'] = (name, room) => {\r\n setIsFetching(true);\r\n return contextValue\r\n .getToken(name, room)\r\n .then(res => {\r\n setIsFetching(false);\r\n return res;\r\n })\r\n .catch(err => {\r\n setError(err);\r\n setIsFetching(false);\r\n return Promise.reject(err);\r\n });\r\n };\r\n\r\n const getMeetingInfo: StateContextType['getMeetingInfo'] = (meetingNum, accessCode) => {\r\n setIsFetching(true);\r\n return contextValue\r\n .getMeetingInfo(meetingNum, accessCode)\r\n .then(res => {\r\n setIsFetching(false);\r\n return res;\r\n })\r\n .catch(err => {\r\n setError(err);\r\n setIsFetching(false);\r\n return Promise.reject(err);\r\n });\r\n };\r\n\r\n const initRemoteAction: StateContextType['initRemoteAction'] = (action, sid, othersid) => {\r\n setIsFetching(true);\r\n return contextValue\r\n .initRemoteAction(action, sid, othersid)\r\n .then(res => {\r\n setIsFetching(false);\r\n return res;\r\n })\r\n .catch(err => {\r\n setError(err);\r\n setIsFetching(false);\r\n return Promise.reject(err);\r\n });\r\n };\r\n return {props.children};\r\n}\r\n\r\nexport function useAppState() {\r\n const context = useContext(StateContext);\r\n if (!context) {\r\n throw new Error('useAppState must be used within the AppStateProvider');\r\n }\r\n return context;\r\n}\r\n","import React, { createContext, useContext, useState, useEffect } from 'react';\r\nimport { Participant, Room } from 'twilio-video';\r\n\r\ntype selectedParticipantContextType = [Participant | null, (participant: Participant) => void];\r\n\r\nexport const selectedParticipantContext = createContext(null!);\r\n\r\nexport default function useSelectedParticipant() {\r\n const [selectedParticipant, setSelectedParticipant] = useContext(selectedParticipantContext);\r\n return [selectedParticipant, setSelectedParticipant] as const;\r\n}\r\n\r\ntype SelectedParticipantProviderProps = {\r\n room: Room;\r\n children: React.ReactNode;\r\n};\r\n\r\nexport function SelectedParticipantProvider({ room, children }: SelectedParticipantProviderProps) {\r\n const [selectedParticipant, _setSelectedParticipant] = useState(null);\r\n const setSelectedParticipant = (participant: Participant) =>\r\n _setSelectedParticipant(prevParticipant => (prevParticipant === participant ? null : participant));\r\n\r\n useEffect(() => {\r\n const onDisconnect = () => _setSelectedParticipant(null);\r\n room.on('disconnected', onDisconnect);\r\n return () => {\r\n room.off('disconnected', onDisconnect);\r\n };\r\n }, [room]);\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n","import { LocalVideoTrack } from 'twilio-video';\r\nimport { useCallback, useRef, useState } from 'react';\r\nimport useVideoContext from '../useVideoContext/useVideoContext';\r\n\r\nexport default function useLocalVideoToggle() {\r\n const {\r\n room: { localParticipant },\r\n localTracks,\r\n getLocalVideoTrack,\r\n removeLocalVideoTrack,\r\n onError,\r\n } = useVideoContext();\r\n const videoTrack = localTracks.find(track => track.name.includes('camera')) as LocalVideoTrack;\r\n const [isPublishing, setIspublishing] = useState(false);\r\n const previousDeviceIdRef = useRef();\r\n\r\n const toggleVideoEnabled = useCallback(() => {\r\n if (!isPublishing) {\r\n if (videoTrack) {\r\n previousDeviceIdRef.current = videoTrack.mediaStreamTrack.getSettings().deviceId;\r\n const localTrackPublication = localParticipant?.unpublishTrack(videoTrack);\r\n // TODO: remove when SDK implements this event. See: https://issues.corp.twilio.com/browse/JSDK-2592\r\n localParticipant?.emit('trackUnpublished', localTrackPublication);\r\n removeLocalVideoTrack();\r\n } else {\r\n setIspublishing(true);\r\n getLocalVideoTrack({ deviceId: { exact: previousDeviceIdRef.current } })\r\n .then((track: LocalVideoTrack) => localParticipant?.publishTrack(track, { priority: 'low' }))\r\n .catch(onError)\r\n .finally(() => setIspublishing(false));\r\n }\r\n }\r\n }, [videoTrack, localParticipant, getLocalVideoTrack, isPublishing, onError, removeLocalVideoTrack]);\r\n\r\n return [!!videoTrack, toggleVideoEnabled] as const;\r\n}\r\n","import { isMobile } from '../../../utils';\r\nimport { useEffect, useRef } from 'react';\r\nimport useLocalVideoToggle from '../../../hooks/useLocalVideoToggle/useLocalVideoToggle';\r\nimport useVideoContext from '../../../hooks/useVideoContext/useVideoContext';\r\n\r\n/* \r\n This component adds a visibilitychange handler to the document when\r\n the user is using a mobile device. When the handler detects that\r\n the browser has been backgrounded, it unpublishes the users local\r\n video track. The browser cannot send video to the room when it has\r\n been backgrounded, so unpublishing the track stops video capture\r\n on the device, and triggers a UI update for all other participants\r\n to show that this user's video track has been turned off.\r\n*/\r\n\r\nexport default function AttachVisibilityHandler() {\r\n const { room } = useVideoContext();\r\n const [isVideoEnabled, toggleVideoEnabled] = useLocalVideoToggle();\r\n const shouldRepublishVideoOnForeground = useRef(false);\r\n\r\n useEffect(() => {\r\n if (isMobile) {\r\n const handleVisibilityChange = () => {\r\n // We don't need to unpublish the local video track if it has already been unpublished\r\n if (document.visibilityState === 'hidden' && isVideoEnabled) {\r\n shouldRepublishVideoOnForeground.current = true;\r\n toggleVideoEnabled();\r\n\r\n // Don't publish the local video track if it wasn't published before the app was backgrounded\r\n } else if (shouldRepublishVideoOnForeground.current) {\r\n shouldRepublishVideoOnForeground.current = false;\r\n toggleVideoEnabled();\r\n }\r\n };\r\n\r\n document.addEventListener('visibilitychange', handleVisibilityChange);\r\n return () => {\r\n document.removeEventListener('visibilitychange', handleVisibilityChange);\r\n };\r\n }\r\n }, [isVideoEnabled, room, toggleVideoEnabled]);\r\n\r\n return null;\r\n}\r\n","export const DEFAULT_VIDEO_CONSTRAINTS: MediaStreamConstraints['video'] = {\r\n width: 1280,\r\n height: 720,\r\n frameRate: 24,\r\n};\r\n\r\nexport const MESSAGE_TYPES = {\r\n EJECT: \"ejectUser\",\r\n MUTE: \"muteUser\",\r\n UNMUTE: \"unMuteUser\",\r\n TOGGLE_MUTE: \"toggleMute\",\r\n RECORDING_STARTED: \"startRecording\",\r\n RECORDING_STOPPED: \"stopRecording\",\r\n TERMINATE_ROOM: \"terminateRoom\",\r\n PROMOTE_USER: \"promoteUser\",\r\n}\r\n\r\n","import { Callback } from '../../../types';\r\nimport EventEmitter from 'events';\r\nimport { isMobile } from '../../../utils';\r\nimport Video, { ConnectOptions, LocalTrack, Room } from 'twilio-video';\r\nimport { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\n// @ts-ignore\r\nwindow.TwilioVideo = Video;\r\n\r\nexport default function useRoom(localTracks: LocalTrack[], onError: Callback, options?: ConnectOptions) {\r\n const [room, setRoom] = useState(new EventEmitter() as Room);\r\n const [isConnecting, setIsConnecting] = useState(false);\r\n\r\n const localTracksRef = useRef([]);\r\n const optionsRef = useRef(options);\r\n\r\n useEffect(() => {\r\n // It can take a moment for Video.connect to connect to a room. During this time, the user may have enabled or disabled their\r\n // local audio or video tracks. If this happens, we store the localTracks in this ref, so that they are correctly published\r\n // once the user is connected to the room.\r\n localTracksRef.current = localTracks;\r\n }, [localTracks]);\r\n\r\n useEffect(() => {\r\n // This allows the connect function to always access the most recent version of the options object. This allows us to\r\n // reliably use the connect function at any time.\r\n optionsRef.current = options;\r\n }, [options]);\r\n\r\n const connect = useCallback(\r\n token => {\r\n setIsConnecting(true);\r\n return Video.connect(token, { ...optionsRef.current, tracks: [] }).then(\r\n newRoom => {\r\n setRoom(newRoom);\r\n const disconnect = () => newRoom.disconnect();\r\n\r\n newRoom.once('disconnected', () => {\r\n // Reset the room only after all other `disconnected` listeners have been called.\r\n setTimeout(() => setRoom(new EventEmitter() as Room));\r\n window.removeEventListener('beforeunload', disconnect);\r\n\r\n if (isMobile) {\r\n window.removeEventListener('pagehide', disconnect);\r\n }\r\n });\r\n\r\n // @ts-ignore\r\n window.twilioRoom = newRoom;\r\n\r\n localTracksRef.current.forEach(track => {\r\n // Tracks can be supplied as arguments to the Video.connect() function and they will automatically be published.\r\n // However, tracks must be published manually in order to set the priority on them.\r\n // All video tracks are published with 'low' priority. This works because the video\r\n // track that is displayed in the 'MainParticipant' component will have it's priority\r\n // set to 'high' via track.setPriority()\r\n newRoom.localParticipant.publishTrack(track, { priority: track.kind === 'video' ? 'low' : 'standard' });\r\n //console.log(track.kind);\r\n });\r\n\r\n setIsConnecting(false);\r\n\r\n // Add a listener to disconnect from the room when a user closes their browser\r\n window.addEventListener('beforeunload', disconnect);\r\n\r\n if (isMobile) {\r\n // Add a listener to disconnect from the room when a mobile user closes their browser\r\n window.addEventListener('pagehide', disconnect);\r\n }\r\n },\r\n error => {\r\n onError(error);\r\n setIsConnecting(false);\r\n }\r\n );\r\n },\r\n [onError]\r\n );\r\n\r\n return { room, isConnecting, connect };\r\n}","import React, { createContext, ReactNode } from 'react';\r\nimport {\r\n CreateLocalTrackOptions,\r\n ConnectOptions,\r\n LocalAudioTrack,\r\n LocalVideoTrack,\r\n LocalDataTrack,\r\n Room,\r\n TwilioError,\r\n} from 'twilio-video';\r\nimport { Callback, ErrorCallback } from '../../types';\r\nimport { SelectedParticipantProvider } from './useSelectedParticipant/useSelectedParticipant';\r\n\r\nimport AttachVisibilityHandler from './AttachVisibilityHandler/AttachVisibilityHandler';\r\nimport useHandleRoomDisconnectionErrors from './useHandleRoomDisconnectionErrors/useHandleRoomDisconnectionErrors';\r\nimport useHandleOnDisconnect from './useHandleOnDisconnect/useHandleOnDisconnect';\r\nimport useHandleTrackPublicationFailed from './useHandleTrackPublicationFailed/useHandleTrackPublicationFailed';\r\nimport useLocalTracks from './useLocalTracks/useLocalTracks';\r\nimport useRoom from './useRoom/useRoom';\r\n\r\n/*\r\n * The hooks used by the VideoProvider component are different than the hooks found in the 'hooks/' directory. The hooks\r\n * in the 'hooks/' directory can be used anywhere in a video application, and they can be used any number of times.\r\n * the hooks in the 'VideoProvider/' directory are intended to be used by the VideoProvider component only. Using these hooks\r\n * elsewhere in the application may cause problems as these hooks should not be used more than once in an application.\r\n */\r\n\r\nexport interface IVideoContext {\r\n room: Room;\r\n localTracks: (LocalAudioTrack | LocalVideoTrack | LocalDataTrack)[];\r\n isConnecting: boolean;\r\n connect: (token: string) => Promise;\r\n onError: ErrorCallback;\r\n onDisconnect: Callback;\r\n getLocalVideoTrack: (newOptions?: CreateLocalTrackOptions) => Promise;\r\n getLocalAudioTrack: (deviceId?: string) => Promise;\r\n getLocalDataTrack: (deviceId?: string) => LocalDataTrack;\r\n isAcquiringLocalTracks: boolean;\r\n removeLocalVideoTrack: () => void;\r\n}\r\n\r\nexport const VideoContext = createContext(null!);\r\n\r\ninterface VideoProviderProps {\r\n options?: ConnectOptions;\r\n onError: ErrorCallback;\r\n onDisconnect?: Callback;\r\n children: ReactNode;\r\n}\r\n\r\nexport function VideoProvider({ options, children, onError = () => { }, onDisconnect = () => { } }: VideoProviderProps) {\r\n const onErrorCallback = (error: TwilioError) => {\r\n console.log(`ERROR: ${error.message}`, error);\r\n onError(error);\r\n };\r\n\r\n const {\r\n localTracks,\r\n getLocalVideoTrack,\r\n getLocalAudioTrack,\r\n getLocalDataTrack,\r\n isAcquiringLocalTracks,\r\n removeLocalVideoTrack,\r\n } = useLocalTracks();\r\n const { room, isConnecting, connect } = useRoom(localTracks, onErrorCallback, options);\r\n\r\n // Register onError and onDisconnect callback functions.\r\n useHandleRoomDisconnectionErrors(room, onError);\r\n useHandleTrackPublicationFailed(room, onError);\r\n useHandleOnDisconnect(room, onDisconnect);\r\n\r\n return (\r\n \r\n {children}\r\n {/* \r\n The AttachVisibilityHandler component is using the useLocalVideoToggle hook\r\n which must be used within the VideoContext Provider.\r\n */}\r\n \r\n \r\n );\r\n}\r\n","import { DEFAULT_VIDEO_CONSTRAINTS } from '../../../constants';\r\nimport { useCallback, useEffect, useState } from 'react';\r\nimport Video, { LocalVideoTrack, LocalAudioTrack, LocalDataTrack, CreateLocalTrackOptions } from 'twilio-video';\r\n//import { type } from 'os';\r\n\r\nexport default function useLocalTracks() {\r\n const [audioTrack, setAudioTrack] = useState();\r\n const [videoTrack, setVideoTrack] = useState();\r\n const [dataTrack, setDataTrack] = useState();\r\n const [isAcquiringLocalTracks, setIsAcquiringLocalTracks] = useState(false);\r\n\r\n const getLocalAudioTrack = useCallback((deviceId?: string) => {\r\n const options: CreateLocalTrackOptions = {};\r\n\r\n if (deviceId) {\r\n options.deviceId = { exact: deviceId };\r\n }\r\n\r\n return Video.createLocalAudioTrack(options).then(newTrack => {\r\n setAudioTrack(newTrack);\r\n return newTrack;\r\n });\r\n }, []);\r\n\r\n const getLocalDataTrack = useCallback((deviceId?: string) => {\r\n const options: CreateLocalTrackOptions = {};\r\n\r\n if (deviceId) {\r\n options.deviceId = { exact: deviceId };\r\n }\r\n var localDataTrack = new Video.LocalDataTrack();\r\n setDataTrack(localDataTrack);\r\n return localDataTrack;\r\n\r\n }, []);\r\n\r\n const getLocalVideoTrack = useCallback((newOptions?: CreateLocalTrackOptions) => {\r\n // In the DeviceSelector and FlipCameraButton components, a new video track is created,\r\n // then the old track is unpublished and the new track is published. Unpublishing the old\r\n // track and publishing the new track at the same time sometimes causes a conflict when the\r\n // track name is 'camera', so here we append a timestamp to the track name to avoid the\r\n // conflict.\r\n const options: CreateLocalTrackOptions = {\r\n ...(DEFAULT_VIDEO_CONSTRAINTS as {}),\r\n name: `camera-${Date.now()}`,\r\n ...newOptions,\r\n };\r\n\r\n return Video.createLocalVideoTrack(options).then(newTrack => {\r\n setVideoTrack(newTrack);\r\n return newTrack;\r\n });\r\n }, []);\r\n\r\n const removeLocalVideoTrack = useCallback(() => {\r\n if (videoTrack) {\r\n videoTrack.stop();\r\n setVideoTrack(undefined);\r\n }\r\n }, [videoTrack]);\r\n\r\n useEffect(() => {\r\n setIsAcquiringLocalTracks(true);\r\n\r\n const dtTrack = new Video.LocalDataTrack();\r\n if (dtTrack) {\r\n setDataTrack(dtTrack as LocalDataTrack);\r\n }\r\n\r\n Video.createLocalTracks({\r\n video: {\r\n ...(DEFAULT_VIDEO_CONSTRAINTS as {}),\r\n name: `camera-${Date.now()}`,\r\n },\r\n audio: true,\r\n })\r\n .then(tracks => {\r\n tracks.push(dtTrack);\r\n\r\n const videoTrack = tracks.find(track => track.kind === 'video');\r\n const audioTrack = tracks.find(track => track.kind === 'audio');\r\n\r\n if (videoTrack) {\r\n setVideoTrack(videoTrack as LocalVideoTrack);\r\n }\r\n if (audioTrack) {\r\n setAudioTrack(audioTrack as LocalAudioTrack);\r\n }\r\n \r\n })\r\n .finally(() => setIsAcquiringLocalTracks(false));\r\n }, []);\r\n\r\n const localTracks = [audioTrack, videoTrack, dataTrack].filter(track => track !== undefined) as (\r\n | LocalAudioTrack\r\n | LocalVideoTrack\r\n | LocalDataTrack\r\n )[];\r\n\r\n return { localTracks, getLocalVideoTrack, getLocalAudioTrack, getLocalDataTrack, isAcquiringLocalTracks, removeLocalVideoTrack };\r\n}\r\n","import { Room, TwilioError } from 'twilio-video';\r\nimport { useEffect } from 'react';\r\n\r\nimport { Callback } from '../../../types';\r\n\r\nexport default function useHandleRoomDisconnectionErrors(room: Room, onError: Callback) {\r\n useEffect(() => {\r\n const onDisconnected = (room: Room, error: TwilioError) => {\r\n if (error) {\r\n onError(error);\r\n }\r\n };\r\n\r\n room.on('disconnected', onDisconnected);\r\n return () => {\r\n room.off('disconnected', onDisconnected);\r\n };\r\n }, [room, onError]);\r\n}\r\n","import { Room } from 'twilio-video';\r\nimport { useEffect } from 'react';\r\n\r\nimport { Callback } from '../../../types';\r\n\r\nexport default function useHandleTrackPublicationFailed(room: Room, onError: Callback) {\r\n const { localParticipant } = room;\r\n useEffect(() => {\r\n if (localParticipant) {\r\n localParticipant.on('trackPublicationFailed', onError);\r\n return () => {\r\n localParticipant.off('trackPublicationFailed', onError);\r\n };\r\n }\r\n }, [localParticipant, onError]);\r\n}\r\n","import { useEffect } from 'react';\r\nimport { Room } from 'twilio-video';\r\nimport { Callback } from '../../../types';\r\n\r\nexport default function useHandleOnDisconnect(room: Room, onDisconnect: Callback) {\r\n useEffect(() => {\r\n room.on('disconnected', onDisconnect);\r\n return () => {\r\n room.off('disconnected', onDisconnect);\r\n };\r\n }, [room, onDisconnect]);\r\n}\r\n","import { useContext } from 'react';\r\nimport { VideoContext } from '../../components/VideoProvider';\r\n\r\nexport default function useVideoContext() {\r\n const context = useContext(VideoContext);\r\n if (!context) {\r\n throw new Error('useVideoContext must be used within a VideoProvider');\r\n }\r\n return context;\r\n}\r\n","import React from \"react\";\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\r\nimport { useAppState } from \"../../../state\";\r\nimport CallEnd from '@material-ui/icons/CallEnd';\r\nimport Fab from '@material-ui/core/Fab';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\n\r\nimport useVideoContext from '../../../hooks/useVideoContext/useVideoContext';\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n fab: {\r\n margin: theme.spacing(1),\r\n },\r\n })\r\n);\r\n\r\nexport default function EndCallButton() {\r\n const classes = useStyles();\r\n const { room } = useVideoContext();\r\n const { isAdmin, initRemoteAction, setIsRoomRecording, isRoomRecording } = useAppState();\r\n\r\n //initRemoteAction\r\n const finishMeeting = () => {\r\n\r\n /* if (isAdmin) {\r\n if (isRoomRecording) {\r\n var strAction = \"stopRecording\";\r\n initRemoteAction(strAction, \"\", \"\").then((response) => {\r\n initRemoteAction(\"terminateRoom\", \"\", \"\").then((response) => {\r\n room.disconnect();\r\n });\r\n });\r\n } else {\r\n initRemoteAction(\"terminateRoom\", \"\", \"\").then((response) => {\r\n room.disconnect();\r\n });\r\n }\r\n\r\n } else {\r\n room.disconnect();\r\n }*/\r\n\r\n room.disconnect();\r\n //setIsRoomRecording(false);\r\n };\r\n\r\n return (\r\n finishMeeting()} placement=\"top\" PopperProps={{ disablePortal: true }}>\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport { LocalAudioTrack, LocalVideoTrack, RemoteAudioTrack, RemoteVideoTrack } from 'twilio-video';\r\n\r\ntype TrackType = LocalAudioTrack | LocalVideoTrack | RemoteAudioTrack | RemoteVideoTrack | undefined;\r\n\r\nexport default function useIsTrackEnabled(track: TrackType) {\r\n const [isEnabled, setIsEnabled] = useState(track ? track.isEnabled : false);\r\n\r\n useEffect(() => {\r\n setIsEnabled(track ? track.isEnabled : false);\r\n\r\n if (track) {\r\n const setEnabled = () => setIsEnabled(true);\r\n const setDisabled = () => setIsEnabled(false);\r\n track.on('enabled', setEnabled);\r\n track.on('disabled', setDisabled);\r\n return () => {\r\n track.off('enabled', setEnabled);\r\n track.off('disabled', setDisabled);\r\n };\r\n }\r\n }, [track]);\r\n\r\n return isEnabled;\r\n}\r\n","import { LocalAudioTrack } from 'twilio-video';\r\nimport { useCallback } from 'react';\r\nimport useIsTrackEnabled from '../useIsTrackEnabled/useIsTrackEnabled';\r\nimport useVideoContext from '../useVideoContext/useVideoContext';\r\n\r\nexport default function useLocalAudioToggle() {\r\n const { localTracks } = useVideoContext();\r\n const audioTrack = localTracks.find(track => track.kind === 'audio') as LocalAudioTrack;\r\n const isEnabled = useIsTrackEnabled(audioTrack);\r\n\r\n const toggleAudioEnabled = useCallback(() => {\r\n if (audioTrack) {\r\n audioTrack.isEnabled ? audioTrack.disable() : audioTrack.enable();\r\n }\r\n }, [audioTrack]);\r\n\r\n const enableAudio = useCallback(() => {\r\n if (audioTrack) {\r\n if (!audioTrack.isEnabled)\r\n audioTrack.enable();\r\n }\r\n }, [audioTrack]);\r\n\r\n\r\n const disableAudio = useCallback(() => {\r\n if (audioTrack) {\r\n if (audioTrack.isEnabled)\r\n audioTrack.disable();\r\n }\r\n }, [audioTrack]);\r\n\r\n return [isEnabled, toggleAudioEnabled, disableAudio, enableAudio] as const;\r\n}\r\n","import React from 'react';\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\r\n\r\nimport Fab from '@material-ui/core/Fab';\r\nimport Mic from '@material-ui/icons/Mic';\r\nimport MicOff from '@material-ui/icons/MicOff';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\n\r\nimport useLocalAudioToggle from '../../../hooks/useLocalAudioToggle/useLocalAudioToggle';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n fab: {\r\n margin: theme.spacing(1),\r\n },\r\n })\r\n);\r\n\r\nexport default function ToggleAudioButton(props: { disabled?: boolean }) {\r\n const classes = useStyles();\r\n const [isAudioEnabled, toggleAudioEnabled] = useLocalAudioToggle();\r\n\r\n return (\r\n \r\n \r\n {isAudioEnabled ? : }\r\n \r\n \r\n );\r\n}\r\n","import React, { useCallback, useRef } from 'react';\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\r\n\r\nimport Fab from '@material-ui/core/Fab';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport Videocam from '@material-ui/icons/Videocam';\r\nimport VideocamOff from '@material-ui/icons/VideocamOff';\r\n\r\nimport useLocalVideoToggle from '../../../hooks/useLocalVideoToggle/useLocalVideoToggle';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n fab: {\r\n margin: theme.spacing(1),\r\n },\r\n })\r\n);\r\n\r\nexport default function ToggleVideoButton(props: { disabled?: boolean }) {\r\n const classes = useStyles();\r\n const [isVideoEnabled, toggleVideoEnabled] = useLocalVideoToggle();\r\n const lastClickTimeRef = useRef(0);\r\n\r\n const toggleVideo = useCallback(() => {\r\n if (Date.now() - lastClickTimeRef.current > 200) {\r\n lastClickTimeRef.current = Date.now();\r\n toggleVideoEnabled();\r\n }\r\n }, [toggleVideoEnabled]);\r\n\r\n return (\r\n \r\n \r\n {isVideoEnabled ? : }\r\n \r\n \r\n );\r\n}\r\n","import { useEffect, useState } from 'react';\r\nimport useVideoContext from '../useVideoContext/useVideoContext';\r\n\r\nimport { Participant, TrackPublication } from 'twilio-video';\r\n\r\n/*\r\n Returns the participant that is sharing their screen (if any). This hook assumes that only one participant\r\n can share their screen at a time.\r\n*/\r\nexport default function useScreenShareParticipant() {\r\n const { room } = useVideoContext();\r\n const [screenShareParticipant, setScreenShareParticipant] = useState();\r\n\r\n useEffect(() => {\r\n if (room.state === 'connected') {\r\n const updateScreenShareParticipant = () => {\r\n setScreenShareParticipant(\r\n Array.from(room.participants.values())\r\n // the screenshare participant could be the localParticipant\r\n .concat(room.localParticipant)\r\n .find((participant: Participant) =>\r\n Array.from(participant.tracks.values()).find(track =>\r\n track.trackName.includes('screen')\r\n )\r\n )\r\n );\r\n };\r\n updateScreenShareParticipant();\r\n\r\n room.on('trackPublished', updateScreenShareParticipant);\r\n room.on('trackUnpublished', updateScreenShareParticipant);\r\n room.on('participantDisconnected', updateScreenShareParticipant);\r\n\r\n // the room object does not emit 'trackPublished' events for the localParticipant,\r\n // so we need to listen for them here.\r\n room.localParticipant.on('trackPublished', updateScreenShareParticipant);\r\n room.localParticipant.on('trackUnpublished', updateScreenShareParticipant);\r\n return () => {\r\n room.off('trackPublished', updateScreenShareParticipant);\r\n room.off('trackUnpublished', updateScreenShareParticipant);\r\n room.off('participantDisconnected', updateScreenShareParticipant);\r\n\r\n room.localParticipant.off('trackPublished', updateScreenShareParticipant);\r\n room.localParticipant.off('trackUnpublished', updateScreenShareParticipant);\r\n };\r\n }\r\n }, [room]);\r\n\r\n return screenShareParticipant;\r\n}\r\n","import React from 'react';\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\r\n\r\nimport Fab from '@material-ui/core/Fab';\r\nimport ScreenShare from '@material-ui/icons/ScreenShare';\r\nimport StopScreenShare from '@material-ui/icons/StopScreenShare';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\n\r\nimport useScreenShareToggle from '../../../hooks/useScreenShareToggle/useScreenShareToggle';\r\nimport useScreenShareParticipant from '../../../hooks/useScreenShareParticipant/useScreenShareParticipant';\r\nimport useVideoContext from '../../../hooks/useVideoContext/useVideoContext';\r\n\r\nexport const SCREEN_SHARE_TEXT = 'Share Screen';\r\nexport const STOP_SCREEN_SHARE_TEXT = 'Stop Sharing Screen';\r\nexport const SHARE_IN_PROGRESS_TEXT = 'Cannot share screen when another user is sharing';\r\nexport const SHARE_NOT_SUPPORTED_TEXT = 'Screen sharing is not supported with this browser';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n fab: {\r\n margin: theme.spacing(1),\r\n '&[disabled]': {\r\n color: 'rgba(225, 225, 225, 0.8)',\r\n backgroundColor: 'rgba(175, 175, 175, 0.6);',\r\n },\r\n },\r\n })\r\n);\r\n\r\nexport default function ToggleScreenShareButton(props: { disabled?: boolean }) {\r\n const classes = useStyles();\r\n const [isScreenShared, toggleScreenShare] = useScreenShareToggle();\r\n const screenShareParticipant = useScreenShareParticipant();\r\n const { room } = useVideoContext();\r\n const disableScreenShareButton = screenShareParticipant && screenShareParticipant !== room.localParticipant;\r\n const isScreenShareSupported = navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia;\r\n const isDisabled = props.disabled || disableScreenShareButton || !isScreenShareSupported;\r\n\r\n let tooltipMessage = SCREEN_SHARE_TEXT;\r\n\r\n if (isScreenShared) {\r\n tooltipMessage = STOP_SCREEN_SHARE_TEXT;\r\n }\r\n\r\n if (disableScreenShareButton) {\r\n tooltipMessage = SHARE_IN_PROGRESS_TEXT;\r\n }\r\n\r\n if (!isScreenShareSupported) {\r\n tooltipMessage = SHARE_NOT_SUPPORTED_TEXT;\r\n }\r\n\r\n return (\r\n \r\n
\r\n {/* The div element is needed because a disabled button will not emit hover events and we want to display\r\n a tooltip when screen sharing is disabled */}\r\n \r\n {isScreenShared ? : }\r\n \r\n
\r\n \r\n );\r\n}\r\n","import { useState, useCallback, useRef } from 'react';\r\nimport useVideoContext from '../useVideoContext/useVideoContext';\r\nimport { LogLevels, Track } from 'twilio-video';\r\n\r\ninterface MediaStreamTrackPublishOptions {\r\n name?: string;\r\n priority: Track.Priority;\r\n logLevel: LogLevels;\r\n}\r\n\r\nexport default function useScreenShareToggle() {\r\n const { room, onError } = useVideoContext();\r\n const [isSharing, setIsSharing] = useState(false);\r\n const stopScreenShareRef = useRef<() => void>(null!);\r\n\r\n const shareScreen = useCallback(() => {\r\n navigator.mediaDevices\r\n .getDisplayMedia({\r\n audio: false,\r\n video: {\r\n frameRate: 10,\r\n height: 1080,\r\n width: 1920,\r\n },\r\n })\r\n .then(stream => {\r\n const track = stream.getTracks()[0];\r\n\r\n // All video tracks are published with 'low' priority. This works because the video\r\n // track that is displayed in the 'MainParticipant' component will have it's priority\r\n // set to 'high' via track.setPriority()\r\n room.localParticipant\r\n .publishTrack(track, {\r\n name: 'screen', // Tracks can be named to easily find them later\r\n priority: 'low', // Priority is set to high by the subscriber when the video track is rendered\r\n } as MediaStreamTrackPublishOptions)\r\n .then(trackPublication => {\r\n stopScreenShareRef.current = () => {\r\n room.localParticipant.unpublishTrack(track);\r\n // TODO: remove this if the SDK is updated to emit this event\r\n room.localParticipant.emit('trackUnpublished', trackPublication);\r\n track.stop();\r\n setIsSharing(false);\r\n };\r\n\r\n track.onended = stopScreenShareRef.current;\r\n setIsSharing(true);\r\n })\r\n .catch(onError);\r\n })\r\n .catch(error => {\r\n // Don't display an error if the user closes the screen share dialog\r\n if (error.name !== 'AbortError' && error.name !== 'NotAllowedError') {\r\n onError(error);\r\n }\r\n });\r\n }, [room, onError]);\r\n\r\n const toggleScreenShare = useCallback(() => {\r\n !isSharing ? shareScreen() : stopScreenShareRef.current();\r\n }, [isSharing, shareScreen, stopScreenShareRef]);\r\n\r\n return [isSharing, toggleScreenShare] as const;\r\n}\r\n","import { useEffect, useState } from 'react';\r\nimport useVideoContext from '../useVideoContext/useVideoContext';\r\n\r\ntype RoomStateType = 'disconnected' | 'connected' | 'reconnecting';\r\n\r\nexport default function useRoomState() {\r\n const { room } = useVideoContext();\r\n const [state, setState] = useState('disconnected');\r\n\r\n useEffect(() => {\r\n const setRoomState = () => setState((room.state || 'disconnected') as RoomStateType);\r\n setRoomState(); \r\n room\r\n .on('disconnected', setRoomState)\r\n .on('reconnected', setRoomState)\r\n .on('reconnecting', setRoomState);\r\n return () => {\r\n room\r\n .off('disconnected', setRoomState)\r\n .off('reconnected', setRoomState)\r\n .off('reconnecting', setRoomState);\r\n };\r\n }, [room]);\r\n\r\n return state;\r\n}\r\n","import React from 'react';\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\r\nimport clsx from 'clsx';\r\n\r\nimport EndCallButton from './EndCallButton/EndCallButton';\r\nimport ToggleAudioButton from './ToggleAudioButton/ToggleAudioButton';\r\nimport ToggleVideoButton from './ToggleVideoButton/ToggleVideoButton';\r\nimport ToggleScreenShareButton from './ToogleScreenShareButton/ToggleScreenShareButton';\r\n\r\nimport useIsUserActive from './useIsUserActive/useIsUserActive';\r\nimport useRoomState from '../../hooks/useRoomState/useRoomState';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n container: {\r\n display: 'flex',\r\n position: 'absolute',\r\n right: '50%',\r\n transform: 'translate(50%, 30px)',\r\n bottom: '50px',\r\n zIndex: 1,\r\n transition: 'opacity 1.2s, transform 1.2s, visibility 0s 1.2s',\r\n opacity: 0,\r\n visibility: 'hidden',\r\n maxWidth: 'min-content',\r\n '&.showControls, &:hover': {\r\n transition: 'opacity 0.6s, transform 0.6s, visibility 0s',\r\n opacity: 1,\r\n visibility: 'visible',\r\n transform: 'translate(50%, 0px)',\r\n },\r\n [theme.breakpoints.down('xs')]: {\r\n bottom: `${theme.sidebarMobileHeight + 3}px`,\r\n },\r\n },\r\n })\r\n);\r\n\r\nexport default function Controls() {\r\n const classes = useStyles();\r\n const roomState = useRoomState();\r\n const isReconnecting = roomState === 'reconnecting';\r\n const isUserActive = useIsUserActive();\r\n const showControls = isUserActive || roomState === 'disconnected';\r\n\r\n return (\r\n
\r\n \r\n \r\n {roomState !== 'disconnected' && (\r\n <>\r\n \r\n \r\n \r\n )}\r\n
\r\n );\r\n}\r\n","import { useEffect, useRef, useState } from 'react';\r\nimport throttle from 'lodash.throttle';\r\n\r\nexport default function useIsUserActive() {\r\n const [isUserActive, setIsUserActive] = useState(true);\r\n const timeoutIDRef = useRef(0);\r\n\r\n useEffect(() => {\r\n const handleUserActivity = throttle(() => {\r\n setIsUserActive(true);\r\n clearTimeout(timeoutIDRef.current);\r\n const timeoutID = window.setTimeout(() => setIsUserActive(false), 5000);\r\n timeoutIDRef.current = timeoutID;\r\n }, 500);\r\n\r\n handleUserActivity();\r\n\r\n window.addEventListener('mousemove', handleUserActivity);\r\n window.addEventListener('click', handleUserActivity);\r\n window.addEventListener('keydown', handleUserActivity);\r\n return () => {\r\n window.removeEventListener('mousemove', handleUserActivity);\r\n window.removeEventListener('click', handleUserActivity);\r\n window.removeEventListener('keydown', handleUserActivity);\r\n clearTimeout(timeoutIDRef.current);\r\n };\r\n }, []);\r\n\r\n return isUserActive;\r\n}\r\n","import React from 'react';\r\n\r\nimport FullscreenIcon from '@material-ui/icons/Fullscreen';\r\nimport fscreen from 'fscreen';\r\nimport FullscreenExitIcon from '@material-ui/icons/FullscreenExit';\r\nimport IconButton from '@material-ui/core/IconButton';\r\n\r\nimport useFullScreenToggle from '../../../hooks/useFullScreenToggle/useFullScreenToggle';\r\n\r\nexport default function ToggleFullscreenButton() {\r\n const [isFullScreen, toggleFullScreen] = useFullScreenToggle();\r\n\r\n return fscreen.fullscreenEnabled ? (\r\n \r\n {isFullScreen ? : }\r\n \r\n ) : null;\r\n}\r\n","import { useCallback, useState, useEffect } from 'react';\r\nimport fscreen from 'fscreen';\r\n\r\nexport default function useFullScreenToggle() {\r\n const [isFullScreen, setIsFullScreen] = useState(!!fscreen.fullscreenElement);\r\n\r\n useEffect(() => {\r\n const onFullScreenChange = () => setIsFullScreen(!!fscreen.fullscreenElement);\r\n fscreen.addEventListener('fullscreenchange', onFullScreenChange);\r\n return () => {\r\n fscreen.removeEventListener('fullscreenchange', onFullScreenChange);\r\n };\r\n }, []);\r\n\r\n const toggleFullScreen = useCallback(() => {\r\n isFullScreen ? fscreen.exitFullscreen() : fscreen.requestFullscreen(document.documentElement);\r\n }, [isFullScreen]);\r\n\r\n return [isFullScreen, toggleFullScreen] as const;\r\n}\r\n","import React from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Avatar from '@material-ui/core/Avatar';\r\nimport { deepOrange, deepPurple } from '@material-ui/core/colors';\r\nimport { styled } from '@material-ui/core/styles';\r\nimport { Member } from 'twilio-chat/lib/member';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n display: 'flex',\r\n '& > *': {\r\n margin: theme.spacing(1),\r\n },\r\n },\r\n orange: {\r\n color: theme.palette.getContrastText(deepOrange[500]),\r\n backgroundColor: deepOrange[500],\r\n },\r\n purple: {\r\n color: theme.palette.getContrastText(deepPurple[500]),\r\n backgroundColor: deepPurple[500],\r\n },\r\n}));\r\n\r\nconst ScrollContainer = styled('div')(({ theme }) => ({\r\n [theme.breakpoints.down('xs')]: {\r\n display: 'flex',\r\n },\r\n}));\r\n\r\ninterface ChatParticipantsProps {\r\n members: [];\r\n}\r\n\r\nexport default function ChatParticipantStrip(props: ChatParticipantsProps) {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n {props.members.map((member: Member) => (\r\n {member.identity.substring(0, 2).toUpperCase()}\r\n ))}\r\n \r\n );\r\n}\r\n","import React, { Component, Fragment } from 'react';\r\nimport { useAppState } from '../../../state';\r\nimport Chat, { Client } from 'twilio-chat';\r\nimport { Chat as ChatUI, ChatMessageSendEvent } from '@progress/kendo-react-conversational-ui';\r\nimport { Channel } from 'twilio-chat/lib/channel';\r\nimport { Message } from 'twilio-chat/lib/message';\r\nimport '@progress/kendo-theme-material/dist/all.css';\r\nimport { Member } from 'twilio-chat/lib/member';\r\nimport ChatParticipantStrip from './ChatParticipantStrip';\r\n\r\n\r\ninterface ChatDialogProps {\r\n username: string;\r\n roomNum: string;\r\n token: string;\r\n meetingNum: string;\r\n}\r\n\r\nclass ChatKendo extends Component {\r\n user: { id: any; name: any; };\r\n client: any;\r\n channel: any;\r\n roomNum: string;\r\n token: string;\r\n meetingNum: string;\r\n\r\n //const[participants, setParticipants] = useState(Array.from(room.participants.values()));\r\n\r\n constructor(props: ChatDialogProps) {\r\n super(props);\r\n\r\n this.state = {\r\n error: null,\r\n isLoading: true,\r\n messages: [],\r\n chatConnected: false,\r\n members: []\r\n };\r\n\r\n this.user = {\r\n id: props.username,\r\n name: props.username\r\n };\r\n\r\n this.roomNum = props.roomNum;\r\n this.token = props.token;\r\n this.meetingNum = props.meetingNum;\r\n\r\n this.setupChatClient = this.setupChatClient.bind(this);\r\n this.messagesLoaded = this.messagesLoaded.bind(this);\r\n this.messageAdded = this.messageAdded.bind(this);\r\n this.sendMessage = this.sendMessage.bind(this);\r\n this.handleError = this.handleError.bind(this);\r\n this.connectChat = this.connectChat.bind(this);\r\n\r\n this.onChannelJoin = this.onChannelJoin.bind(this);\r\n this.onMemberJoin = this.onMemberJoin.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n Chat.create(this.token)\r\n .then(this.setupChatClient);\r\n }\r\n\r\n connectChat() {\r\n const { getToken, guestName, meetingNum } = useAppState();\r\n getToken(guestName, meetingNum)\r\n .then((res: string) => JSON.parse(res))\r\n .then(data => Chat.create(data.token))\r\n .then(this.setupChatClient)\r\n .catch(this.handleError);\r\n }\r\n\r\n handleError(error: any) {\r\n console.error(error);\r\n this.setState({\r\n error: 'Could not load chat.'\r\n });\r\n }\r\n\r\n onChannelJoin(channel: Channel) {\r\n\r\n\r\n }\r\n\r\n onMemberJoin(m: Member) {\r\n // const strMsg = m.identity + ' joined chat';\r\n //console.log(strMsg);\r\n\r\n /*\r\n this.messageAdded({\r\n text: strMsg,\r\n author: { id: \"-\", name: \"...\" },\r\n timestamp: m.dateCreated\r\n });\r\n */\r\n /*\r\n this.setState({\r\n members: this.state.members.filter(function (member: Member) {\r\n return member.sid !== m.sid\r\n })\r\n })*/\r\n /*\r\n let newMembers = this.state.members.filter(function (member: Member) {\r\n return member.sid !== m.sid\r\n });*/\r\n\r\n let ms = [...this.state.members];\r\n if (ms.includes(m) === false)\r\n ms.push(m);\r\n\r\n this.setState({ members: ms });\r\n\r\n\r\n }\r\n\r\n onMemberLeft(m: Member) {\r\n const strMsg = m.identity + ' left chat';\r\n console.log(strMsg);\r\n\r\n /*\r\n this.messageAdded({\r\n text: strMsg,\r\n author: { id: \"\", name: \"...\" },\r\n timestamp: m.dateCreated\r\n });\r\n\r\n this.setState({\r\n members: this.state.members.filter(function (member: Member) {\r\n return member.sid !== m.sid\r\n })\r\n });\r\n */\r\n }\r\n\r\n setupChatClient(client: Client) {\r\n this.client = client;\r\n this.client.on('channelJoined', this.onChannelJoin);\r\n this.client.on('memberJoined', this.onMemberJoin);\r\n this.client.on('memberLeft', this.onMemberLeft);\r\n\r\n this.client\r\n .getChannelByUniqueName(this.meetingNum)\r\n .then((channel: Channel) => channel)\r\n .catch((error: any) => {\r\n return this.client.createChannel({ uniqueName: this.meetingNum, friendlyName: this.meetingNum });\r\n })\r\n .then((channel: Channel) => {\r\n this.channel = channel;\r\n this.channel.join();\r\n })\r\n .then(() => {\r\n this.setState({ isLoading: false });\r\n\r\n this.channel.on('memberJoined', this.onMemberJoin);\r\n this.channel.on('memberLeft', this.onMemberLeft);\r\n\r\n this.channel.getMessages().then(this.messagesLoaded);\r\n this.channel.on('messageAdded', this.messageAdded);\r\n })\r\n .catch(this.handleError);\r\n }\r\n\r\n twilioMessageToKendoMessage(message: Message) {\r\n\r\n var strIdentity = message.author;\r\n var intId = message.author;\r\n const arrName = message.author.split(\"::\");\r\n if (arrName.length === 2) {\r\n strIdentity = arrName[0];\r\n intId = arrName[1];\r\n }\r\n\r\n return {\r\n text: message.body,\r\n //author: { id: message.author, name: message.author },\r\n author: { id: intId, name: strIdentity },\r\n timestamp: message.dateCreated\r\n };\r\n }\r\n\r\n messagesLoaded(messagePage: { items: any[]; }) {\r\n this.setState({\r\n messages: messagePage.items.map(this.twilioMessageToKendoMessage)\r\n });\r\n }\r\n\r\n messageAdded(message: any) {\r\n this.setState((prevState: { messages: any; }) => ({\r\n messages: [\r\n ...prevState.messages,\r\n this.twilioMessageToKendoMessage(message)\r\n ]\r\n }));\r\n }\r\n\r\n sendMessage(event: ChatMessageSendEvent) {\r\n this.channel.sendMessage(event.message.text);\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this.client === undefined)\r\n return;\r\n this.client.shutdown();\r\n }\r\n\r\n render() {\r\n\r\n if (this.state.error) {\r\n return

{this.state.error}

;\r\n } else if (this.state.isLoading) {\r\n return

Loading chat...

;\r\n }\r\n return (\r\n \r\n \r\n name.includes('J'))\r\n onMessageSend={this.sendMessage}\r\n width={500}\r\n />\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default ChatKendo;\r\n\r\n","import React, { PropsWithChildren } from 'react';\r\nimport { createStyles, Theme, withStyles, WithStyles } from '@material-ui/core/styles';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport MuiDialogTitle from '@material-ui/core/DialogTitle';\r\nimport MuiDialogContent from '@material-ui/core/DialogContent';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport MinimizeIcon from '@material-ui/icons/Minimize'\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { useAppState } from '../../../state';\r\nimport { Paper, PaperProps } from '@material-ui/core';\r\nimport Draggable from 'react-draggable';\r\nimport ChatKendo from '../ChatDialog/ChatKendo';\r\n\r\nconst styles = (theme: Theme) =>\r\n createStyles({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n });\r\n\r\nexport interface DialogTitleProps extends WithStyles {\r\n id: string;\r\n children: React.ReactNode;\r\n onClose: () => void;\r\n}\r\n\r\nconst DialogTitle = withStyles(styles)((props: DialogTitleProps) => {\r\n const { children, classes, onClose, ...other } = props;\r\n return (\r\n \r\n {children}\r\n {onClose ? (\r\n \r\n \r\n \r\n ) : null}\r\n \r\n );\r\n});\r\n\r\nconst DialogContent = withStyles((theme: Theme) => ({\r\n root: {\r\n padding: theme.spacing(2),\r\n },\r\n}))(MuiDialogContent);\r\n\r\ninterface ChatDialogProps {\r\n open: boolean;\r\n onClose(): void;\r\n}\r\nfunction PaperComponent(props: PaperProps) {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default function ChatDialog({ open, onClose }: PropsWithChildren) {\r\n const { guestName, meetingNum, meetingTitle, guestToken } = useAppState();\r\n //const [collapse, setCollapse] = React.useState(true);\r\n /*\r\n const handleClick = () => {\r\n setCollapse(!collapse);\r\n };*/\r\n\r\n return (\r\n
\r\n \r\n \r\n Chat: {meetingTitle}\r\n \r\n\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}","import React, { useState, Fragment } from 'react';\r\n\r\nimport ChatIcon from '@material-ui/icons/Chat';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport ChatDialog from '../ChatDialog/ChatDialog';\r\n\r\n\r\n//ChatDialog\r\n//import useFullScreenToggle from '../../../hooks/useFullScreenToggle/useFullScreenToggle';\r\n\r\nexport default function ChatButton() {\r\n const [chatOpen, setChatOpen] = useState(false);\r\n\r\n return (\r\n \r\n { setChatOpen(true) }}>\r\n \r\n \r\n {\r\n setChatOpen(false);\r\n }}\r\n />\r\n \r\n );\r\n}\r\n","\r\nimport { LocalDataTrack } from 'twilio-video';\r\nimport { useCallback } from 'react';\r\nimport useVideoContext from '../useVideoContext/useVideoContext';\r\n\r\nexport default function useSendMessage() {\r\n const { localTracks } = useVideoContext();\r\n const dataTrack = localTracks.find(track => track.kind === 'data') as LocalDataTrack;\r\n\r\n const sendMessage = useCallback((msgType:string, userSid: string) => {\r\n if (dataTrack) {\r\n dataTrack.send(\r\n JSON.stringify({\r\n type: msgType,\r\n sid: userSid,\r\n })\r\n );\r\n }\r\n }, [dataTrack]);\r\n\r\n return [sendMessage] as const;\r\n}\r\n","import React, { Fragment } from 'react';\r\n\r\nimport RecordIcon from '@material-ui/icons/FiberManualRecord';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport { useAppState } from '../../../state';\r\nimport { MESSAGE_TYPES } from '../../../constants';\r\nimport useSendMessage from '../../../hooks/useSendMessage/useSendMessage';\r\n\r\n\r\n//ChatDialog\r\n//import useFullScreenToggle from '../../../hooks/useFullScreenToggle/useFullScreenToggle';\r\n\r\nexport default function RecordButton() {\r\n const { isRoomRecording, setIsRoomRecording, initRemoteAction } = useAppState();\r\n const [sendMessage] = useSendMessage();\r\n\r\n const setText = () => {\r\n return isRoomRecording ? \"Stop Recording\" : \"Record\";\r\n }; \r\n\r\n //initRemoteAction\r\n const toggleRecord = () => {\r\n var strAction = MESSAGE_TYPES.RECORDING_STARTED;\r\n if (isRoomRecording) {\r\n strAction = MESSAGE_TYPES.RECORDING_STOPPED;\r\n }\r\n sendMessage(strAction, \"\");\r\n initRemoteAction(strAction, \"\", \"\").then((response) => {\r\n var t = JSON.parse(response);\r\n if (isRoomRecording) {\r\n setIsRoomRecording(t.msg === \"\" ? false : true);\r\n } else {\r\n setIsRoomRecording(t.msg === \"\" ? true : false);\r\n }\r\n });\r\n };\r\n\r\n return (\r\n \r\n { toggleRecord() }}>\r\n
\r\n {setText()}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n","import React, { PropsWithChildren } from 'react';\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\n\r\nimport { version as appVersion } from '../../../../package.json';\r\nimport Video from 'twilio-video';\r\nimport { useAppState } from '../../../state';\r\n\r\ninterface AboutDialogProps {\r\n open: boolean;\r\n onClose(): void;\r\n}\r\n\r\nfunction AboutDialog({ open, onClose }: PropsWithChildren) {\r\n const { roomType } = useAppState();\r\n return (\r\n \r\n About:\r\n \r\n Browser supported: {String(Video.isSupported)}\r\n SDK Version: {Video.version}\r\n App Version: {appVersion}\r\n Deployed Tag: {process.env.REACT_APP_GIT_TAG || 'N/A'}\r\n Deployed Commit Hash: {process.env.REACT_APP_GIT_COMMIT || 'N/A'}\r\n {roomType && Room Type: {roomType}}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default AboutDialog;\r\n","import { VideoTrack } from 'twilio-video';\r\n\r\nexport type RenderDimensionValue =\r\n | 'low'\r\n | 'cif'\r\n | 'vga'\r\n | 'wvga'\r\n | '540p'\r\n | '720p'\r\n | '960p'\r\n | 'standard1080p'\r\n | 'wide1080p'\r\n | 'default';\r\n\r\nexport interface RenderDimension {\r\n label: string;\r\n value: RenderDimensionValue;\r\n resolution?: VideoTrack.Dimensions;\r\n}\r\n\r\nexport const RenderDimensions: RenderDimension[] = [\r\n {\r\n label: 'Low (160 x 90)',\r\n value: 'low',\r\n resolution: { width: 160, height: 90 },\r\n },\r\n {\r\n label: 'CIF (352 x 288)',\r\n value: 'cif',\r\n resolution: { width: 352, height: 288 },\r\n },\r\n {\r\n label: 'VGA (640 x 480)',\r\n value: 'vga',\r\n resolution: { width: 640, height: 480 },\r\n },\r\n {\r\n label: 'WVGA (800 x 480)',\r\n value: 'wvga',\r\n resolution: { width: 800, height: 480 },\r\n },\r\n {\r\n label: 'HD 540P (960 x 540)',\r\n value: '540p',\r\n resolution: { width: 960, height: 540 },\r\n },\r\n {\r\n label: 'HD 720P (1280 x 720)',\r\n value: '720p',\r\n resolution: { width: 1280, height: 720 },\r\n },\r\n {\r\n label: 'HD 960P (1280 x 960)',\r\n value: '960p',\r\n resolution: { width: 1280, height: 960 },\r\n },\r\n {\r\n label: 'HD Standard 1080P (1440 x 1080)',\r\n value: 'standard1080p',\r\n resolution: { width: 1440, height: 1080 },\r\n },\r\n {\r\n label: 'HD Widescreen 1080P (1920 x 1080)',\r\n value: 'wide1080p',\r\n resolution: { width: 1920, height: 1080 },\r\n },\r\n {\r\n label: 'Server Default',\r\n value: 'default',\r\n resolution: undefined,\r\n },\r\n];\r\n\r\nexport function getResolution(value?: RenderDimensionValue) {\r\n if (typeof value === 'undefined') {\r\n return undefined;\r\n }\r\n\r\n return RenderDimensions.find(item => item.value === value)?.resolution;\r\n}\r\n","import React, { useCallback } from 'react';\r\nimport {\r\n DialogContent,\r\n FormControl,\r\n Grid,\r\n InputLabel,\r\n MenuItem,\r\n Select,\r\n TextField,\r\n Typography,\r\n} from '@material-ui/core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { inputLabels, Settings } from '../../../state/settings/settingsReducer';\r\nimport { RenderDimensions } from '../../../state/settings/renderDimensions';\r\nimport { useAppState } from '../../../state';\r\nimport useRoomState from '../../../hooks/useRoomState/useRoomState';\r\n\r\nconst useStyles = makeStyles({\r\n formControl: {\r\n display: 'block',\r\n margin: '1.5em 0',\r\n '&:first-child': {\r\n margin: '0 0 1.5em 0',\r\n },\r\n },\r\n label: {\r\n width: '133%', // Labels have scale(0.75) applied to them, so this effectively makes the width 100%\r\n },\r\n});\r\n\r\nconst withDefault = (val?: string) => (typeof val === 'undefined' ? 'default' : val);\r\n\r\nconst RenderDimensionItems = RenderDimensions.map(({ label, value }) => (\r\n \r\n {label}\r\n \r\n));\r\n\r\nexport default function ConnectionOptions({ className, hidden }: { className?: string; hidden?: boolean }) {\r\n const classes = useStyles();\r\n const { settings, dispatchSetting } = useAppState();\r\n const roomState = useRoomState();\r\n const isDisabled = roomState !== 'disconnected';\r\n\r\n const handleChange = useCallback(\r\n (e: React.ChangeEvent<{ value: unknown; name?: string }>) => {\r\n dispatchSetting({ name: e.target.name as keyof Settings, value: e.target.value as string });\r\n },\r\n [dispatchSetting]\r\n );\r\n\r\n const handleNumberChange = useCallback(\r\n (e: React.ChangeEvent<{ value: unknown; name?: string }>) => {\r\n if (!/[^\\d]/.test(e.target.value as string)) handleChange(e);\r\n },\r\n [handleChange]\r\n );\r\n\r\n return (\r\n \r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport { AudioTrack, VideoTrack } from 'twilio-video';\r\n\r\n/*\r\n * This hook allows components to reliably use the 'mediaStreamTrack' property of\r\n * an AudioTrack or a VideoTrack. Whenever 'localTrack.restart(...)' is called, it\r\n * will replace the mediaStreamTrack property of the localTrack, but the localTrack\r\n * object will stay the same. Therefore this hook is needed in order for components\r\n * to rerender in response to the mediaStreamTrack changing.\r\n */\r\nexport default function useMediaStreamTrack(track?: AudioTrack | VideoTrack) {\r\n const [mediaStreamTrack, setMediaStreamTrack] = useState(track?.mediaStreamTrack);\r\n\r\n useEffect(() => {\r\n setMediaStreamTrack(track?.mediaStreamTrack);\r\n\r\n if (track) {\r\n const handleStarted = () => setMediaStreamTrack(track.mediaStreamTrack);\r\n track.on('started', handleStarted);\r\n return () => {\r\n track.off('started', handleStarted);\r\n };\r\n }\r\n }, [track]);\r\n\r\n return mediaStreamTrack;\r\n}\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport { AudioTrack, LocalAudioTrack, RemoteAudioTrack } from 'twilio-video';\r\nimport { interval } from 'd3-timer';\r\nimport MicOff from '@material-ui/icons/MicOff';\r\nimport useIsTrackEnabled from '../../hooks/useIsTrackEnabled/useIsTrackEnabled';\r\nimport useMediaStreamTrack from '../../hooks/useMediaStreamTrack/useMediaStreamTrack';\r\n\r\nlet clipId = 0;\r\nconst getUniqueClipId = () => clipId++;\r\n\r\n// @ts-ignore\r\nconst AudioContext = window.AudioContext || window.webkitAudioContext;\r\nlet audioContext: AudioContext;\r\n\r\nexport function initializeAnalyser(stream: MediaStream) {\r\n audioContext = audioContext || new AudioContext();\r\n const audioSource = audioContext.createMediaStreamSource(stream);\r\n\r\n const analyser = audioContext.createAnalyser();\r\n analyser.smoothingTimeConstant = 0.4;\r\n analyser.fftSize = 512;\r\n\r\n audioSource.connect(analyser);\r\n return analyser;\r\n}\r\n\r\nfunction AudioLevelIndicator({\r\n size,\r\n audioTrack,\r\n background,\r\n}: {\r\n size?: number;\r\n audioTrack?: AudioTrack;\r\n background?: string;\r\n}) {\r\n const SIZE = size || 24;\r\n const SVGRectRef = useRef(null);\r\n const [analyser, setAnalyser] = useState();\r\n const isTrackEnabled = useIsTrackEnabled(audioTrack as LocalAudioTrack | RemoteAudioTrack);\r\n const mediaStreamTrack = useMediaStreamTrack(audioTrack);\r\n\r\n useEffect(() => {\r\n if (audioTrack && mediaStreamTrack && isTrackEnabled) {\r\n // Here we create a new MediaStream from a clone of the mediaStreamTrack.\r\n // A clone is created to allow multiple instances of this component for a single\r\n // AudioTrack on iOS Safari.\r\n let newMediaStream = new MediaStream([mediaStreamTrack.clone()]);\r\n\r\n // Here we listen for the 'stopped' event on the audioTrack. When the audioTrack is stopped,\r\n // we stop the cloned track that is stored in 'newMediaStream'. It is important that we stop\r\n // all tracks when they are not in use. Browsers like Firefox don't let you create a new stream\r\n // from a new audio device while the active audio device still has active tracks.\r\n const stopAllMediaStreamTracks = () => newMediaStream.getTracks().forEach(track => track.stop());\r\n audioTrack.on('stopped', stopAllMediaStreamTracks);\r\n\r\n const reinitializeAnalyser = () => {\r\n stopAllMediaStreamTracks();\r\n newMediaStream = new MediaStream([mediaStreamTrack.clone()]);\r\n setAnalyser(initializeAnalyser(newMediaStream));\r\n };\r\n\r\n setAnalyser(initializeAnalyser(newMediaStream));\r\n\r\n // Here we reinitialize the AnalyserNode on focus to avoid an issue in Safari\r\n // where the analysers stop functioning when the user switches to a new tab\r\n // and switches back to the app.\r\n window.addEventListener('focus', reinitializeAnalyser);\r\n\r\n return () => {\r\n stopAllMediaStreamTracks();\r\n window.removeEventListener('focus', reinitializeAnalyser);\r\n audioTrack.off('stopped', stopAllMediaStreamTracks);\r\n };\r\n }\r\n }, [isTrackEnabled, mediaStreamTrack, audioTrack]);\r\n\r\n useEffect(() => {\r\n const SVGClipElement = SVGRectRef.current;\r\n\r\n if (isTrackEnabled && SVGClipElement && analyser) {\r\n const sampleArray = new Uint8Array(analyser.frequencyBinCount);\r\n\r\n const timer = interval(() => {\r\n analyser.getByteFrequencyData(sampleArray);\r\n let values = 0;\r\n\r\n const length = sampleArray.length;\r\n for (let i = 0; i < length; i++) {\r\n values += sampleArray[i];\r\n }\r\n\r\n const volume = Math.min(21, Math.max(0, Math.log10(values / length / 3) * 14));\r\n\r\n SVGClipElement?.setAttribute('y', String(21 - volume));\r\n }, 50);\r\n\r\n return () => {\r\n SVGClipElement.setAttribute('y', '21');\r\n timer.stop();\r\n };\r\n }\r\n }, [isTrackEnabled, analyser]);\r\n\r\n // Each instance of this component will need a unique HTML ID\r\n const clipPathId = `audio-level-clip-${getUniqueClipId()}`;\r\n\r\n return isTrackEnabled ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n );\r\n}\r\n\r\nexport default React.memo(AudioLevelIndicator);\r\n","import React from 'react';\r\nimport { LocalAudioTrack } from 'twilio-video';\r\nimport useVideoContext from '../../../../hooks/useVideoContext/useVideoContext';\r\nimport AudioLevelIndicator from '../../../AudioLevelIndicator/AudioLevelIndicator';\r\n\r\nexport default function LocalAudioLevelIndicator() {\r\n const { localTracks } = useVideoContext();\r\n const audioTrack = localTracks.find(track => track.kind === 'audio') as LocalAudioTrack;\r\n\r\n return ;\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport { ensureMediaPermissions } from '../../../../utils';\r\n\r\nexport function useDevices() {\r\n const [devices, setDevices] = useState([]);\r\n\r\n useEffect(() => {\r\n const getDevices = () =>\r\n ensureMediaPermissions().then(() =>\r\n navigator.mediaDevices.enumerateDevices().then(devices => setDevices(devices))\r\n );\r\n navigator.mediaDevices.addEventListener('devicechange', getDevices);\r\n getDevices();\r\n\r\n return () => {\r\n navigator.mediaDevices.removeEventListener('devicechange', getDevices);\r\n };\r\n }, []);\r\n\r\n return devices;\r\n}\r\n\r\nexport function useAudioInputDevices() {\r\n const devices = useDevices();\r\n return devices.filter(device => device.kind === 'audioinput');\r\n}\r\n\r\nexport function useVideoInputDevices() {\r\n const devices = useDevices();\r\n return devices.filter(device => device.kind === 'videoinput');\r\n}\r\n\r\nexport function useAudioOutputDevices() {\r\n const devices = useDevices();\r\n return devices.filter(device => device.kind === 'audiooutput');\r\n}\r\n","import React from 'react';\r\nimport { FormControl, MenuItem, Typography, Select } from '@material-ui/core';\r\nimport LocalAudioLevelIndicator from '../LocalAudioLevelIndicator/LocalAudioLevelIndicator';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { useAudioInputDevices } from '../deviceHooks/deviceHooks';\r\nimport useMediaStreamTrack from '../../../../hooks/useMediaStreamTrack/useMediaStreamTrack';\r\nimport useVideoContext from '../../../../hooks/useVideoContext/useVideoContext';\r\nimport { LocalAudioTrack } from 'twilio-video';\r\n\r\nconst useStyles = makeStyles({\r\n container: {\r\n display: 'flex',\r\n alignItems: 'flex-end',\r\n justifyContent: 'space-between',\r\n },\r\n});\r\n\r\nexport default function AudioInputList() {\r\n const classes = useStyles();\r\n const audioInputDevices = useAudioInputDevices();\r\n const { localTracks } = useVideoContext();\r\n\r\n const localAudioTrack:LocalAudioTrack = localTracks.find(track => track.kind === 'audio') as LocalAudioTrack;\r\n const mediaStreamTrack = useMediaStreamTrack(localAudioTrack);\r\n const localAudioInputDeviceId = mediaStreamTrack?.getSettings().deviceId;\r\n\r\n function replaceTrack(newDeviceId: string) {\r\n localAudioTrack?.restart({ deviceId: { exact: newDeviceId } });\r\n }\r\n\r\n return (\r\n
\r\n
\r\n {audioInputDevices.length > 1 ? (\r\n \r\n Audio Input:\r\n \r\n \r\n ) : (\r\n <>\r\n Audio Input:\r\n {localAudioTrack?.mediaStreamTrack.label || 'No Local Audio'}\r\n \r\n )}\r\n
\r\n \r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport { FormControl, MenuItem, Typography, Select } from '@material-ui/core';\r\nimport { useAppState } from '../../../../state';\r\nimport { useAudioOutputDevices } from '../deviceHooks/deviceHooks';\r\n\r\nexport default function AudioOutputList() {\r\n const audioOutputDevices = useAudioOutputDevices();\r\n const { activeSinkId, setActiveSinkId } = useAppState();\r\n const activeOutputLabel = audioOutputDevices.find(device => device.deviceId === activeSinkId)?.label;\r\n\r\n return (\r\n
\r\n {audioOutputDevices.length > 1 ? (\r\n \r\n Audio Output:\r\n \r\n \r\n ) : (\r\n <>\r\n Audio Output:\r\n {activeOutputLabel || 'System Default Audio Output'}\r\n \r\n )}\r\n
\r\n );\r\n}\r\n","import React, { useRef, useEffect } from 'react';\r\nimport { IVideoTrack } from '../../types';\r\nimport { styled } from '@material-ui/core/styles';\r\nimport { Track } from 'twilio-video';\r\nimport useMediaStreamTrack from '../../hooks/useMediaStreamTrack/useMediaStreamTrack';\r\n\r\nconst Video = styled('video')({\r\n width: '100%',\r\n maxHeight: '100%',\r\n objectFit: 'contain',\r\n});\r\n\r\ninterface VideoTrackProps {\r\n track: IVideoTrack;\r\n isLocal?: boolean;\r\n priority?: Track.Priority | null;\r\n}\r\n\r\nexport default function VideoTrack({ track, isLocal, priority }: VideoTrackProps) {\r\n const ref = useRef(null!);\r\n const mediaStreamTrack = useMediaStreamTrack(track);\r\n\r\n useEffect(() => {\r\n const el = ref.current;\r\n el.muted = true;\r\n if (track.setPriority && priority) {\r\n track.setPriority(priority);\r\n }\r\n track.attach(el);\r\n return () => {\r\n track.detach(el);\r\n if (track.setPriority && priority) {\r\n // Passing `null` to setPriority will set the track's priority to that which it was published with.\r\n track.setPriority(null);\r\n }\r\n };\r\n }, [track, priority]);\r\n\r\n // The local video track is mirrored if it is not facing the environment.\r\n const isFrontFacing = mediaStreamTrack?.getSettings().facingMode !== 'environment';\r\n const style = isLocal && isFrontFacing ? { transform: 'rotateY(180deg)' } : {};\r\n\r\n return