-
Notifications
You must be signed in to change notification settings - Fork 23
/
utils.js
103 lines (93 loc) · 2.58 KB
/
utils.js
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
export function searchAndReplace(str, find, replace) {
return str.split(find).join(replace)
}
export function escapeHTML(text) {
let comment
comment = searchAndReplace(text, '<', '<')
comment = searchAndReplace(comment, '>', '>')
return comment
}
export class GroupChatBuilder {
/**
* Create a group chat room builder.
* @constructs
* @param {RoomAdapter} roomAdapter - Room adapter to be used to call backend
* API.
*/
constructor (roomAdapter) {
this.roomAdapter = roomAdapter
this.name = null
this.emails = []
this.options = {}
}
/**
* Set the room name
* @param {string} name - Room name
* @returns {GroupChatBuilder}
*/
withName(name) {
this.name = name
return this
}
/**
* Add an options to this room.
* @param {object} options - Any data that is `JSON.stringify` able
* @returns {GroupChatBuilder}
*/
withOptions(options) {
this.options = options
return this
}
/**
* Add more participants to the room.
* This method use javascript rest operator, which mean you can add as many as
* you want.
* eg: addParticipants('email1@gg.com', 'email2@gg.com')
* @param {string} emails - Email of participant to be added.
*/
addParticipants(...emails) {
this.emails = this.emails
.filter(email => emails.indexOf(email) === -1)
.concat(...emails)
return this
}
/**
* Real create group chat room by calling the backend API.
* @returns {Promise.<Room, Error>}
*/
create() {
const name = this.name
const emails = this.emails
const options = this.options
return this.roomAdapter
.createRoom(name, emails, { avatarURL: options.avatarURL }, options)
}
}
export function scrollToBottom(latestCommentId) {
requestAnimationFrame(function () {
if (latestCommentId > 0) {
const elementToScroll = document.getElementById(latestCommentId)
if (!elementToScroll) return false
elementToScroll.scrollIntoView({ block: 'end', behavior: 'smooth' })
}
// on entering the room, wait for data processed then focus on comment form
document.getElementsByClassName('qcw-comment-form').item(0).getElementsByTagName('textarea').item(0).focus()
})
}
export class UrlBuilder {
constructor (baseUrl) {
this.baseUrl = baseUrl
this.params = {}
}
param(key, value) {
this.params[key] = value
return this
}
build() {
const param = Object.keys(this.params)
.filter(it => this.params[it] != null)
.map(key => `${key}=${this.params[key]}`)
.join('&')
return [this.baseUrl, param].join('?')
}
}