Files
RomhackPlaza/resources/js/conversations.js

104 lines
2.3 KiB
JavaScript
Raw Normal View History

2026-05-25 09:55:47 +02:00
/** @typedef { import('types/ConversationResponseItem.js').ConversationResponseItem} ConversationResponseItem */
export default function conversations() {
return {
/**
* @type {boolean}
*/
start: false,
/**
* @type {ConversationResponseItem[]}
*/
data: null,
/**
* @type {boolean}
*/
loading: false,
/**
* @type {boolean}
*/
error: false,
/**
* @type {number}
*/
unviewed: 0,
/**
* Request for getting notifications.
*
* @return {Promise<void>}
*/
async getConversations() {
if( this.loading )
return;
this.loading = true;
this.error = false;
try {
const RESPONSE = await fetch('/api/dynamic/conversations', { credentials: "include", headers: { 'X-Requested-With': 'XMLHttpRequest' } });
if( !RESPONSE.ok )
throw new Error(RESPONSE.status)
let json = await RESPONSE.json()
if( !json.conversations )
throw new Error(RESPONSE.status);
this.data = json.conversations;
} catch (error) {
this.error = true;
} finally {
this.loading = false;
}
},
/**
*
* @param {HTMLElement} anchorEl
* @return {Promise<void>}
*/
async open( anchorEl ){
if( this.start ){
this.close();
return;
}
this.start = !this.start;
if( this.start && !this.data ){
await this.getConversations();
}
if( this.start ){
Alpine.nextTick(() => window.refreshIcons(document.querySelector('.notifications')))
}
},
/**
* @return {number}
*/
get unread(){
if( !this.data ){
return this.unviewed;
}
return this.data.filter(a => a.is_unread === 0 ).length;
},
/**
*
*/
close(){
this.start = false;
}
}
}