blob: 174ba03910cb27abcaf15da6c12ed17ee4760045 [file] [log] [blame]
simond47ef9e2022-09-28 22:24:28 -04001import Contact from './Contact.js';
Adrien Béraud35e7d7c2021-04-13 03:28:39 -04002
Adrien Béraudc4dd44a2021-04-08 01:05:24 -04003class Conversation {
simond47ef9e2022-09-28 22:24:28 -04004 constructor(id, accountId, members) {
5 this.id = id;
6 this.accountId = accountId;
7 this.members = members || [];
8 this.messages = [];
9 this.infos = {};
10 }
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040011
simond47ef9e2022-09-28 22:24:28 -040012 static from(accountId, object) {
13 const conversation = new Conversation(
14 object.id,
15 accountId,
16 object.members.map((member) => {
17 member.contact = Contact.from(member.contact);
18 return member;
19 })
20 );
21 conversation.messages = object.messages;
22 return conversation;
23 }
24 static fromSingleContact(accountId, contact) {
25 return new Conversation(undefined, accountId, [{ contact }]);
26 }
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040027
simond47ef9e2022-09-28 22:24:28 -040028 getId() {
29 return this.id;
30 }
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040031
simond47ef9e2022-09-28 22:24:28 -040032 getAccountId() {
33 return this.accountId;
34 }
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040035
simond47ef9e2022-09-28 22:24:28 -040036 getDisplayName() {
37 if (this.members.length !== 0) {
38 return this.members[0].contact.getDisplayName();
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040039 }
simond47ef9e2022-09-28 22:24:28 -040040 return this.getDisplayUri();
41 }
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040042
simond47ef9e2022-09-28 22:24:28 -040043 getDisplayNameNoFallback() {
44 if (this.members.length !== 0) {
45 return this.members[0].contact.getDisplayNameNoFallback();
Adrien Béraud150b4782021-04-21 19:40:59 -040046 }
simond47ef9e2022-09-28 22:24:28 -040047 }
Adrien Béraud150b4782021-04-21 19:40:59 -040048
simond47ef9e2022-09-28 22:24:28 -040049 async getObject(params) {
50 const members = params.memberFilter ? this.members.filter(params.memberFilter) : this.members;
51 return {
52 id: this.id,
53 messages: this.messages,
54 members: await Promise.all(
55 members.map(async (member) => {
56 const copiedMember = { role: member.role }; //Object.assign({}, member);
57 copiedMember.contact = await member.contact.getObject();
58 return copiedMember;
59 })
60 ),
61 };
62 }
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040063
simond47ef9e2022-09-28 22:24:28 -040064 getSummary() {
65 return this.getObject();
66 }
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040067
simond47ef9e2022-09-28 22:24:28 -040068 getDisplayUri() {
69 return this.getId() || this.getFirstMember().contact.getUri();
70 }
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040071
simond47ef9e2022-09-28 22:24:28 -040072 getFirstMember() {
73 return this.members[0];
74 }
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040075
simond47ef9e2022-09-28 22:24:28 -040076 getMembers() {
77 return this.members;
78 }
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040079
simond47ef9e2022-09-28 22:24:28 -040080 addMessage(message) {
81 if (this.messages.length === 0) this.messages.push(message);
82 else if (message.id === this.messages[this.messages.length - 1].linearizedParent) {
83 this.messages.push(message);
84 } else if (message.linearizedParent === this.messages[0].id) {
85 this.messages.unshift(message);
86 } else {
87 console.log("Can't insert message " + message.id);
Adrien Béraud4e287b92021-04-24 16:15:56 -040088 }
simond47ef9e2022-09-28 22:24:28 -040089 }
Adrien Béraud4e287b92021-04-24 16:15:56 -040090
simond47ef9e2022-09-28 22:24:28 -040091 addLoadedMessages(messages) {
92 messages.forEach((message) => this.addMessage(message));
93 }
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040094
simond47ef9e2022-09-28 22:24:28 -040095 getMessages() {
96 return this.messages;
97 }
ervinanohb81c3912022-09-08 04:13:24 -040098
simond47ef9e2022-09-28 22:24:28 -040099 setInfos(infos) {
100 this.infos = infos;
101 }
Adrien Béraudc4dd44a2021-04-08 01:05:24 -0400102}
103
Adrien Béraude74741b2021-04-19 13:22:54 -0400104export default Conversation;