60 lines
2.7 KiB
TypeScript
60 lines
2.7 KiB
TypeScript
|
import * as moment from "moment";
|
||
|
import ClientController from "../client-controller";
|
||
|
import { Message } from '../data-types';
|
||
|
|
||
|
import IState from "./require/elements-state";
|
||
|
import ElementsUtil from "./require/elements-util";
|
||
|
|
||
|
import { $, $$, $$$, $$$$ } from './require/q-module';
|
||
|
|
||
|
class ShouldNeverHappenError extends Error {
|
||
|
constructor(...args: any[]) {
|
||
|
super(...args);
|
||
|
this.name = 'ShouldNeverHappenError';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default function createResourceMessageContinued(state: IState, server: ClientController, message: Message): HTMLElement {
|
||
|
const { document } = state;
|
||
|
$.setDocument(document);
|
||
|
|
||
|
if (!message.resourceId || !message.resourceName) {
|
||
|
throw new ShouldNeverHappenError('Message is not a resource message');
|
||
|
}
|
||
|
|
||
|
let element = $.create({ class: 'message continued', 'meta-id': message.id, 'meta-member-id': message.member.id, 'meta-server-id': server.id, content: [
|
||
|
{ class: 'timestamp', content: moment(message.sent).format('HH:mm') },
|
||
|
{ class: 'right', content: [
|
||
|
{ class: 'content resource', content: [
|
||
|
{ tag: 'img', class: 'icon', src: './img/file-icon.png' }, // TODO: SVG based on content-type
|
||
|
{ class: 'text', content: [
|
||
|
{ class: 'filename', content: message.resourceName },
|
||
|
{ class: 'download-status', content: 'Click to Download' },
|
||
|
] }
|
||
|
] },
|
||
|
{ class: 'content text', content: ElementsUtil.parseMessageText(message.text ?? '') }
|
||
|
] }
|
||
|
] }) as HTMLElement;
|
||
|
$$$(element, '.resource').addEventListener('click', ElementsUtil.createDownloadListener({
|
||
|
server: server, resourceId: message.resourceId, resourceName: message.resourceName,
|
||
|
downloadStartFunc: () => {
|
||
|
$$$(element, '.resource .download-status').innerText = 'Downloading...';
|
||
|
},
|
||
|
downloadFailFunc: async () => {
|
||
|
$$$(element, '.resource .download-status').innerText = 'Error Downloading. Click to Try Again';
|
||
|
await ElementsUtil.shakeElement($$$(element, '.resource .download-status'), 400);
|
||
|
},
|
||
|
writeStartFunc: () => {
|
||
|
$$$(element, '.resource .download-status').innerText = 'Writing...';
|
||
|
},
|
||
|
writeFailFunc: async () => {
|
||
|
$$$(element, '.resource .download-status').innerText = 'Error Writing. Click to Try Again';
|
||
|
await ElementsUtil.shakeElement($$$(element, '.resource .download-status'), 400);
|
||
|
},
|
||
|
successFunc: (downloadPath) => {
|
||
|
$$$(element, '.resource .download-status').innerText = 'Click to Open in Explorer';
|
||
|
}
|
||
|
}));
|
||
|
return element;
|
||
|
}
|