251 lines
6.9 KiB
CoffeeScript
251 lines
6.9 KiB
CoffeeScript
$ = jQuery
|
|
context = window
|
|
logger = context.JK.logger
|
|
SessionStore = context.SessionStore
|
|
|
|
@ChatStore = Reflux.createStore(
|
|
{
|
|
listenables: @ChatActions
|
|
|
|
limit: 20,
|
|
currentPage: 0,
|
|
next: null,
|
|
channel: 'global',
|
|
systemMsgId: 0
|
|
msgs: {global:[], session:[]}
|
|
max_global_msgs: 100
|
|
channelType: null
|
|
|
|
init: () ->
|
|
# Register with the app store to get @app
|
|
this.listenTo(context.AppStore, this.onAppInit)
|
|
this.listenTo(context.UserActivityStore, this.onUserActivityChanged)
|
|
|
|
onAppInit: (@app) ->
|
|
if context.JK.currentUserId?
|
|
@fetchHistory()
|
|
|
|
onUserActivityChanged: (state) ->
|
|
|
|
if !gon.chat_blast
|
|
systemMsg = {}
|
|
@systemMsgId = @systemMsgId + 1
|
|
systemMsg.sender_name = 'System'
|
|
systemMsg.sender_id = 'system'
|
|
systemMsg.msg_id = @systemMsgId
|
|
systemMsg.created_at = new Date().toISOString()
|
|
systemMsg.channel = 'global'
|
|
if state.active
|
|
systemMsg.msg = "You've come back!"
|
|
else
|
|
systemMsg.msg = "You've become inactive. Any global chat messages while away will be missed."
|
|
|
|
@onMsgReceived(systemMsg)
|
|
|
|
# after the animation to open the chat panel is done, do it!
|
|
onFullyOpened: () ->
|
|
@changed()
|
|
|
|
# called from ChatPanel
|
|
onSessionStarted: (sessionId, lessonId) ->
|
|
logger.debug("ChatStore.sessionStarted sessionId: #{sessionId} lessonId: #{lessonId}")
|
|
if lessonId?
|
|
@lessonSessionId = lessonId
|
|
#@msgs['session'] = []
|
|
@channel = 'lesson'
|
|
@channelType = 'lesson'
|
|
@fetchHistory()
|
|
@onEmptyChannel(@channel)
|
|
else
|
|
@msgs['session'] = []
|
|
@channel = 'session'
|
|
@channelType = null
|
|
@fetchHistory()
|
|
@onEmptyChannel(@channel)
|
|
|
|
|
|
buildQuery: (channel = null) ->
|
|
if !channel?
|
|
channel = @channel
|
|
|
|
|
|
query = {type: 'CHAT_MESSAGE', limit:@limit, page: @currentPage, channel: channel};
|
|
|
|
if channel == 'session' && SessionStore.currentSessionId?
|
|
query.music_session = SessionStore.currentSessionId
|
|
|
|
if channel == 'lesson' && @lessonSessionId?
|
|
query.lesson_session = @lessonSessionId
|
|
|
|
if @next
|
|
query.start = next
|
|
return query
|
|
|
|
onInitializeLesson: (lessonSessionId) ->
|
|
@lessonSessionId = lessonSessionId
|
|
@channelType = 'lesson'
|
|
|
|
@fetchHistory('lesson')
|
|
|
|
fetchHistory: (channel = null) ->
|
|
|
|
if !channel?
|
|
channel = @channel
|
|
|
|
# load previous chat messages
|
|
rest.getChatMessages(@buildQuery(channel))
|
|
.done((response) =>
|
|
@onLoadMessages(channel, response)
|
|
).fail((jqXHR) =>
|
|
@app.notifyServerError(jqXHR, 'Unable to Load Session Conversations')
|
|
)
|
|
|
|
onEmptyChannel: (channel) ->
|
|
@msgs[channel] = []
|
|
@changed()
|
|
|
|
convertServerMessages: (chats) ->
|
|
converted = []
|
|
for chat in chats
|
|
convert = {}
|
|
convert.sender_name = chat.user?.name
|
|
convert.sender_id = chat.user_id
|
|
convert.msg = chat.message
|
|
convert.msg_id = chat.id
|
|
convert.created_at = chat.created_at
|
|
convert.channel = chat.channel
|
|
convert.purpose = chat.purpose
|
|
convert.music_notation = chat.music_notation
|
|
convert.claimed_recording = chat.claimed_recording
|
|
converted.push(convert)
|
|
converted
|
|
|
|
# called from ChatPanel
|
|
onLoadMessages: (channel, msgs) ->
|
|
|
|
if channel == 'lesson'
|
|
channel = @lessonSessionId
|
|
|
|
channelMsgs = @msgs[channel]
|
|
|
|
if !channelMsgs?
|
|
channelMsgs = []
|
|
@msgs[channel] = channelMsgs
|
|
|
|
history = @convertServerMessages(msgs.chats)
|
|
|
|
for oldMsg in history
|
|
skip = false
|
|
for channelMsg in channelMsgs
|
|
if oldMsg.msg_id == channelMsg.msg_id
|
|
skip = true
|
|
break
|
|
|
|
if !skip
|
|
channelMsgs.unshift(oldMsg)
|
|
|
|
#totalMsgs = history.concat(channelMsgs)
|
|
channelMsgs.sort((a, b) =>
|
|
c = new Date(a.created_at)
|
|
d = new Date(b.created_at)
|
|
return (c > d) - (c < d)
|
|
)
|
|
@msgs[channel] = channelMsgs
|
|
|
|
@changed()
|
|
|
|
onMsgReceived: (msg) ->
|
|
|
|
effectiveChannel = msg.channel
|
|
|
|
if msg.channel == 'lesson'
|
|
effectiveChannel = msg.lesson_session_id
|
|
|
|
if msg.attachment_type?
|
|
console.log("attachment type seen")
|
|
if msg.attachment_type == 'notation' || msg.attachment_type == 'audio'
|
|
msg.music_notation = {id: msg.attachment_id, file_name: msg.attachment_name, attachment_type: msg.attachment_type}
|
|
else
|
|
msg.claimed_recording = {id: msg.attachment_id, name: msg.attachment_name}
|
|
|
|
channelMsgs = @msgs[effectiveChannel]
|
|
|
|
if !channelMsgs?
|
|
channelMsgs = []
|
|
@msgs[effectiveChannel] = channelMsgs
|
|
|
|
channelMsgs.push(msg)
|
|
|
|
# don't let the global channel grow indefinitely
|
|
if effectiveChannel == 'global'
|
|
while channelMsgs.length > @max_global_msgs
|
|
channelMsgs.shift()
|
|
|
|
@changed()
|
|
|
|
buildMessage:(msg, target_user, channel) ->
|
|
payload = {message: msg}
|
|
if channel == 'session'
|
|
payload.music_session = SessionStore.currentSessionId
|
|
else if channel == 'lesson'
|
|
payload.lesson_session = @lessonSessionId
|
|
payload.channel = channel
|
|
payload.client_id = @app.clientId
|
|
payload.target_user = target_user
|
|
payload
|
|
|
|
onActivateChannel: (channel) ->
|
|
logger.debug("onActivateChannel: " + channel)
|
|
@channel = channel
|
|
if @channel != 'lesson'
|
|
@channelType = null
|
|
@fetchHistory()
|
|
@changed()
|
|
|
|
onSendMsg: (msg, done, fail, target_user = null, channel = null) ->
|
|
if !channel?
|
|
channel = @channel
|
|
rest.createChatMessage(@buildMessage(msg, target_user, channel))
|
|
.done((response) =>
|
|
|
|
done(response)
|
|
|
|
if response.channel == 'session'
|
|
@onMsgReceived({
|
|
sender_name: "me",
|
|
sender_id: context.JK.currentUserId,
|
|
msg: msg,
|
|
msg_id: response.id,
|
|
created_at: response.created_at,
|
|
channel: response.channel
|
|
})
|
|
else if response.channel == 'lesson'
|
|
@onMsgReceived({
|
|
sender_name: "me",
|
|
sender_id: context.JK.currentUserId,
|
|
msg: msg,
|
|
msg_id: response.id,
|
|
created_at: response.created_at,
|
|
channel: response.lesson_session_id
|
|
})
|
|
)
|
|
.fail((jqXHR) =>
|
|
fail(jqXHR)
|
|
)
|
|
|
|
# unused/untested. send direct to gateway
|
|
onSendMsgInstant: (msg, channel = null) ->
|
|
logger.debug("ChatStore.sendMsg", msg)
|
|
|
|
if !channel?
|
|
channel = @channel
|
|
window.JK.JamServer.sendChatMessage(channel, msg)
|
|
|
|
getState: () ->
|
|
return {msgs: @msgs, channel: @channel, channelType: @channelType, lessonSessionId: @lessonSessionId}
|
|
|
|
changed: () ->
|
|
@trigger(@getState())
|
|
}
|
|
)
|