Files
movim-rs/frontend/widgets/Chats/chats.js
T
2026-10-24 14:03:52 +07:00

151 lines
5.3 KiB
JavaScript

var Chats = {
startX: 0,
startY: 0,
translateX: 0,
translateY: 0,
slideAuthorized: false,
setFilter: function (filter) {
document.querySelector('#chats_widget_header').dataset.filter = filter;
Chats_ajaxSetFilter(filter);
},
refreshFilters: function () {
var filter = document.querySelector('#chats_widget_header').dataset.filter;
document.querySelectorAll('#chats_widget_header span.chip').forEach(chip => {
chip.classList.remove('enabled');
if (chip.dataset.filter == filter) chip.classList.add('enabled');
});
},
refresh: function () {
var list = document.querySelector('#chats');
if (!list) return;
Chats.refreshFilters();
var trim = list.innerHTML.trim();
if (trim === '') list.innerHTML = trim;
var items = document.querySelectorAll('ul#chats li:not(.subheader)');
var i = 0;
while (i < items.length) {
if (items[i].querySelector('img.tinythumb')) {
var img = items[i].querySelector('img.tinythumb');
try {
img.src = thumbHashToDataURL(MovimUtils.base64ToBinary(img.dataset.thumbhash));
} catch (error) {
console.log('Cannot handle thumbhash hash');
}
}
if (items[i].dataset.jid != null) {
items[i].onclick = function (e) {
Rooms.refresh();
MovimUtils.addClass('ul#bottomnavigation', 'hidden');
Chat.get(this.dataset.jid);
};
items[i].onmousedown = function (e) {
if (e.which == 2) {
Chats.closeItem(this, false);
e.preventDefault();
}
}
clientWidth = Math.abs(document.body.clientWidth);
delay = 20;
if (MovimUtils.isMobile()) {
items[i].addEventListener('touchstart', function (event) {
if (MovimTpl.menuDragged) return;
Chats.startX = event.targetTouches[0].pageX;
Chats.startY = event.targetTouches[0].pageY;
this.classList.remove('moving');
}, true);
items[i].addEventListener('touchmove', function (event) {
if (MovimTpl.menuDragged) return;
Chats.translateX = parseInt(event.targetTouches[0].pageX - Chats.startX);
Chats.translateY = parseInt(event.targetTouches[0].pageY - Chats.startY);
if (Math.abs(Chats.translateX) > delay && Math.abs(Chats.translateX) <= clientWidth) {
if (Math.abs(Chats.translateX) > this.offsetWidth / 2) {
this.classList.add('close');
} else {
this.classList.remove('close');
}
if (Math.abs(Chats.translateY) < delay) {
Chats.slideAuthorized = true;
}
var moveX = Chats.translateX < 0
? (Chats.translateX + delay)
: (Chats.translateX - delay);
if (Chats.slideAuthorized) {
this.style.transform = 'translateX(' + (moveX) + 'px)';
}
} else {
this.style.transform = '';
this.classList.remove('close');
}
}, true);
items[i].addEventListener('touchend', function (event) {
if (MovimTpl.menuDragged) return;
this.classList.add('moving');
if (Math.abs(Chats.translateX) > this.offsetWidth / 2 && Chats.slideAuthorized) {
Chats.closeItem(this, (Chats.translateX < 0));
} else {
this.classList.remove('close');
}
this.style.transform = '';
Chats.slideAuthorized = false;
Chats.startX = Chats.startY = Chats.translateX = Chats.translateY = 0;
}, true);
}
}
i++;
}
},
clearAllActives: function () {
document.querySelectorAll('ul#chats li:not(.subheader)')
.forEach(item => item.classList.remove('active'));
},
setActive: function (jid) {
Chats.clearAllActives();
Rooms.clearAllActives();
MovimUtils.addClass('ul#chats li[data-jid="' + jid + '"]', 'active');
},
closeItem(li, toLeft) {
li.classList.add('closing');
li.classList.add(toLeft ? 'to_left' : 'to_right');
window.setTimeout(() => {
Chats_ajaxClose(li.dataset.jid, (MovimUtils.urlParts().params[0] === li.dataset.jid));
}, 400);
}
};
MovimEvents.registerWindow('loaded', 'chats', () => Chats.refresh());
MovimWebsocket.initiate(() => Chats_ajaxHttpGet());