78 lines
2.2 KiB
JavaScript
78 lines
2.2 KiB
JavaScript
const MszMessagesThread = function(thread) {
|
|
if(!(thread instanceof Element))
|
|
throw 'thread must be an element';
|
|
|
|
const messages = Array.from(thread.querySelectorAll('.js-messages-message')).map(elem => new MszMessagesThreadMessage(elem));
|
|
const message = messages.find(msg => msg.isFull());
|
|
|
|
return {
|
|
getMessage: () => message,
|
|
getMessages: () => messages,
|
|
};
|
|
};
|
|
|
|
const MszMessagesThreadMessage = function(message) {
|
|
if(!(message instanceof Element))
|
|
throw 'message must be an element';
|
|
|
|
const msgId = message.dataset.msgId;
|
|
const type = message.dataset.msgType;
|
|
const url = message.dataset.msgUrl;
|
|
|
|
if(type === 'snip') {
|
|
message.addEventListener('click', ev => {
|
|
if(typeof url !== 'string')
|
|
return;
|
|
|
|
let target = ev.target;
|
|
while(target !== message) {
|
|
if(target instanceof HTMLAnchorElement)
|
|
return;
|
|
|
|
target = target.parentNode;
|
|
}
|
|
|
|
ev.preventDefault();
|
|
location.assign(url);
|
|
});
|
|
} else if(type === 'full') {
|
|
message.scrollIntoView({
|
|
behavior: 'smooth',
|
|
block: 'start',
|
|
});
|
|
}
|
|
|
|
const isRead = () => message.dataset.msgRead === 'read';
|
|
const setRead = state => {
|
|
message.dataset.msgRead = state ? 'read' : 'unread';
|
|
};
|
|
|
|
const isSent = () => message.dataset.msgSent === 'sent';
|
|
const setSent = state => {
|
|
message.dataset.msgRead = state ? 'sent' : 'draft';
|
|
};
|
|
|
|
const isDeleted = () => message.dataset.msgDeleted === 'yes';
|
|
const setDeleted = state => {
|
|
if(state) {
|
|
message.dataset.msgDeleted = 'yes';
|
|
message.classList.add('messages-message-deleted');
|
|
} else {
|
|
message.dataset.msgDeleted = 'no';
|
|
message.classList.remove('messages-message-deleted');
|
|
}
|
|
};
|
|
|
|
return {
|
|
getId: () => msgId,
|
|
getType: () => type,
|
|
isFull: () => type === 'full',
|
|
isSnippet: () => type === 'snip',
|
|
isRead: isRead,
|
|
setRead: setRead,
|
|
isSent: isSent,
|
|
setSent: setSent,
|
|
isDeleted: isDeleted,
|
|
setDeleted: setDeleted,
|
|
};
|
|
};
|