Skip to content

Commit 1f07d4a

Browse files
authored
🎨 [Frontend] Support Center: read/unread conversations (ITISFoundation#8489)
1 parent b781c6a commit 1f07d4a

File tree

22 files changed

+904
-337
lines changed

22 files changed

+904
-337
lines changed

services/static-webserver/client/source/class/osparc/conversation/MessageList.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ qx.Class.define("osparc.conversation.MessageList", {
100100
if (conversation) {
101101
conversation.addListener("messageAdded", e => {
102102
const data = e.getData();
103-
this.__messageAdded(data);
103+
this._messageAdded(data);
104104
});
105105
conversation.addListener("messageDeleted", e => {
106106
const data = e.getData();
@@ -120,7 +120,7 @@ qx.Class.define("osparc.conversation.MessageList", {
120120
return;
121121
}
122122

123-
this.getConversation().getMessages().forEach(message => this.__messageAdded(message));
123+
this.getConversation().getMessages().forEach(message => this._messageAdded(message));
124124

125125
loadMoreMessages.show();
126126
loadMoreMessages.setFetching(true);
@@ -153,7 +153,7 @@ qx.Class.define("osparc.conversation.MessageList", {
153153
);
154154
},
155155

156-
__messageAdded: function(message) {
156+
_messageAdded: function(message) {
157157
// ignore it if it was already there
158158
const existingMessageUI = this.__getMessageUI(message.getMessageId());
159159
if (existingMessageUI) {
@@ -171,7 +171,7 @@ qx.Class.define("osparc.conversation.MessageList", {
171171
control = new osparc.conversation.NotificationUI(message);
172172
break;
173173
}
174-
if (control) {
174+
if (control && this.getConversation()) {
175175
// insert into the UI at the same position
176176
const insertAt = this.getConversation().getMessageIndex(message.getMessageId());
177177
const messagesContainer = this.getChildControl("messages-container");

services/static-webserver/client/source/class/osparc/conversation/MessageUI.js

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,6 @@ qx.Class.define("osparc.conversation.MessageUI", {
3636
});
3737
},
3838

39-
statics: {
40-
isMyMessage: function(message) {
41-
if (message.getUserGroupId() === osparc.data.model.Message.SYSTEM_MESSAGE_ID) {
42-
return false;
43-
}
44-
return message && osparc.auth.Data.getInstance().getGroupId() === message.getUserGroupId();
45-
}
46-
},
47-
4839
events: {
4940
"messageUpdated": "qx.event.type.Data",
5041
"messageDeleted": "qx.event.type.Data",
@@ -61,7 +52,7 @@ qx.Class.define("osparc.conversation.MessageUI", {
6152

6253
members: {
6354
_createChildControlImpl: function(id) {
64-
const isMyMessage = this.self().isMyMessage(this.getMessage());
55+
const isMyMessage = osparc.data.model.Message.isMyMessage(this.getMessage());
6556
let control;
6657
switch (id) {
6758
case "avatar":
@@ -154,7 +145,7 @@ qx.Class.define("osparc.conversation.MessageUI", {
154145

155146
const avatar = this.getChildControl("avatar");
156147
const userName = this.getChildControl("user-name");
157-
if (message.getUserGroupId() === osparc.data.model.Message.SYSTEM_MESSAGE_ID) {
148+
if (osparc.data.model.Message.isSupportMessage(message)) {
158149
userName.setValue("Support");
159150
} else {
160151
osparc.store.Users.getInstance().getUser(message.getUserGroupId())
@@ -168,7 +159,7 @@ qx.Class.define("osparc.conversation.MessageUI", {
168159
});
169160
}
170161

171-
if (this.self().isMyMessage(message)) {
162+
if (osparc.data.model.Message.isMyMessage(message)) {
172163
const menuButton = this.getChildControl("menu-button");
173164

174165
const menu = new qx.ui.menu.Menu().set({

services/static-webserver/client/source/class/osparc/data/model/Conversation.js

Lines changed: 20 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@
2020
*/
2121

2222
qx.Class.define("osparc.data.model.Conversation", {
23+
type: "abstract",
2324
extend: qx.core.Object,
2425

2526
/**
2627
* @param conversationData {Object} Object containing the serialized Conversation Data
27-
* @param studyId {String} ID of the Study
2828
* */
29-
construct: function(conversationData, studyId) {
29+
construct: function(conversationData) {
3030
this.base(arguments);
3131

3232
this.set({
@@ -36,17 +36,11 @@ qx.Class.define("osparc.data.model.Conversation", {
3636
type: conversationData.type,
3737
created: new Date(conversationData.created),
3838
modified: new Date(conversationData.modified),
39-
projectId: conversationData.projectUuid || null,
40-
extraContext: conversationData.extraContext || null,
41-
studyId: studyId || null,
39+
lastMessageCreatedAt: conversationData.lastMessageCreatedAt ? new Date(conversationData.lastMessageCreatedAt) : null
4240
});
4341

4442
this.__messages = [];
4543
this.__listenToConversationMessageWS();
46-
47-
if (conversationData.type === "SUPPORT") {
48-
this.__fetchFirstAndLastMessages();
49-
}
5044
},
5145

5246
statics: {
@@ -76,7 +70,7 @@ qx.Class.define("osparc.data.model.Conversation", {
7670
nullable: false,
7771
init: null,
7872
event: "changeName",
79-
apply: "__applyName",
73+
apply: "_applyName",
8074
},
8175

8276
userGroupId: {
@@ -111,46 +105,11 @@ qx.Class.define("osparc.data.model.Conversation", {
111105
event: "changeModified",
112106
},
113107

114-
projectId: {
115-
check: "String",
116-
nullable: true,
117-
init: null,
118-
event: "changeProjectId",
119-
},
120-
121-
extraContext: {
122-
check: "Object",
123-
nullable: true,
124-
init: null,
125-
event: "changeExtraContext",
126-
},
127-
128-
nameAlias: {
129-
check: "String",
130-
nullable: false,
131-
init: "",
132-
event: "changeNameAlias",
133-
},
134-
135-
firstMessage: {
136-
check: "osparc.data.model.Message",
137-
nullable: true,
138-
init: null,
139-
event: "changeFirstMessage",
140-
},
141-
142-
lastMessage: {
143-
check: "osparc.data.model.Message",
144-
nullable: true,
145-
init: null,
146-
event: "changeLastMessage",
147-
apply: "__applyLastMessage",
148-
},
149-
150-
studyId: {
151-
check: "String",
108+
lastMessageCreatedAt: {
109+
check: "Date",
152110
nullable: true,
153111
init: null,
112+
event: "changeLastMessageCreatedAt",
154113
},
155114
},
156115

@@ -161,21 +120,11 @@ qx.Class.define("osparc.data.model.Conversation", {
161120
},
162121

163122
members: {
164-
__fetchingFirstAndLastMessage: null,
165123
__nextRequestParams: null,
166124
__messages: null,
167125

168-
__applyName: function(name) {
169-
if (name && name !== "null") {
170-
this.setNameAlias(name);
171-
}
172-
},
173-
174-
__applyLastMessage: function(lastMessage) {
175-
const name = this.getName();
176-
if (!name || name === "null") {
177-
this.setNameAlias(lastMessage ? lastMessage.getContent() : "");
178-
}
126+
_applyName: function(name) {
127+
return;
179128
},
180129

181130
__listenToConversationMessageWS: function() {
@@ -191,13 +140,14 @@ qx.Class.define("osparc.data.model.Conversation", {
191140
if (conversationId === this.getConversationId()) {
192141
switch (eventName) {
193142
case this.self().CHANNELS.CONVERSATION_MESSAGE_CREATED:
194-
this.addMessage(messageData);
143+
this._addMessage(messageData);
144+
this.setLastMessageCreatedAt(new Date(messageData.created));
195145
break;
196146
case this.self().CHANNELS.CONVERSATION_MESSAGE_UPDATED:
197-
this.updateMessage(messageData);
147+
this._updateMessage(messageData);
198148
break;
199149
case this.self().CHANNELS.CONVERSATION_MESSAGE_DELETED:
200-
this.deleteMessage(messageData);
150+
this._deleteMessage(messageData);
201151
break;
202152
}
203153
}
@@ -207,38 +157,6 @@ qx.Class.define("osparc.data.model.Conversation", {
207157
});
208158
},
209159

210-
__fetchFirstAndLastMessages: function() {
211-
if (this.__fetchingFirstAndLastMessage) {
212-
return this.__fetchingFirstAndLastMessage;
213-
}
214-
215-
this.__fetchingFirstAndLastMessage = true;
216-
osparc.store.ConversationsSupport.getInstance().fetchLastMessage(this.getConversationId())
217-
.then(resp => {
218-
const messages = resp["data"];
219-
if (messages.length) {
220-
const lastMessage = new osparc.data.model.Message(messages[0]);
221-
this.setLastMessage(lastMessage);
222-
}
223-
// fetch first message only if there is more than one message
224-
if (resp["_meta"]["total"] === 1) {
225-
const firstMessage = new osparc.data.model.Message(messages[0]);
226-
this.setFirstMessage(firstMessage);
227-
} else if (resp["_meta"]["total"] > 1) {
228-
osparc.store.ConversationsSupport.getInstance().fetchFirstMessage(this.getConversationId(), resp["_meta"])
229-
.then(firstMessages => {
230-
if (firstMessages.length) {
231-
const firstMessage = new osparc.data.model.Message(firstMessages[0]);
232-
this.setFirstMessage(firstMessage);
233-
}
234-
});
235-
}
236-
return null;
237-
})
238-
.catch(err => osparc.FlashMessenger.logError(err))
239-
.finally(() => this.__fetchingFirstAndLastMessage = null);
240-
},
241-
242160
amIOwner: function() {
243161
return this.getUserGroupId() === osparc.auth.Data.getInstance().getGroupId();
244162
},
@@ -251,7 +169,8 @@ qx.Class.define("osparc.data.model.Conversation", {
251169
limit: 42
252170
}
253171
};
254-
if (this.getStudyId()) {
172+
const isProjectConversation = this instanceof osparc.data.model.ConversationProject;
173+
if (isProjectConversation) {
255174
params.url.studyId = this.getStudyId();
256175
}
257176

@@ -263,13 +182,13 @@ qx.Class.define("osparc.data.model.Conversation", {
263182
const options = {
264183
resolveWResponse: true
265184
};
266-
const promise = this.getStudyId() ?
185+
const promise = isProjectConversation ?
267186
osparc.data.Resources.fetch("conversationsStudies", "getMessagesPage", params, options) :
268187
osparc.data.Resources.fetch("conversationsSupport", "getMessagesPage", params, options);
269188
return promise
270189
.then(resp => {
271190
const messagesData = resp["data"];
272-
messagesData.forEach(messageData => this.addMessage(messageData));
191+
messagesData.forEach(messageData => this._addMessage(messageData));
273192
this.__nextRequestParams = resp["_links"]["next"];
274193
return resp;
275194
})
@@ -282,13 +201,6 @@ qx.Class.define("osparc.data.model.Conversation", {
282201
.catch(err => osparc.FlashMessenger.logError(err));
283202
},
284203

285-
patchExtraContext: function(extraContext) {
286-
osparc.store.ConversationsSupport.getInstance().patchExtraContext(this.getConversationId(), extraContext)
287-
.then(() => {
288-
this.setExtraContext(extraContext);
289-
});
290-
},
291-
292204
getMessages: function() {
293205
return this.__messages;
294206
},
@@ -301,81 +213,35 @@ qx.Class.define("osparc.data.model.Conversation", {
301213
return this.__messages.some(msg => msg.getMessageId() === messageId);
302214
},
303215

304-
addMessage: function(messageData) {
216+
_addMessage: function(messageData) {
305217
let message = this.__messages.find(msg => msg.getMessageId() === messageData["messageId"]);
306218
if (!message) {
307219
message = new osparc.data.model.Message(messageData);
308220
this.__messages.push(message);
309221
osparc.data.model.Message.sortMessagesByDate(this.__messages);
310222
this.fireDataEvent("messageAdded", message);
311-
this.__evalFirstAndLastMessage();
312223
}
313224
return message;
314225
},
315226

316-
updateMessage: function(messageData) {
227+
_updateMessage: function(messageData) {
317228
if (messageData) {
318229
const found = this.__messages.find(msg => msg.getMessageId() === messageData["messageId"]);
319230
if (found) {
320231
found.setData(messageData);
321232
this.fireDataEvent("messageUpdated", found);
322-
this.__evalFirstAndLastMessage();
323233
}
324234
}
325235
},
326236

327-
deleteMessage: function(messageData) {
237+
_deleteMessage: function(messageData) {
328238
if (messageData) {
329239
const found = this.__messages.find(msg => msg.getMessageId() === messageData["messageId"]);
330240
if (found) {
331241
this.__messages.splice(this.__messages.indexOf(found), 1);
332242
this.fireDataEvent("messageDeleted", found);
333-
this.__evalFirstAndLastMessage();
334243
}
335244
}
336245
},
337-
338-
__evalFirstAndLastMessage: function() {
339-
if (this.__messages && this.__messages.length) {
340-
// newest first
341-
this.setFirstMessage(this.__messages[this.__messages.length - 1]);
342-
this.setLastMessage(this.__messages[0]);
343-
}
344-
},
345-
346-
getContextProjectId: function() {
347-
if (this.getExtraContext() && "projectId" in this.getExtraContext()) {
348-
return this.getExtraContext()["projectId"];
349-
}
350-
return null;
351-
},
352-
353-
getFogbugzLink: function() {
354-
if (this.getExtraContext() && "fogbugz_case_url" in this.getExtraContext()) {
355-
return this.getExtraContext()["fogbugz_case_url"];
356-
}
357-
return null;
358-
},
359-
360-
getAppointment: function() {
361-
if (this.getExtraContext() && "appointment" in this.getExtraContext()) {
362-
return this.getExtraContext()["appointment"];
363-
}
364-
return null;
365-
},
366-
367-
setAppointment: function(appointment) {
368-
const extraContext = this.getExtraContext() || {};
369-
extraContext["appointment"] = appointment ? appointment.toISOString() : null;
370-
// OM: Supporters are not allowed to patch the conversation metadata yet
371-
const backendAllowsPatch = osparc.store.Groups.getInstance().amIASupportUser() ? false : true;
372-
if (backendAllowsPatch) {
373-
return osparc.store.ConversationsSupport.getInstance().patchExtraContext(this.getConversationId(), extraContext)
374-
.then(() => {
375-
this.setExtraContext(Object.assign({}, extraContext));
376-
});
377-
}
378-
return Promise.resolve(this.setExtraContext(Object.assign({}, extraContext)));
379-
},
380246
},
381247
});

0 commit comments

Comments
 (0)