podchat-browser
Version:
Javascript SDK to use POD's Chat Service - Browser Only
118 lines (110 loc) • 4.23 kB
JavaScript
import {RequestParamsManager} from "./requestParams";
import {HistoryItem} from "./historyItem";
function HistoryListManager() {
let config = {
list: {},
hasNext: {},
nextOrder: 0,
};
let publicized = {
/**
* @param {Number} threadId
*/
get: function (threadId) {
return config.list[threadId] || null;
},
/**
*
* @param {Number} threadId
* @param {Object} params
* @param {Array} list
* @param hasNext
*/
save: function (threadId, params, list, hasNext) {
const item = config.list[threadId];
if (!item) {
config.list[threadId] = new HistoryItem(threadId, params, list)
} else {
config.list[threadId].mergeArray(list)
}
config.list[threadId].sortDesc()
if (params.fromTime && hasNext === false) {
config.hasNext[threadId] = hasNext
}
},
saveMessage: function (threadId, message) {
if (config.list[threadId]) {
if (config.list[threadId].messageExists(message.id)) {
config.list[threadId].updateMessage(message);
} else {
config.list[threadId].putAtBegin(message);
}
config.list[threadId].sortDesc()
}
},
updateSeen: function (threadId, lastSeenMessageTime) {
if (config.list[threadId]) {
const myList = config.list[threadId].get();
const filteredItems = myList.filter(item => item.timeMiliSeconds <= lastSeenMessageTime && item?.seen !== true)
filteredItems.forEach(item =>{
config.list[threadId].updateSeenItem(item.id)
});
}
},
reset: function () {
config.list = {};
},
/**
* @param {Number} threadId
*/
remove(threadId) {
if (config.list[threadId])
delete config.list[threadId];
},
removeMessage: function (threadId, messageId) {
if (config.list[threadId]) {
const list = config.list[threadId].get();
let deletedMessageIndex = list.findIndex(item => item.id == messageId);
let otherMessages = publicized.findRepliedToMessages(messageId);
otherMessages.forEach(item => {
config.list[item.threadId].removeReplyInfoVO(item.messageId);
});
if (deletedMessageIndex > -1) {
const deletedPreviousId = list[deletedMessageIndex]['previousId'];
const preMessageIndex = deletedMessageIndex - 1
const nextMessageIndex = deletedMessageIndex + 1
if (list[nextMessageIndex]) {
config.list[threadId].remove(messageId);
if (list[preMessageIndex]) {
list[preMessageIndex]['previousId'] = deletedPreviousId
}
}
}
}
},
hasNext(threadId) {
if (config.hasNext[threadId] !== undefined) {
return true
return config.hasNext[threadId]
}
return true;
},
exists(threadId) {
return !!config.list[threadId];
},
findRepliedToMessages(messageId) {
let repliedToMessages = [];
for(let i of Object.keys(config.list)) {
let list = config.list[i].get();
for(let j in list) {
if(list[j] && list[j].replyInfo && list[j].replyInfo.repliedToMessageId == messageId) {
repliedToMessages.push({threadId: i, messageId: list[j].id});
}
}
}
return repliedToMessages;
}
}
return publicized;
}
export {HistoryListManager}