Skip to content

Commit 7c18b84

Browse files
authored
Merge pull request #291 from QuickBlox/dev
Sprint 14
2 parents bc05f71 + 359722e commit 7c18b84

29 files changed

+254
-128
lines changed

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@
5858
"jaguarjs-jsdoc": "^1.0.1",
5959
"jasmine": "^2.5.2",
6060
"jasmine-core": "^2.6.0",
61-
"jquery-custom": "^1.1.1",
6261
"jsdoc": "^3.5.5",
6362
"jshint": "^2.9.3",
6463
"jshint-stylish": "^2.2.1",

quickblox.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

samples/chat/css/dashboard.css

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,8 +308,8 @@
308308
margin: 0 0 16px 0;
309309
}
310310

311-
.message__wrap.m-notification_message {
312-
display: block;
311+
.message__wrap .m-notification_message {
312+
width: 100%;
313313
color: #778594;
314314
font-size: 13px;
315315
font-weight: 500;

samples/chat/index.html

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,12 @@ <h2 class="dashboard__title"><%- user.user_tags %></h2>
146146
<button class="open_sidebar j-open_sidebar"></button>
147147
<h1 class="dialog__title j-dialog__title"><%- title %></h1>
148148
<div class="action_links">
149-
<a href="#!/dialog/<%- _id %>/edit" class="add_to_dialog j-add_to_dialog <% type !== 2 ? print('hidden') : ''%>"><i class="material-icons">person_add</i></a>
150-
<a href="#" class="quit_fom_dialog_link j-quit_fom_dialog_link <% type === 1 ? print('hidden') : ''%>"><i class="material-icons">delete</i></a>
149+
<a href="#!/dialog/<%- _id %>/edit" class="add_to_dialog j-add_to_dialog <% type !== 2 ? print('hidden') : ''%>">
150+
<i class="material-icons">person_add</i>
151+
</a>
152+
<a href="#" class="quit_fom_dialog_link j-quit_fom_dialog_link <% type === 1 ? print('hidden') : ''%>" data-dialog="<%- _id %>">
153+
<i class="material-icons">delete</i>
154+
</a>
151155
</div>
152156
</div>
153157
<div class="notifications j-notifications hidden"></div>
@@ -238,8 +242,8 @@ <h1 class="dialog__title j-dialog__title"><%- title %></h1>
238242
</script>
239243

240244
<script type="text/template" id="tpl_notificationMessage">
241-
<div class="message__wrap m-notification_message" id="<%= _id %>">
242-
<%= message || body %>
245+
<div class="message__wrap" id="<%= id %>">
246+
<p class="m-notification_message"><%= text %></p>
243247
</div>
244248
</script>
245249

samples/chat/js/app.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,20 @@ App.prototype.renderDashboard = function (activeTabName) {
5858

5959
logoutBtn.addEventListener('click', function () {
6060
QB.users.delete(app.user.id, function(err, user){
61-
if (!user) {
61+
if (err) {
6262
console.error('Can\'t delete user by id: '+app.user.id+' ', err);
63+
64+
return false;
6365
}
66+
6467
loginModule.isLogin = false;
6568
app.isDashboardLoaded = false;
6669

6770
localStorage.removeItem('user');
6871
helpers.clearCache();
72+
6973
QB.chat.disconnect();
74+
7075
router.navigate('#!/login');
7176
});
7277
});

samples/chat/js/dialog.js

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -226,13 +226,13 @@ Dialog.prototype.renderMessages = function (dialogId) {
226226
self.sidebar.classList.add('active');
227227
}.bind(self));
228228

229-
self.quitLink.addEventListener('click', function(e){
230-
e.preventDefault();
229+
messageModule.init();
230+
231+
self.quitLink.addEventListener('click', function(e) {
232+
e.preventDefault();
231233
if(dialog.type === CONSTANTS.DIALOG_TYPES.PUBLICCHAT) return;
232-
self.quitFromTheDialog(dialogId)
234+
self.quitFromTheDialog(this.dataset.dialog);
233235
});
234-
235-
messageModule.init();
236236
} else {
237237
if (self.prevDialogId) {
238238
messageModule.sendStopTypingStatus(self.prevDialogId);
@@ -252,9 +252,11 @@ Dialog.prototype.renderMessages = function (dialogId) {
252252
}
253253
}
254254

255+
self.editLink.href = '#!/dialog/' + self.dialogId + '/edit';
256+
self.quitLink.dataset.dialog = dialogId;
257+
255258
if(dialog.type === CONSTANTS.DIALOG_TYPES.GROUPCHAT){
256259
self.editLink.classList.remove('hidden');
257-
self.editLink.href = '#!/dialog/' + self.dialogId + '/edit';
258260
} else {
259261
self.editLink.classList.add('hidden');
260262
}
@@ -329,14 +331,19 @@ Dialog.prototype.createDialog = function (params) {
329331
if (err) {
330332
console.error(err);
331333
} else {
332-
var id = createdDialog._id;
333-
var occupants = createdDialog.occupants_ids,
334+
var occupants_names = [],
335+
id = createdDialog._id,
336+
occupants = createdDialog.occupants_ids,
334337
message_body = (app.user.name || app.user.login) + ' created new dialog with: ';
335338

336339
_.each(occupants, function (occupantId) {
337-
message_body += (userModule._cache[occupantId].name || userModule._cache[occupantId].login) + " ";
340+
var occupant_name = userModule._cache[occupantId].name || userModule._cache[occupantId].login;
341+
342+
occupants_names.push(occupant_name);
338343
});
339344

345+
message_body += occupants_names.join(', ');
346+
340347
var systemMessage = {
341348
extension: {
342349
notification_type: 1,
@@ -461,7 +468,7 @@ Dialog.prototype.updateDialog = function (updates) {
461468
if(updates.title !== dialog.name){
462469
toUpdateParams.name = updates.title;
463470
updatedMsg.extension.dialog_name = updates.title;
464-
updatedMsg.body = app.user.name + ' changed the conversation name to "' + updates.title + '".'
471+
updatedMsg.body = app.user.name + ' changed the conversation name to "' + updates.title + '".';
465472
}
466473
}
467474

@@ -479,7 +486,7 @@ Dialog.prototype.updateDialog = function (updates) {
479486

480487
self._cache[dialogId].users = self._cache[dialogId].users.concat(newUsers);
481488

482-
updatedMsg.body = app.user.name + ' adds ' + usernames.join(',') + ' to the conversation.';
489+
updatedMsg.body = app.user.name + ' adds ' + usernames.join(', ') + ' to the conversation.';
483490
updatedMsg.extension.occupants_ids_added = newUsers.join(',');
484491
} else {
485492
router.navigate('/dialog/' + dialogId);
@@ -531,7 +538,7 @@ Dialog.prototype.updateDialog = function (updates) {
531538

532539
_.each(users, function(user){
533540
QB.chat.sendSystemMessage(+user, msg);
534-
})
541+
});
535542
}
536543
};
537544

samples/chat/js/helpers.js

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,10 @@ Helpers.prototype.fillMessagePrams = function (message) {
136136
if (message.message === CONSTANTS.ATTACHMENT.BODY) {
137137
message.message = '';
138138
}
139+
139140
if(!selfDelevered){
140141
messageModule.sendDeliveredStatus(message._id, message.sender_id, message.chat_dialog_id);
141-
};
142+
}
142143

143144
message.selfReaded = selfReaded;
144145

@@ -163,25 +164,26 @@ Helpers.prototype.getMessageStatus = function(message){
163164
};
164165

165166
Helpers.prototype.fillMessageBody = function (str) {
166-
var url, url_text,
167-
URL_REGEXP = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»]))/gi;
167+
var self = this,
168+
url,
169+
URL_REGEXP = /https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s\^\'\"\<\>\(\)]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s\^\'\"\<\>\(\)]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]\.[^\s\^\'\"\<\>\(\)]{2,}|www\.[a-zA-Z0-9]\.[^\s\^\'\"\<\>\(\)]{2,}/g;
168170

169-
str = escapeHTML(str);
171+
str = self.escapeHTML(str);
170172

171173
// parser of paragraphs
172174
str = str.replace(/\n/g, '<br>');
173175
// parser of links
174176
str = str.replace(URL_REGEXP, function(match) {
175-
url = (/^[a-z]+:/i).test(match) ? match : 'http://' + match;
176-
url_text = match;
177-
return '<a href="' + escapeHTML(url) + '" target="_blank">' + escapeHTML(url_text) + '</a>';
177+
url = (/^[a-z]+:/i).test(match) ? match : 'https://' + match;
178+
179+
return '<a href="' + self.escapeHTML(url) + '" target="_blank">' + self.escapeHTML(match) + '</a>';
178180
});
179181

180182
return str;
183+
};
181184

182-
function escapeHTML(s) {
183-
return s.replace(/</g, "&lt;").replace(/>/g, "&gt;");
184-
}
185+
Helpers.prototype.escapeHTML = function (str) {
186+
return str.replace(/</g, "&lt;").replace(/>/g, "&gt;");
185187
};
186188

187189
Helpers.prototype.getSrcFromAttachmentId = function (id) {

samples/chat/js/listeners.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,20 @@ Listeners.prototype.onNotificationMessage = function(userId, message){
7878
msg = helpers.fillNewMessageParams(userId, message),
7979
dialog = dialogModule._cache[message.dialog_id],
8080
extension = message.extension,
81-
dialogId = message.dialog_id;
81+
dialogId = message.dialog_id,
82+
occupantsIdsAdded = extension.occupants_ids_added && extension.occupants_ids_added.split(',');
8283

8384
if(extension.notification_type === CONSTANTS.NOTIFICATION_TYPES.UPDATE_DIALOG){
8485
if (extension.occupants_ids_removed) {
8586
dialogModule._cache[dialogId].users = dialogModule._cache[dialogId].users.filter(function(user){
8687
return user !== userId;
8788
});
8889
} else if(extension.occupants_ids_added) {
89-
dialog.users.push(userId);
90+
_.each(occupantsIdsAdded, function(userId) {
91+
if (dialog.users.indexOf(+userId) === -1) {
92+
dialog.users.push(+userId);
93+
}
94+
});
9095
} else if(extension.dialog_name){
9196
dialog.name = extension.dialog_name;
9297
dialogModule.updateDialogUi(dialogId, extension.dialog_name);

samples/chat/js/login.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,14 @@ Login.prototype.login = function (user) {
101101
reject(error);
102102
}
103103
});
104+
104105
};
105106

106107
Login.prototype.renderLoginPage = function(){
107108
helpers.clearView(app.page);
108109

109110
app.page.innerHTML = helpers.fillTemplate('tpl_login', {
110-
version: QB.version
111+
version: QB.version + ':' + QB.buildNumber
111112
});
112113
this.isLoginPageRendered = true;
113114
this.setListeners();

samples/chat/js/message.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -184,10 +184,10 @@ Message.prototype.getMessages = function (dialogId) {
184184
self.container.classList.add('loading');
185185

186186
QB.chat.message.list(params, function (err, messages) {
187-
if (!err) {
187+
if (messages) {
188188
var dialog = dialogModule._cache[dialogId];
189189
dialog.messages = dialog.messages.concat(messages.items);
190-
190+
191191
if (messages.items.length < self.limit) {
192192
dialog.full = true;
193193
}
@@ -266,8 +266,9 @@ Message.prototype.sendReadStatus = function(messageId, userId, dialogId){
266266
Message.prototype.renderMessage = function (message, setAsFirst) {
267267
var self = this,
268268
sender = userModule._cache[message.sender_id],
269+
dialogId = message.chat_dialog_id,
269270
messagesHtml,
270-
dialogId = message.chat_dialog_id;
271+
messageText;
271272

272273
if(!message.selfReaded){
273274
self.sendReadStatus(message._id, message.sender_id, dialogId);
@@ -276,11 +277,14 @@ Message.prototype.renderMessage = function (message, setAsFirst) {
276277
}
277278

278279
if(message.notification_type || (message.extension && message.extension.notification_type)) {
279-
messagesHtml = helpers.fillTemplate('tpl_notificationMessage', message);
280+
messageText = message.message ? helpers.escapeHTML(message.message) : helpers.escapeHTML(message.body);
281+
282+
messagesHtml = helpers.fillTemplate('tpl_notificationMessage', {
283+
id: message._id,
284+
text: messageText
285+
});
280286
} else {
281-
var messageText = message.message ?
282-
helpers.fillMessageBody(message.message || '') :
283-
helpers.fillMessageBody(message.body || '');
287+
messageText = message.message ? helpers.fillMessageBody(message.message || '') : helpers.fillMessageBody(message.body || '');
284288

285289
messagesHtml = helpers.fillTemplate('tpl_message', {
286290
message: {

samples/chat/js/route.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ router.on({
185185
var userItem = JSON.parse(JSON.stringify(user));
186186

187187
userItem.selected = dialogOccupants.indexOf(userItem.id) !== -1;
188+
188189
return userItem;
189190
});
190191

@@ -197,15 +198,15 @@ router.on({
197198
if(elem.classList.contains('disabled')) return;
198199
if(elem.classList.contains('selected')){
199200
elem.classList.remove('selected');
200-
newUsersCount--
201+
newUsersCount--;
201202
} else {
202203
elem.classList.add('selected');
203-
newUsersCount++
204+
newUsersCount++;
204205
}
205206

206207
counterElem.innerText = newUsersCount;
207208

208-
addUsersBtn.disabled = !newUsersCount
209+
addUsersBtn.disabled = !newUsersCount;
209210
});
210211

211212
userList.appendChild(userElem);

samples/chat/js/user.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ User.prototype.getUsers = function () {
9393

9494
resolve(userList);
9595
});
96-
})
96+
});
9797
};
9898

9999
User.prototype.buildUserItem = function (user) {

samples/data/index.html

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,16 +101,16 @@ <h2 class="panel__title">Create a new place</h2>
101101
<input id="latlng" type="hidden" value={{latLng}}>
102102

103103
<div class="form_item">
104-
<input id="title" class="inp" type="text" required placeholder="Place name" maxlength="40">
104+
<input id="title" class="inp" type="text" required pattern="[A-Za-z\s]{4,40}" title="Only latin from 4 to 40 symbols" placeholder="Place name">
105105
</div>
106106

107107
<div class="form_item">
108-
<input id="description" class="inp" type="text" required placeholder="Description" maxlength="80">
108+
<input id="description" class="inp" type="text" required pattern="[A-Za-z\s]{4,80}" title="Only latin from 4 to 80 symbols" placeholder="Description" >
109109
</div>
110110

111111
<div class="form_item">
112112
<label for="rate">Rate</label>
113-
<input id="rate" class="inp" type="number" min="0" max="5" step="0.1" value="0" required>
113+
<input id="rate" class="inp" type="number" min="0" max="5" step="0.1" value="5" required>
114114
</div>
115115

116116
<div class="form_item" class="form_item form_item-media">
@@ -227,7 +227,12 @@ <h4 class="form__title">Check in</h4>
227227
<input id="checkin_id" type="hidden" value={{id}}>
228228

229229
<div class="form_item">
230-
<input id="checkin_comment" class="inp" type="text" required placeholder="Enter your comment" maxlength="40" required>
230+
<input id="checkin_comment" class="inp"
231+
type="text"
232+
placeholder="Enter your comment"
233+
pattern="[A-Za-z\s]{4,40}"
234+
title="Only latin from 4 to 40 symbols"
235+
required>
231236
</div>
232237

233238
<div class="form_item">

0 commit comments

Comments
 (0)