@@ -7,17 +7,25 @@
7 7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const E1 = function(selector){
8 8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const e = document.querySelector(selector);
9 9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!e) throw new Error("missing required DOM element: "+selector);
10 10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return e;
11 11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //document.body.classList.add('chat-only-mode');
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const isInViewport = function(e) {
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const rect = e.getBoundingClientRect();
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rect.top >= 0 &&
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rect.left >= 0 &&
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rect.right <= (window.innerWidth || document.documentElement.clientWidth)
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
13 21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const Chat = (function(){
14 22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const cs = {
15 23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
e:{/*map of certain DOM elements.*/
16 24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
messageInjectPoint: E1('#message-inject-point'),
17 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pageTitle: E1('head title'),
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- loadToolbar: undefined /* the load-posts toolbar (dynamically created) */,
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ loadOlderToolbar: undefined /* the load-posts toolbar (dynamically created) */,
19 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
inputWrapper: E1("#chat-input-area"),
20 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fileSelectWrapper: E1('#chat-input-file-area'),
21 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
messagesWrapper: E1('#chat-messages-wrapper'),
22 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
inputForm: E1('#chat-form'),
23 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
btnSubmit: E1('#chat-message-submit'),
@@ -112,55 +120,30 @@
112 120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
],
113 121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Injects element e as a new row in the chat, at the top of the
114 122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
list if atEnd is falsy, else at the end of the list, before
115 123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
the load-history widget. */
116 124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
injectMessageElem: function f(e, atEnd){
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const mip = atEnd ? this.e.loadToolbar : this.e.messageInjectPoint;
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const mip = atEnd ? this.e.loadOlderToolbar : this.e.messageInjectPoint,
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ holder = this.e.messagesWrapper;
118 127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(atEnd){
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mip.parentNode.insertBefore(e, mip);
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const fe = mip.nextElementSibling;
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(fe) mip.parentNode.insertBefore(e, fe);
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else D.append(mip.parentNode, e);
120 131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const self = this;
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(false && 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!
-
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The remaining problem here is messages with IMG tags.
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- At this point in the process their IMG.src has not yet
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- been loaded - that's async. We scroll the message into
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- view, but then the downstream loading of IMG.src pushes
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the message content back down, sliding the message
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- behind the input field. This can be verified by delaying the
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- message scroll by a second or so to give the image time
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- to load (from a local server instance).
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- D.addClass(self.e.inputWrapper,'unsticky');
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(mip.nextSibling) mip.parentNode.insertBefore(e, mip.nextSibling);
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- else mip.parentNode.appendChild(e);
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(false && this.isUiFlipped()){
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //e.scrollIntoView();
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- setTimeout(function(){
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //self.e.inputWrapper.scrollIntoView();
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //self.e.fileSelectWrapper.scrollIntoView();
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //e.scrollIntoView();
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- //D.removeClass(self.e.inputWrapper,'unsticky');
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- self.e.inputWrapper.scrollIntoView();
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- },0);
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(holder,e);
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(!atEnd && !this.isMassLoading
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && e.dataset.xfrom!==Chat.me && !isInViewport(e)){
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If a new non-history message arrives while the user is
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ scrolled elsewhere, do not scroll to the latest
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ message, but gently alert the user that a new message
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ has arrived. */
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.toast.message("New message has arrived.");
153 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
154 142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
155 143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/** Returns true if chat-only mode is enabled. */
156 144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isChatOnlyMode: ()=>document.body.classList.contains('chat-only-mode'),
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /** Returns true if the UI seems to be in "bottom-up" mode. */
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- isUiFlipped: function(){
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const style = window.getComputedStyle(this.e.contentDiv);
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return style.flexDirection.indexOf("-reverse")>0;
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- },
162 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
163 146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Enters (if passed a truthy value or no arguments) or leaves
164 147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"chat-only" mode. That mode hides the page's header and
165 148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
footer, leaving only the chat application visible to the
166 149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
user.
@@ -167,11 +150,11 @@
167 150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
168 151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
chatOnlyMode: function f(yes){
169 152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(undefined === f.elemsToToggle){
170 153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.elemsToToggle = [];
171 154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
document.querySelectorAll(
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "body > div.header, body > div.footer"
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "body > div.header, body > div.mainmenu, body > div.footer"
173 156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
).forEach((e)=>f.elemsToToggle.push(e));
174 157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
175 158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!arguments.length) yes = true;
176 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(yes === this.isChatOnlyMode()) return this;
177 160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(yes){
@@ -179,17 +162,10 @@
179 162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.addClass(document.body, 'chat-only-mode');
180 163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
document.body.scroll(0,document.body.height);
181 164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
182 165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.removeClass(f.elemsToToggle, 'hidden');
183 166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.removeClass(document.body, 'chat-only-mode');
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(false){
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- setTimeout(()=>document.body.scrollIntoView(
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*moves to (0,0), whereas scrollTo(0,0) does not!
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- setTimeout() is unfortunately necessary to get the scroll
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- placement correct.*/
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ), 0);
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
191 167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
192 168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const msg = document.querySelector('.message-widget');
193 169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(msg) setTimeout(()=>msg.scrollIntoView(),0);
194 170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this;
195 171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
@@ -200,12 +176,11 @@
200 176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
get: (k,dflt)=>F.storage.get(k,dflt),
201 177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
getBool: (k,dflt)=>F.storage.getBool(k,dflt),
202 178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set: (k,v)=>F.storage.set(k,v),
203 179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
defaults:{
204 180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"images-inline": !!F.config.chat.imagesInline,
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "monospace-messages": false,
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "bottom-up": true
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "monospace-messages": false
207 182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
208 183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
209 184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
210 185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Install default settings... */
211 186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Object.keys(cs.settings.defaults).forEach(function(k){
@@ -218,13 +193,10 @@
218 193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
windows (desktop/tablet landscape mode), so we default to a
219 194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
layout based on the apparently "orientation" of the window:
220 195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tall vs wide. Can be toggled via settings popup. */
221 196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
document.body.classList.add('my-messages-right');
222 197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(cs.settings.getBool("bottom-up")){
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- document.body.classList.add('chat-bottom-up');
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
226 198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(cs.settings.getBool('monospace-messages',false)){
227 199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
document.body.classList.add('monospace-messages');
228 200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
229 201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cs.e.inputCurrent = cs.e.inputSingle;
230 202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cs.pageTitleOrig = cs.e.pageTitle.innerText;
@@ -671,30 +643,10 @@
671 643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
label: "Left-align my posts",
672 644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
boolValue: ()=>!document.body.classList.contains('my-messages-right'),
673 645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
callback: function f(){
674 646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
document.body.classList.toggle('my-messages-right');
675 647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- },{
677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- label: "Bottom-up chat",
678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- boolValue: ()=>document.body.classList.contains('chat-bottom-up'),
679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- callback: function(){
680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- document.body.classList.toggle('chat-bottom-up');
681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Chat.settings.set('bottom-up',
682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- document.body.classList.contains('chat-bottom-up'));
683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(false){
684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Reminder: in order to get a good scrolling effect when
685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sticky mode is enabled for Chat.e.inputWrapper, BOTH of
686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- these scrollIntoView() calls are needed. */
687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const e = document.querySelector(
688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- '.message-widget'/*this is always the most recent message,
689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- even if flexbox placed it at the end of
690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the page!*/
691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(e) e.scrollIntoView();
693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- setTimeout(()=>Chat.e.inputWrapper.scrollIntoView(), 0);
695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
696 648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},{
697 649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
label: "Images inline",
698 650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
boolValue: ()=>Chat.settings.getBool('images-inline'),
699 651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
callback: function(){
700 652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const v = Chat.settings.getBool('images-inline',true);
@@ -753,15 +705,11 @@
753 705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const rect = settingsButton.getBoundingClientRect();
754 706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rect.right - popupSize.width;
755 707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
756 708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
settingsPopup.options.adjustY = function(y){
757 709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const rect = settingsButton.getBoundingClientRect();
758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(Chat.isUiFlipped()){
759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rect.top - popupSize.height -2;
760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rect.bottom + 2;
762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rect.top - popupSize.height -2;
763 711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
764 712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
})()/*#chat-settings-button setup*/;
765 713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
766 714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
767 715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/** Callback for poll() to inject new content into the page. jx ==
@@ -810,11 +758,11 @@
810 758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/** Add toolbar for loading older messages. We use a FIELDSET here
811 759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
because a fieldset is the only parent element type which can
812 760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
automatically enable/disable its children by
813 761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
enabling/disabling the parent element. */
814 762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const loadLegend = D.legend("Load...");
815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const toolbar = Chat.e.loadToolbar = D.attr(
763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const toolbar = Chat.e.loadOlderToolbar = D.attr(
816 764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.fieldset(loadLegend), "id", "load-msg-toolbar"
817 765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
818 766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.disableDuringAjax.push(toolbar);
819 767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Loads the next n oldest messages, or all previous history if n is negative. */
820 768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const loadOldMessages = function(n){
@@ -834,16 +782,16 @@
834 782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| (false!==gotMessages && n<0 && gotMessages<Chat.loadMessageCount
835 783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*we asked for default amount and got fewer than that.*/)){
836 784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* We've loaded all history. Permanently disable the
837 785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
history-load toolbar and keep it from being re-enabled
838 786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
via the ajaxStart()/ajaxEnd() mechanism... */
839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const div = Chat.e.loadToolbar.querySelector('div');
787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const div = Chat.e.loadOlderToolbar.querySelector('div');
840 788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.append(D.clearElement(div), "All history has been loaded.");
841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- D.addClass(Chat.e.loadToolbar, 'all-done');
842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const ndx = Chat.disableDuringAjax.indexOf(Chat.e.loadToolbar);
789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.addClass(Chat.e.loadOlderToolbar, 'all-done');
790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const ndx = Chat.disableDuringAjax.indexOf(Chat.e.loadOlderToolbar);
843 791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(ndx>=0) Chat.disableDuringAjax.splice(ndx,1);
844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Chat.e.loadToolbar.disabled = true;
792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.e.loadOlderToolbar.disabled = true;
845 793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
846 794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(gotMessages > 0){
847 795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.toast.message("Loaded "+gotMessages+" older messages.");
848 796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
849 797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.ajaxEnd();
@@ -863,19 +811,21 @@
863 811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
864 812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
async function poll(isFirstCall){
865 813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(poll.running) return;
866 814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
poll.running = true;
867 815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(isFirstCall) Chat.ajaxStart();
816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.isMassLoading = isFirstCall;
868 817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var p = fetch("chat-poll?name=" + Chat.mxMsg);
869 818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p.then(x=>x.json())
870 819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
.then(y=>newcontent(y))
871 820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
.catch(e=>console.error(e))
872 821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* ^^^ we don't use Chat.reportError(e) here b/c the polling
873 822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fails exepectedly when it times out, but is then immediately
874 823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
resumed, and reportError() produces a loud error message. */
875 824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
.finally(function(x){
876 825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(isFirstCall){
826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.isMassLoading = false;
877 827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.ajaxEnd();
878 828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.e.inputWrapper.scrollIntoView();
879 829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
880 830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
poll.running=false;
881 831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
882 832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!