immutable = require('immutable')
{Actions} = require('../smc-react')
{webapp_client} = require('../webapp_client')
class ChatActions extends Actions
_process_syncdb_obj: (x) =>
if x.event != 'chat'
return
if x.video_chat?.is_video_chat
return
x.date = new Date(x.date)
if x.history?.length > 0
else if x.payload?
x.history = []
x.history.push
content : x.payload.content
author_id : x.sender_id
date : new Date(x.date)
delete x.payload
else if x.mesg?
x.history = []
x.history.push
content : x.mesg.content
author_id : x.sender_id
date : new Date(x.date)
delete x.mesg
x.history ?= []
if not x.editing
x.editing = {}
return x
init_from_syncdb: () =>
v = {}
for x in @syncdb.get().toJS()
x = @_process_syncdb_obj(x)
if x?
v[x.date - 0] = x
@setState
messages : immutable.fromJS(v)
_syncdb_change: (changes) =>
messages_before = messages = @store.get('messages')
if not messages?
return
changes.map (obj) =>
obj.date = new Date(obj.date)
record = @syncdb.get_one(obj)
x = record?.toJS()
if not x?
messages = messages.delete(obj.date - 0)
else
x = @_process_syncdb_obj(x)
if x?
messages = messages.set("#{x.date - 0}", immutable.fromJS(x))
if not messages_before.equals(messages)
@setState(messages: messages)
send_chat: (mesg) =>
if not @syncdb?
return
sender_id = @redux.getStore('account').get_account_id()
time_stamp = webapp_client.server_time().toISOString()
@syncdb.set
sender_id : sender_id
event : "chat"
history : [{author_id: sender_id, content:mesg, date:time_stamp}]
date : time_stamp
@syncdb.save()
@setState(last_sent: mesg)
set_editing: (message, is_editing) =>
if not @syncdb?
return
author_id = @redux.getStore('account').get_account_id()
if is_editing
editing = message.get('editing').set(author_id, 'FUTURE')
else
editing = message.get('editing').set(author_id, null)
@syncdb.set
history : message.get('history').toJS()
editing : editing.toJS()
date : message.get('date').toISOString()
send_edit: (message, mesg) =>
if not @syncdb?
return
author_id = @redux.getStore('account').get_account_id()
time_stamp = webapp_client.server_time().toISOString()
@syncdb.set
history : [{author_id: author_id, content:mesg, date:time_stamp}].concat(message.get('history').toJS())
editing : message.get('editing').set(author_id, null).toJS()
date : message.get('date').toISOString()
@syncdb.save()
set_to_last_input: =>
@setState(input:@store.get('last_sent'))
set_input: (input) =>
@setState(input:input)
saved_message: (saved_mesg) =>
@setState(saved_mesg:saved_mesg)
set_is_preview: (is_preview) =>
@setState(is_preview:is_preview)
set_use_saved_position: (use_saved_position) =>
@setState(use_saved_position:use_saved_position)
save_scroll_state: (position, height, offset) =>
if height != 0
@setState(saved_position:position, height:height, offset:offset)
exports.ChatActions = ChatActions