all repos — underbbs @ 44bdad2e509c30962c79155a16e6d499bbaf3791

decentralized social media client

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;
  }
}