cordis/client/webapp/elements/guild-list-guild.ts

114 lines
4.6 KiB
TypeScript
Raw Normal View History

2021-10-30 17:26:41 +00:00
import * as electronRemote from '@electron/remote';
const electronConsole = electronRemote.getGlobal('console') as Console;
import Logger from '../../../logger/logger';
2021-11-02 04:29:24 +00:00
const LOG = Logger.create(__filename, electronConsole);
2021-10-30 17:26:41 +00:00
import BaseElements from './require/base-elements';
import ElementsUtil from './require/elements-util';
2021-11-21 18:29:42 +00:00
import { GuildMetadata } from '../data-types';
import Q from '../q-module';
import UI from '../ui';
import Actions from '../actions';
2021-11-21 18:29:42 +00:00
import createGuildContextMenu from './context-menu-srv';
import Controller from '../controller';
2021-11-21 18:29:42 +00:00
import CombinedGuild from '../guild-combined';
2021-11-21 18:29:42 +00:00
export default function createGuildListGuild(document: Document, q: Q, ui: UI, controller: Controller, guild: CombinedGuild) {
let element = q.create({ class: 'guild', 'meta-id': guild.id, 'meta-name': guild.id, content: [
2021-10-30 17:26:41 +00:00
{ class: 'pill' },
2021-11-21 18:29:42 +00:00
{ tag: 'img', src: './img/loading.svg', alt: 'guild' }, // src is set later by script.js
2021-10-30 17:26:41 +00:00
] }) as HTMLElement;
// Hover over for name + connection info
(async () => {
2021-11-21 18:29:42 +00:00
let guildData: GuildMetadata;
2021-10-30 17:26:41 +00:00
try {
2021-11-21 18:29:42 +00:00
guildData = await guild.grabMetadata();
if (!guildData.iconResourceId) throw new Error('guild icon not identified yet');
let guildIcon = await guild.fetchResource(guildData.iconResourceId);
let guildIconSrc = await ElementsUtil.getImageBufferSrc(guildIcon);
(q.$$$(element, 'img') as HTMLImageElement).src = guildIconSrc;
2021-10-30 17:26:41 +00:00
} catch (e) {
2021-11-21 18:29:42 +00:00
LOG.error('Error fetching guild icon', e);
(q.$$$(element, 'img') as HTMLImageElement).src = './img/error.png';
return;
2021-10-30 17:26:41 +00:00
}
2021-11-21 18:29:42 +00:00
element.setAttribute('meta-name', guildData.name);
let contextElement = q.create({ class: 'context', content: {
class: 'info', content: [
BaseElements.TAB_LEFT,
2021-11-21 18:29:42 +00:00
{ class: 'content guild' } // populated later
]
} }) as HTMLElement;
// TODO: future: update the status in real-time with the update-member event
element.addEventListener('mouseenter', async () => {
Q.clearChildren(q.$$$(contextElement, '.content'));
q.$$$(contextElement, '.content').appendChild(q.create({ class: 'name', content: element.getAttribute('meta-name') }));
document.body.appendChild(contextElement);
ElementsUtil.alignContextElement(contextElement, element, { left: 'right', centerY: 'centerY' });
(async () => {
2021-11-21 18:29:42 +00:00
let connection = await guild.fetchConnectionInfo();
let connectionElement = q.create({ class: 'connection ' + connection.status, content: [
{ class: 'status-circle' },
{ class: 'display-name', content: connection.displayName }
] });
q.$$$(contextElement, '.content').appendChild(connectionElement);
ElementsUtil.alignContextElement(contextElement, element, { left: 'right', centerY: 'centerY' });
})();
});
element.addEventListener('mouseleave', () => {
if (contextElement.parentElement) {
contextElement.parentElement.removeChild(contextElement);
}
});
2021-10-30 17:26:41 +00:00
})();
element.addEventListener('click', async () => {
if (element.classList.contains('active')) return;
2021-11-21 18:29:42 +00:00
ui.setActiveGuild(guild);
2021-10-30 17:26:41 +00:00
// Connection information
(async () => {
2021-11-21 18:29:42 +00:00
await Actions.fetchAndUpdateConnection(ui, guild);
2021-10-30 17:26:41 +00:00
})();
2021-11-21 18:29:42 +00:00
// Guild Channel Name
2021-10-30 17:26:41 +00:00
(async () => {
// Explicitly not using a withPotentialError to make this simpler
try {
2021-11-21 18:29:42 +00:00
let guildData = await guild.grabMetadata();
ui.updateGuildName(guild, guildData.name);
2021-10-30 17:26:41 +00:00
} catch (e) {
2021-11-21 18:29:42 +00:00
LOG.error('Error fetching guild name', e);
ui.updateGuildName(guild, 'ERROR');
2021-10-30 17:26:41 +00:00
}
})();
2021-11-21 18:29:42 +00:00
// Guild Channel List
2021-10-30 17:26:41 +00:00
(async () => {
2021-11-21 18:29:42 +00:00
await Actions.fetchAndUpdateChannels(q, ui, guild);
2021-10-30 17:26:41 +00:00
})();
2021-11-21 18:29:42 +00:00
// Guild Members
2021-10-30 17:26:41 +00:00
(async () => {
2021-11-21 18:29:42 +00:00
await Actions.fetchAndUpdateMembers(q, ui, guild);
2021-10-30 17:26:41 +00:00
})();
});
element.addEventListener('contextmenu', (e) => {
2021-11-21 18:29:42 +00:00
let contextMenu = createGuildContextMenu(document, q, ui, controller, guild);
2021-10-30 17:26:41 +00:00
document.body.appendChild(contextMenu);
let relativeTo = { x: e.pageX, y: e.pageY };
ElementsUtil.alignContextElement(contextMenu, relativeTo, { top: 'centerY', left: 'centerX' });
});
return element;
}