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

257 lines
7.0 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
initializeLesson: (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' || msg.channel == 'session'
if msg.channel == 'session'
'session'
else
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
if @channel == 'lesson'
@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())
}
)