forked from AkkomaGang/akkoma-fe
101 lines
2.5 KiB
JavaScript
101 lines
2.5 KiB
JavaScript
import _ from 'lodash'
|
|
|
|
const empty = (chatId) => {
|
|
return {
|
|
idIndex: {},
|
|
messages: [],
|
|
newMessageCount: 0,
|
|
lastSeenTimestamp: 0,
|
|
chatId: chatId
|
|
}
|
|
}
|
|
|
|
const add = (storage, { messages: newMessages }) => {
|
|
if (!storage) { return }
|
|
for (let i = 0; i < newMessages.length; i++) {
|
|
let message = newMessages[i]
|
|
|
|
// sanity check
|
|
if (message.chat_id !== storage.chatId) { return }
|
|
|
|
if (!storage.idIndex[message.id]) {
|
|
if (storage.lastSeenTimestamp < message.created_at) {
|
|
storage.newMessageCount++
|
|
}
|
|
storage.messages.push(message)
|
|
storage.idIndex[message.id] = message
|
|
}
|
|
}
|
|
}
|
|
|
|
const resetNewMessageCount = (storage) => {
|
|
if (!storage) { return }
|
|
storage.newMessageCount = 0
|
|
storage.lastSeenTimestamp = new Date()
|
|
}
|
|
|
|
// Inserts date separators and marks the head and tail if it's the sequence of messages made by the same user
|
|
const getView = (storage) => {
|
|
if (!storage) { return [] }
|
|
let messages = _.sortBy(storage.messages, 'id')
|
|
|
|
let res = []
|
|
|
|
let prev = messages[messages.length - 1]
|
|
let currentSequenceId
|
|
|
|
let firstMessages = messages[0]
|
|
|
|
if (firstMessages) {
|
|
let date = new Date(firstMessages.created_at)
|
|
date.setHours(0, 0, 0, 0)
|
|
res.push({ type: 'date', date: date, id: date.getTime().toString() })
|
|
}
|
|
|
|
let afterDate = false
|
|
|
|
for (let i = 0; i < messages.length; i++) {
|
|
let message = messages[i]
|
|
let nextMessage = messages[i + 1]
|
|
|
|
let date = new Date(message.created_at)
|
|
date.setHours(0, 0, 0, 0)
|
|
|
|
// insert date separator and start a new sequence
|
|
if (prev && prev.date < date) {
|
|
res.push({ type: 'date', date: date, id: date.getTime().toString() })
|
|
prev['isTail'] = true
|
|
currentSequenceId = undefined
|
|
afterDate = true
|
|
}
|
|
|
|
let object = { type: 'message', data: message, date: date, id: message.id, sequenceId: currentSequenceId }
|
|
|
|
// end a message sequence
|
|
if ((nextMessage && nextMessage.account_id) !== message.account_id) {
|
|
object['isTail'] = true
|
|
currentSequenceId = undefined
|
|
}
|
|
// start a new message sequence
|
|
if ((prev && prev.data && prev.data.account_id) !== message.account_id || afterDate) {
|
|
currentSequenceId = _.uniqueId()
|
|
object['isHead'] = true
|
|
object['sequenceId'] = currentSequenceId
|
|
}
|
|
res.push(object)
|
|
prev = object
|
|
afterDate = false
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
const ChatService = {
|
|
add,
|
|
empty,
|
|
getView,
|
|
resetNewMessageCount
|
|
}
|
|
|
|
export default ChatService
|