244 lines
8.7 KiB
CoffeeScript
244 lines
8.7 KiB
CoffeeScript
$ = jQuery
|
|
context = window
|
|
logger = context.JK.logger
|
|
broadcastActions = @BroadcastActions
|
|
SessionActions = @SessionActions
|
|
|
|
rest = context.JK.Rest()
|
|
|
|
broadcastActions.load.listen (args...) ->
|
|
rest.getBroadcastNotification(args...)
|
|
.done(broadcastActions.load.completed)
|
|
.fail(broadcastActions.load.failed)
|
|
|
|
BroadcastStore = Reflux.createStore(
|
|
{
|
|
listenables: broadcastActions
|
|
|
|
currentSession: null
|
|
currentLesson: null
|
|
broadcast: null
|
|
currentLessonTimer: null
|
|
teacherFault: false
|
|
isJamClass: false
|
|
sessionRules: null
|
|
subscriptionRules: null
|
|
subscriptionConcern: null
|
|
currentSubscriptionTimer: null
|
|
init: ->
|
|
this.listenTo(context.AppStore, this.onAppInit)
|
|
this.listenTo(context.SessionStore, this.onSessionChange)
|
|
this.listenTo(context.NavStore, this.onNavChange)
|
|
|
|
onAppInit: (@app) ->
|
|
@lessonUtils = context.JK.LessonUtils
|
|
|
|
lessonTick: () ->
|
|
@timeManagement()
|
|
@changed()
|
|
|
|
subscriptionTick: () ->
|
|
@subscriptionManagement()
|
|
@changed()
|
|
|
|
openBrowserToPayment: () ->
|
|
context.JK.popExternalLink("/client#/account/subscription", true)
|
|
|
|
openBrowserToPlanComparison: () ->
|
|
context.JK.popExternalLink("https://jamkazam.freshdesk.com/support/solutions/articles/66000122535-what-are-jamkazam-s-free-vs-premium-features-")
|
|
return 'noclose'
|
|
|
|
subscriptionManagement: () ->
|
|
@subscriptionConcern.until = @lessonUtils.getTimeRemaining(@subscriptionConcern.main_concern_time)
|
|
if @session?.participants.length > 1 && @subscriptionConcern.until.total < -30000
|
|
leaveBehavior =
|
|
location: "/client#/findSession"
|
|
buttons = []
|
|
buttons.push({name: 'CLOSE', buttonStyle: 'button-grey'})
|
|
buttons.push({name: 'COMPARE PLANS', buttonStyle: 'button-grey', click: (() => (@openBrowserToPlanComparison()))})
|
|
buttons.push({
|
|
name: 'UPGRADE PLAN',
|
|
buttonStyle: 'button-orange',
|
|
click: (() => (@openBrowserToPayment()))
|
|
})
|
|
|
|
if @subscriptionConcern.main_concern_type == "remaining_month_play_time"
|
|
context.JK.Banner.show({
|
|
title: "Out of Time For This Month",
|
|
html: context._.template($('#template-no-remaining-month-play-time').html(), {}, { variable: 'data' }),
|
|
buttons: buttons});
|
|
else
|
|
context.JK.Banner.show({
|
|
title: "Out of Time For This Session",
|
|
html: context._.template($('#template-no-remaining-session-play-time').html(), {}, { variable: 'data' }),
|
|
buttons: buttons});
|
|
|
|
SessionActions.leaveSession.trigger(leaveBehavior)
|
|
|
|
|
|
timeManagement: () ->
|
|
lastCheck = $.extend({}, @currentLesson)
|
|
lessonSession = @currentLesson
|
|
lessonSession.until = @lessonUtils.getTimeRemaining(lessonSession.scheduled_start)
|
|
if lessonSession.until.total < 0
|
|
# we are past the start time
|
|
if lessonSession.until.total > -(10 * 60 * 1000) # 10 minutes
|
|
lessonSession.initialWindow = true
|
|
else
|
|
lessonSession.initialWindow = false
|
|
lessonSession.beforeSession = false
|
|
else
|
|
# we are before the due time
|
|
lessonSession.initialWindow = false
|
|
lessonSession.beforeSession = true
|
|
|
|
# if we've transitioned to a new window
|
|
|
|
if !lessonSession.beforeSession && ((lastCheck.initialWindow || !lastCheck.initialWindow?) && !lessonSession.initialWindow)
|
|
logger.debug("BroadcastStore: lesson session 'initial window' transition")
|
|
rest.getLessonAnalysis({id: lessonSession.id}).done((response) => @lessonAnalysisDone(response)).fail(@app.ajaxError)
|
|
|
|
lessonAnalysisDone: (@analysis) ->
|
|
|
|
if !@currentLesson?
|
|
logger.debug("BroadcastStore: ignoring lessonAnalysisDone")
|
|
return
|
|
|
|
if @analysis.status == 'completed'
|
|
logger.debug("BroadcastStore: lesson is over")
|
|
@currentLesson.completed = true
|
|
@currentLesson.success = @analysis.success
|
|
@clearLessonTimer()
|
|
@changed()
|
|
else if @analysis.analysis.reason != 'teacher_fault'
|
|
logger.debug("BroadcastStore: not teacher fault; clearing lesson info")
|
|
@clearLesson()
|
|
else
|
|
logger.debug("BroadcastStore: teacher is at fault")
|
|
@teacherFault = true
|
|
@clearLessonTimer()
|
|
@changed()
|
|
|
|
clearLesson: () ->
|
|
if @currentLesson?
|
|
@currentLesson = null
|
|
@clearLessonTimer()
|
|
@teacherFault = false
|
|
@changed()
|
|
|
|
clearSubscription: () ->
|
|
@subscriptionConcern = null
|
|
@clearSubscriptionTimer()
|
|
@changed()
|
|
|
|
clearLessonTimer: () ->
|
|
if @currentLessonTimer?
|
|
clearInterval(@currentLessonTimer)
|
|
@currentLessonTimer = null
|
|
|
|
clearSubscriptionTimer: () ->
|
|
if @currentSubscriptionTimer?
|
|
clearInterval(@currentSubscriptionTimer)
|
|
@currentSubscriptionTimer = null
|
|
|
|
onNavChange: (nav) ->
|
|
path = nav.screenPath.toLowerCase()
|
|
@isJamClass = path.indexOf('jamclass') > -1 || path.indexOf('teacher') > -1
|
|
@changed()
|
|
|
|
onSessionChange: (session) ->
|
|
|
|
@session = session
|
|
currentSession = session.session
|
|
if currentSession? && session.inSession()
|
|
@subscriptionRules = session.subscriptionRules
|
|
@sessionRules = session.sessionRules
|
|
|
|
if @subscriptionRules
|
|
|
|
if !@subscriptionRules.remaining_month_until? && !@sessionRules.remaining_session_until?
|
|
console.log("no license issues")
|
|
@subscriptionConcern = null
|
|
else
|
|
@subscriptionConcern = {}
|
|
@subscriptionConcern.participants = @session?.participants().length
|
|
if !@subscriptionRules.remaining_month_until?
|
|
@subscriptionConcern.main_concern_time = @sessionRules.remaining_session_until
|
|
@subscriptionConcern.main_concern_type = "remaining_session_play_time"
|
|
else if !@sessionRules.remaining_session_play_time?
|
|
@subscriptionConcern.main_concern_time = @subscriptionRules.remaining_month_until
|
|
@subscriptionConcern.main_concern_type = "remaining_month_play_time"
|
|
else
|
|
if @sessionRules.remaining_session_play_time < @subscriptionRules.remaining_month_play_time
|
|
@subscriptionConcern.main_concern_time = @sessionRules.remaining_session_until
|
|
@subscriptionConcern.main_concern_type = "remaining_session_play_time"
|
|
else
|
|
@subscriptionConcern.main_concern_time = @subscriptionRules.remaining_month_until
|
|
@subscriptionConcern.main_concern_type = "remaining_month_play_time"
|
|
|
|
@subscriptionManagement()
|
|
#logger.debug("BroadcastStore: session can play until: ", @subscriptionConcern.until, @subscriptionConcern.main_concert_time)
|
|
if !@currentSubscriptionTimer?
|
|
@currentSubscriptionTimer = setInterval((() => @subscriptionTick()), 1000)
|
|
@changed()
|
|
|
|
if currentSession.lesson_session?
|
|
@currentSession = currentSession
|
|
|
|
lessonSession = currentSession.lesson_session
|
|
# so that receivers can check type of info coming at them via one-way events
|
|
lessonSession.isLesson = true
|
|
|
|
if lessonSession.status == 'completed'
|
|
lessonSession.completed = true
|
|
lessonSession.success = lessonSession.success
|
|
#else
|
|
# rest.getLessonAnalysis({id: lessonSession.id}).done((response) => @lessonAnalysisDone(response)).fail(@app.ajaxError)
|
|
|
|
@currentLesson = lessonSession
|
|
@timeManagement()
|
|
logger.debug("BroadcastStore: currentLesson until: ", @currentLesson.until, lessonSession.scheduled_start)
|
|
if !@currentLessonTimer?
|
|
@currentLessonTimer = setInterval((() => @lessonTick()), 1000)
|
|
@changed()
|
|
else
|
|
@clearLesson()
|
|
@clearSubscription()
|
|
|
|
onLoad: () ->
|
|
logger.debug("loading broadcast notification...")
|
|
|
|
onLoadCompleted: (response) ->
|
|
if response.id?
|
|
logger.debug("broadcast notification sync completed")
|
|
@broadcast = response
|
|
@changed()
|
|
|
|
|
|
onLoadFailed: (jqXHR) ->
|
|
if jqXHR.status != 404
|
|
logger.error("broadcast notification sync failed")
|
|
|
|
onHide: () ->
|
|
@broadcast = null
|
|
@changed()
|
|
|
|
changed: () ->
|
|
if @subscriptionConcern?
|
|
this.trigger({subscriptionConcern: @subscriptionConcern})
|
|
else if @currentLesson?
|
|
lessonNotification = $.extend({}, @currentLesson)
|
|
lessonNotification.isLesson = true
|
|
this.trigger(lessonNotification)
|
|
else if @isJamClass
|
|
this.trigger({isJamClass: true})
|
|
else if @broadcast?
|
|
this.trigger(@broadcast)
|
|
else
|
|
this.trigger(null)
|
|
}
|
|
)
|
|
|
|
context.JK.Stores.Broadcast = BroadcastStore
|
|
console.log("BroadcastStore finished")
|