jam-cloud/web/app/assets/javascripts/react-components/stores/VideoStore.js.coffee

243 lines
8.2 KiB
CoffeeScript

$ = jQuery
context = window
logger = context.JK.logger
rest = context.JK.Rest()
EVENTS = context.JK.EVENTS
NAMED_MESSAGES = context.JK.NAMED_MESSAGES
VideoActions = @VideoActions
BackendToFrontendFPS = {
0: 30,
1: 24,
2: 20,
3: 15,
4: 10
}
@VideoStore = Reflux.createStore(
{
listenables: VideoActions
logger: context.JK.logger
videoShared: false
videoOpen : false
state : null
everDisabled : false
init: ->
this.listenTo(context.AppStore, this.onAppInit)
onAppInit: (@app) ->
# someone has requested us to refresh our config
onRefresh: ->
# don't do any check if this is a client with no video enabled
return unless context.jamClient.FTUECurrentSelectedVideoDevice?
videoEnabled = context.jamClient.FTUEGetVideoShareEnable()
@videoEnabled = videoEnabled
if videoEnabled
currentDevice = context.jamClient.FTUECurrentSelectedVideoDevice()
deviceNames = context.jamClient.FTUEGetVideoCaptureDeviceNames()
#deviceCaps = context.jamClient.FTUEGetVideoCaptureDeviceCapabilities()
captureResolutions = context.jamClient.FTUEGetCaptureResolution()
currentCaptureResolution = context.jamClient.FTUEGetCurrentCaptureResolution()
logger.debug("captureResolutions, currentCaptureResolution", captureResolutions, currentCaptureResolution)
else
@everDisabled = true
# don't talk to the backend when video is disabled; avoiding crashes
currentDevice = null
deviceNames = {}
captureResolutions: {}
currentCaptureResolution: null
frameRates: {}
#deviceCaps: deviceCaps,
@state = {
currentDevice: currentDevice,
deviceNames: deviceNames,
captureResolutions: captureResolutions,
currentCaptureResolution: currentCaptureResolution,
videoShared: @videoShared
videoOpen: @videoOpen,
videoEnabled: videoEnabled,
everDisabled: @everDisabled
}
this.trigger(@state)
onSetVideoEnabled: (enable) ->
return unless context.jamClient.FTUESetVideoShareEnable?
context.jamClient.FTUESetVideoShareEnable(enable)
# keep state in sync
@state.videoEnabled = enable
@onRefresh()
onStartVideo: ->
return unless context.jamClient.SessStartVideoSharing?
if @howtoWindow?
@howtoWindow.close()
@howtoWindow = null
#else # TESTING
# @howtoWindow = window.open("/popups/how-to-use-video", 'How to Use Video', 'scrollbars=yes,toolbar=no,status=no,height=315,width=320')
@logger.debug("SessStartVideoSharing()")
context.jamClient.SessStartVideoSharing(0)
@videoShared = true
@state.videoShared = @videoShared
this.trigger(@state)
onStopVideo: ->
if @videoShared
@logger.debug("SessStopVideoSharing()")
context.jamClient.SessStopVideoSharing()
@videoShared = false
@state.videoShared = @videoShared
this.trigger(@state)
onBringVideoToFront: ->
if @videoShared
@logger.debug("BringVideoToFront")
context.jamClient.BringVideoWindowToFront();
onTestVideo: () ->
return unless context.jamClient.testVideoRender?
result = context.jamClient.testVideoRender()
if !result
@app.layout.notify({title: 'Unable to initialize video window', text: "Please contact support@jamkazam.com"})
onToggleVideo: () ->
if @videoShared
@onBringVideoToFront()
else
@onStartVideo()
onSetCaptureResolution: (resolution) ->
@logger.debug("set capture resolution: #{resolution}")
context.jamClient.FTUESetCaptureResolution(resolution)
@state.currentCaptureResolution = resolution
this.trigger(@state)
onSetSendFrameRate: (frameRates) ->
@logger.debug("set capture frame rate: #{frameRates}")
context.jamClient.FTUESetSendFrameRates(frameRates)
@state.currentFrameRate = frameRates
this.trigger(@state)
onRefreshVideoState:()->
@logger.debug("onRefreshVideoState")
openVideoSources = context.jamClient.getOpenVideoSources()
@logger.debug("onRefreshVideoState", openVideoSources)
# possible keys, all bool values
#"session_window", "webcam1", "webcam2", "screen_capture"
# ex: with mac webcam open only: session_window: 2, webcam1: 1}
# no webcam open: Object {}
@openVideoSources = openVideoSources
@anyVideoOpen = Object.keys(openVideoSources).length > 0
@state.anyVideoOpen = Object.keys(openVideoSources).length > 0
this.trigger(@state)
onSelectDevice: (device, caps) ->
# don't do anything if no video capabilities
return unless context.jamClient.FTUESelectVideoCaptureDevice?
result = context.jamClient.FTUESelectVideoCaptureDevice(device, caps)
if(!result)
@logger.error("onSelectDevice failed with device #{device}")
@app.layout.notify({title: 'Unable to select webcam', text: "Please try reconnecting webcam."})
else
@state.currentDevice = context.jamClient.FTUECurrentSelectedVideoDevice();
this.trigger(@state)
onVideoWindowOpened: () ->
@onRefresh() unless @state?
@logger.debug("in session? #{context.SessionStore.inSession()}, currentDevice? #{@state?.currentDevice?}, videoShared? #{@videoShared}")
if context.SessionStore.inSession() && @state.currentDevice? && Object.keys(@state.currentDevice).length > 0 && !@videoShared
context.JK.ModUtils.shouldShow(NAMED_MESSAGES.HOWTO_USE_VIDEO_NOSHOW).done((shouldShow) =>
@logger.debug("checking if user has 'should show' on video howto: #{shouldShow}")
if shouldShow
@howtoWindow = window.open("/popups/how-to-use-video", 'How to Use Video', 'scrollbars=yes,toolbar=no,status=no,height=315,width=320')
)
#@howtoWindo.ParentRecordingStore = context.RecordingStore
#@howtoWindo.ParentIsRecording = @recordingModel.isRecording()
@videoOpen = true
@state.videoOpen = @videoOpen
this.trigger(@state)
onVideoWindowClosed: () ->
@onRefresh() unless @state?
if @howtoWindow?
@howtoWindow.close()
@howtoWindow = null
@videoOpen = false
@state.videoOpen = @videoOpen
@videoShared = false
@state.videoShared = @videoShared
this.trigger(@state)
onHowToUseVideoPopupClosed: (dontShow) ->
if (dontShow)
@logger.debug("requesting that user no longer see how-to-use-video")
context.JK.ModUtils.updateNoShow(NAMED_MESSAGES.HOWTO_USE_VIDEO_NOSHOW);
logger.debug("how-to-use-video popup closed")
@howtoWindow = null
onConfigureVideoPopupClosed: (dontShow) ->
if (dontShow)
@logger.debug("requesting that user no longer see configure-video")
context.JK.ModUtils.updateNoShow(NAMED_MESSAGES.CONFIGURE_VIDEO_NOSHOW);
logger.debug("configure-video popup closed")
@configureWindow = null
# if the user passes all the safeguards, let's see if we should get them to configure video
onCheckPromptConfigureVideo: () ->
# don't do any check if this is a client with no video enabled
return unless context.jamClient.FTUECurrentSelectedVideoDevice?
@onRefresh() unless @state?
@logger.debug("checkPromptConfigureVideo", @state.currentDevice, @state.deviceNames)
# if no device configured and this is the native client and if you have at least 1 video
# currentDevice, from the backend, is '{'':''}' in the case of no device configured. But we also check for an empty object, or null object.
if (!@state.currentDevice? || Object.keys(@state.currentDevice).length == 0 || (Object.keys(@state.currentDevice).length == 1 && @state.currentDevice[''] == '')) && gon?.isNativeClient && Object.keys(@state.deviceNames).length > 0
# and if they haven't said stop bothering me about this
context.JK.ModUtils.shouldShow(NAMED_MESSAGES.CONFIGURE_VIDEO_NOSHOW).done((shouldShow) =>
@logger.debug("checking if user has 'should show' on video config: #{shouldShow}")
if shouldShow
@configureWindow = window.open("/popups/configure-video", 'Configure Video', 'scrollbars=yes,toolbar=no,status=no,height=395,width=444')
)
isVideoEnabled:() ->
return @videoEnabled
}
)