@@ -21,11 +21,12 @@
21 21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
inputForm: E1('#chat-form'),
22 22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
btnSubmit: E1('#chat-message-submit'),
23 23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
inputSingle: E1('#chat-input-single'),
24 24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
inputMulti: E1('#chat-input-multi'),
25 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
inputCurrent: undefined/*one of inputSingle or inputMulti*/,
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- inputFile: E1('#chat-input-file')
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inputFile: E1('#chat-input-file'),
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contentDiv: E1('div.content')
27 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
28 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
me: F.user.name,
29 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mxMsg: F.config.chat.initSize ? -F.config.chat.initSize : -50,
30 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mnMsg: undefined/*lowest message ID we've seen so far (for history loading)*/,
31 32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pageIsActive: 'visible'===document.visibilityState,
@@ -64,10 +65,11 @@
64 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.e.inputCurrent = this.e.inputSingle;
65 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
66 67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.addClass(old, 'hidden');
67 68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.removeClass(this.e.inputCurrent, 'hidden');
68 69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.e.inputCurrent.value = old.value;
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ old.value = '';
69 71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this;
70 72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
71 73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/** Enables (if yes is truthy) or disables all elements in
72 74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
* this.disableDuringAjax. */
73 75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
enableAjaxComponents: function(yes){
@@ -115,26 +117,34 @@
115 117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(atEnd){
116 118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mip.parentNode.insertBefore(e, mip);
117 119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
118 120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(mip.nextSibling) mip.parentNode.insertBefore(e, mip.nextSibling);
119 121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
else mip.parentNode.appendChild(e);
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(this.isChatOnlyMode()){
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- e.scrollIntoView();
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //const rect = e.getBoundingClientRect();
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //const rect = this.e.inputWrapper.getBoundingClientRect();
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //window.scrollBy(0, -cs.height);
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //console.debug("rect =",rect);
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //window.scrollBy(0,rect.height);
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //window.scrollTo(0,rect.top);
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //e.querySelector('.message-widget-tab').scrollIntoView();
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(this.isUiFlipped()){
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* When UI is flipped, new messages start out under the
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ text input area because of its position:sticky
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style. We have to scroll them up. When the page footer
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is not hidden but is not on-screen, this causes a
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ slight amount of UI jarring as the footer is *also*
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ scrolled into view (for whatever reason). */
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ setTimeout(()=>e.scrollIntoView(), 0);
130 130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
131 131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
132 132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- isChatOnlyMode: function(){
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return document.body.classList.contains('chat-only-mode');
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Returns true if chat-only mode is enabled. */
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isChatOnlyMode: ()=>document.body.classList.contains('chat-only-mode'),
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Returns true if the UI seems to be in "bottom-up" mode. */
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isUiFlipped: function(){
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const style = window.getComputedStyle(this.e.contentDiv);
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return style.flexDirection.indexOf("-reverse")>0;
135 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Enters (if passed a truthy value or no arguments) or leaves
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "chat-only" mode. That mode hides the page's header and
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ footer, leaving only the chat application visible to the
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ user.
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
136 146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
chatOnlyMode: function f(yes){
137 147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(undefined === f.elemsToToggle){
138 148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.elemsToToggle = [];
139 149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
document.body.childNodes.forEach(function(e){
140 150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!e.classList) return/*TEXT nodes and such*/;
@@ -153,15 +163,17 @@
153 163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
document.body.scroll(0,document.body.height);
154 164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
155 165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.removeClass(f.elemsToToggle, 'hidden');
156 166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.removeClass(document.body, 'chat-only-mode');
157 167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
setTimeout(()=>document.body.scrollIntoView(
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*moves to (0,0), whereas scrollTo(0,0) does not!*/
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*moves to (0,0), whereas scrollTo(0,0) does not!
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ setTimeout() is unfortunately necessary to get the scroll
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ placement correct.*/
159 171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
), 0);
160 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
161 173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const msg = document.querySelector('.message-widget');
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(msg) msg.scrollIntoView();
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(msg) setTimeout(()=>msg.scrollIntoView(),0);
163 175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this;
164 176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
165 177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
toggleChatOnlyMode: function(){
166 178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this.chatOnlyMode(!this.isChatOnlyMode());
167 179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
@@ -169,25 +181,31 @@
169 181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
get: (k,dflt)=>F.storage.get(k,dflt),
170 182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
getBool: (k,dflt)=>F.storage.getBool(k,dflt),
171 183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set: (k,v)=>F.storage.set(k,v),
172 184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
defaults:{
173 185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"images-inline": !!F.config.chat.imagesInline,
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "monospace-messages": false
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "monospace-messages": false,
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "bottom-up": true
175 188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
176 189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
177 190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Object.keys(cs.settings.defaults).forEach(function f(k){
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const v = cs.settings.get(k,f);
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(f===v) cs.settings.set(k,cs.settings.defaults[k]);
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Install default settings... */
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Object.keys(cs.settings.defaults).forEach(function(k){
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const v = cs.settings.get(k,cs);
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(cs===v) cs.settings.set(k,cs.settings.defaults[k]);
181 195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
182 196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(window.innerWidth<window.innerHeight){
183 197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Alignment of 'my' messages: right alignment is conventional
184 198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for mobile chat apps but can be difficult to read in wide
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- windows (desktop/tablet landscape mode). Can be toggled via
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- settings popup. */
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ windows (desktop/tablet landscape mode), so we default to a
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ layout based on the apparently "orientation" of the window:
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tall vs wide. Can be toggled via settings popup. */
187 202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
document.body.classList.add('my-messages-right');
188 203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(cs.settings.getBool("bottom-up")){
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document.body.classList.add('chat-bottom-up');
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
189 207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(cs.settings.getBool('monospace-messages',false)){
190 208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
document.body.classList.add('monospace-messages');
191 209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
192 210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cs.e.inputCurrent = cs.e.inputSingle;
193 211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cs.pageTitleOrig = cs.e.pageTitle.innerText;
@@ -327,12 +345,15 @@
327 345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.e.content.style.backgroundColor = m.uclr;
328 346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.e.tab.style.backgroundColor = m.uclr;
329 347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
330 348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const d = new Date(m.mtime);
331 349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.append(
332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- D.clearElement(this.e.tab), D.text(
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- m.xfrom+' @ '+d.getHours()+":"+(d.getMinutes()+100).toString().slice(1,3))
350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.clearElement(this.e.tab),
351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.text(
352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.xfrom," #",m.msgid,' @ ',d.getHours(),":",
353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (d.getMinutes()+100).toString().slice(1,3)
354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
334 355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
335 356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var contentTarget = this.e.content;
336 357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( m.fsize>0 ){
337 358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( m.fmime
338 359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& m.fmime.startsWith("image/")
@@ -347,14 +368,17 @@
347 368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"(" + m.fname + " " + m.fsize + " bytes)"
348 369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
)
349 370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.attr(a,'target','_blank');
350 371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
contentTarget.appendChild(a);
351 372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- contentTarget = D.div();
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ;
353 374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
354 375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(m.xmsg){
355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(contentTarget !== this.e.content){
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(m.fsize>0){
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* We have file/image content, so need another element for
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the message text. */
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contentTarget = D.div();
356 380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.append(this.e.content, contentTarget);
357 381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
358 382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// The m.xmsg text comes from the same server as this script and
359 383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// is guaranteed by that server to be "safe" HTML - safe in the
360 384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// sense that it is not possible for a malefactor to inject HTML
@@ -552,11 +576,11 @@
552 576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.deleteMessage(eMsg);
553 577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
554 578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
555 579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}/*refresh()*/
556 580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- f.popup.installClickToHide();
581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ f.popup.installHideHandlers();
558 582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.popup.hide = function(){
559 583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
delete this._eMsg;
560 584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.clearElement(this.e);
561 585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this.show(false);
562 586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
@@ -608,10 +632,18 @@
608 632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
label: "Left-align my posts",
609 633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
boolValue: ()=>!document.body.classList.contains('my-messages-right'),
610 634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
callback: function f(){
611 635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
document.body.classList.toggle('my-messages-right');
612 636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },{
638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ label: "Bottom-up chat",
639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ boolValue: ()=>document.body.classList.contains('chat-bottom-up'),
640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ callback: function(){
641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document.body.classList.toggle('chat-bottom-up');
642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.settings.set('bottom-up',
643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document.body.classList.contains('chat-bottom-up'));
644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
613 645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},{
614 646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
label: "Images inline",
615 647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
boolValue: ()=>Chat.settings.getBool('images-inline'),
616 648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
callback: function(){
617 649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const v = Chat.settings.getBool('images-inline',true);
@@ -642,13 +674,18 @@
642 674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
643 675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.append(settingsPopup.e, line);
644 676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
btn.addEventListener('click', callback);
645 677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
646 678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- settingsPopup.installClickToHide()
648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /** Reminder: that interferes with "?" embedded within the popup,
649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- so cannot be used together with those. */;
679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ settingsPopup.installHideHandlers(false, true, true)
680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Reminder: click-to-hide interferes with "?" embedded within
681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the popup, so cannot be used together with those. Enabling
682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this means, however, that tapping the menu button to toggle
683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the menu cannot work because tapping the menu button while the
684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ menu is opened will, because of the click-to-hide handler,
685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ hide the menu before the button gets an event saying to toggle
686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ it.*/;
650 687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.attr(settingsButton, 'role', 'button');
651 688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
settingsButton.addEventListener('click',function(ev){
652 689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
//ev.preventDefault();
653 690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(settingsPopup.isShown()) settingsPopup.hide();
654 691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
else settingsPopup.show(settingsButton);
@@ -665,11 +702,11 @@
665 702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const rect = settingsButton.getBoundingClientRect();
666 703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rect.right - popupSize.width;
667 704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
668 705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
settingsPopup.options.adjustY = function(y){
669 706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const rect = settingsButton.getBoundingClientRect();
670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(Chat.isChatOnlyMode()){
707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(Chat.isUiFlipped()){
671 708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rect.top - popupSize.height -2;
672 709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
673 710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rect.bottom + 2;
674 711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
675 712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
676 713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!