frontend/ts/thread.ts (raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
import util from "./util" import { Message } from "./message" var _ = util._ var $ = util.$ export class MessageNode { public parent: MessageNode | null = null; public children: MessageNode[] = []; public data: Message; constructor(msg: Message, parent: MessageNode | null = null) { this.data = msg; this.parent = parent; } findRoot(): MessageNode { let self: MessageNode | null = this; while(self.parent) { self = self.parent; } return self; } } export class MessageThread { public root: MessageNode; public messageCount: number; public visibility: string; public created: Date; public latest: Date; constructor(first: Message) { this.root = new MessageNode(first); this.messageCount = 1; this.visibility = first.visibility; this.created = first.created; this.latest = first.edited ? first.edited : first.created; } addReply(parentID: string, reply: Message): boolean { let node = this.findNode(this.root, parentID); if (node) { node.children.push(new MessageNode(reply, node)); this.messageCount++; const mtime = reply.edited ? reply.edited : reply.created; if (this.latest.getTime() < mtime.getTime()) { this.latest = mtime; } return true; } return false; } findNode(node: MessageNode, id: string): MessageNode | null { if (node.data.id == id) { return node; } else { for (let n of node.children) { const x = this.findNode(n, id); if (x != null) { return x; } } } return null; } } |