TeaWeb/shared/js/ui/modal/ModalPoke.ts

99 lines
3.5 KiB
TypeScript
Raw Normal View History

import {ConnectionHandler} from "../../ConnectionHandler";
import {createModal, Modal} from "../../ui/elements/Modal";
import * as htmltags from "../../ui/htmltags";
import * as moment from "moment";
import {renderBBCodeAsJQuery} from "../../text/bbcode";
import { tr } from "tc-shared/i18n/localize";
2020-03-30 13:44:18 +02:00
let global_modal: PokeModal;
2019-05-25 19:06:57 +02:00
export interface ServerEntry {
2020-03-30 13:44:18 +02:00
source: ConnectionHandler;
2020-03-30 13:44:18 +02:00
add_message(invoker: PokeInvoker, message: string);
}
2019-05-25 19:06:57 +02:00
2020-03-30 13:44:18 +02:00
class PokeModal {
private _handle: Modal;
private source_map: ServerEntry[] = [];
2019-05-25 19:06:57 +02:00
2020-03-30 13:44:18 +02:00
constructor() {
this._handle = createModal({
header: tr("You have been poked!"),
body: () => {
let template = $("#tmpl_poke_popup").renderTag();
template.find(".button-close").on('click', event => this._handle_close());
return template;
},
footer: undefined,
width: 750
});
this._handle.close_listener.push(() => this._handle_close());
}
2019-05-25 19:06:57 +02:00
modal() {
return this._handle;
}
2020-03-30 13:44:18 +02:00
add_poke(source: ConnectionHandler, invoker: PokeInvoker, message: string) {
let handler: ServerEntry;
for (const entry of this.source_map)
if (entry.source === source) {
2020-03-30 13:44:18 +02:00
handler = entry;
break;
}
if (!handler) {
2020-03-30 13:44:18 +02:00
const html_tag = $.spawn("div").addClass("server");
const poke_list = $.spawn("div").addClass("poke-list");
$.spawn("div")
.addClass("server-name")
.text(source && source.channelTree && source.channelTree.server ? source.channelTree.server.properties.virtualserver_name : "unknown")
.appendTo(html_tag);
poke_list.appendTo(html_tag);
2019-05-25 19:06:57 +02:00
2020-03-30 13:44:18 +02:00
this.source_map.push(handler = {
source: source,
add_message: (invoker: PokeInvoker, message: string) => {
const container = $.spawn("div").addClass("entry");
2019-05-25 19:06:57 +02:00
2020-03-30 13:44:18 +02:00
$.spawn("div").addClass("date").text(moment().format("HH:mm:ss") + " - ").appendTo(container);
$.spawn("div").addClass("user").append($(htmltags.generate_client({
add_braces: true,
client_id: invoker.id,
client_name: invoker.name,
client_unique_id: invoker.unique_id
}))).appendTo(container);
if (message) {
2020-03-30 13:44:18 +02:00
$.spawn("div").addClass("text").text(tr("pokes you:")).appendTo(container);
$.spawn("div").addClass("poke-message").append(...renderBBCodeAsJQuery(message, {convertSingleUrls: false})).appendTo(container);
2020-03-30 13:44:18 +02:00
} else {
$.spawn("div").addClass("text").text(tr("pokes you.")).appendTo(container);
2019-05-25 19:06:57 +02:00
}
2020-03-30 13:44:18 +02:00
container.appendTo(poke_list);
}
});
2019-05-25 19:06:57 +02:00
2020-03-30 13:44:18 +02:00
this._handle.htmlTag.find(".container-servers").append(html_tag);
2019-05-25 19:06:57 +02:00
}
2020-03-30 13:44:18 +02:00
handler.add_message(invoker, message);
2019-05-25 19:06:57 +02:00
}
2020-03-30 13:44:18 +02:00
private _handle_close() {
this._handle.close();
global_modal = undefined;
2018-11-04 00:39:29 +01:00
}
2020-03-30 13:44:18 +02:00
}
export type PokeInvoker = {
name: string,
id: number,
unique_id: string
};
export function spawnPoke(source: ConnectionHandler, invoker: PokeInvoker, message: string) {
if (!global_modal)
2020-03-30 13:44:18 +02:00
global_modal = new PokeModal();
global_modal.add_poke(source, invoker, message);
global_modal.modal().open();
2018-11-04 00:39:29 +01:00
}