@@ -129,12 +129,13 @@
129 129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return resized;
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!
fossil.FRK = ForceResizeKludge/*for debugging*/;
132 132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const Chat = ForceResizeKludge.chat = (function(){
133 133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const cs = { // the "Chat" object (result of this function)
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- verboseErrors: false /* if true then certain, mostly extraneous,
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- error messages may be sent to the console. */,
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ beVerbose: false /* if true then certain, mostly extraneous,
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ error messages and log messages may be sent
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to the console. */,
136 137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
playedBeep: false /* used for the beep-once setting */,
137 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
e:{/*map of certain DOM elements.*/
138 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
messageInjectPoint: E1('#message-inject-point'),
139 140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pageTitle: E1('head title'),
140 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
loadOlderToolbar: undefined /* the load-posts toolbar (dynamically created) */,
@@ -155,11 +156,12 @@
155 156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
viewSearch: E1('#chat-search'),
156 157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
searchContent: E1('#chat-search-content'),
157 158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
btnPreview: E1('#chat-button-preview'),
158 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
views: document.querySelectorAll('.chat-view'),
159 160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
activeUserListWrapper: E1('#chat-user-list-wrapper'),
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- activeUserList: E1('#chat-user-list')
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ activeUserList: E1('#chat-user-list'),
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eMsgPollError: undefined /* current connection error MessageMidget */
161 163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
162 164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
me: F.user.name,
163 165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mxMsg: F.config.chat.initSize ? -F.config.chat.initSize : -50,
164 166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mnMsg: undefined/*lowest message ID we've seen so far (for history loading)*/,
165 167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pageIsActive: 'visible'===document.visibilityState,
@@ -179,10 +181,49 @@
179 181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
filterState:{
180 182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
activeUser: undefined,
181 183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
match: function(uname){
182 184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this.activeUser===uname || !this.activeUser;
183 185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The timer object is used to control connection throttling
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ when connection errors arrise. It starts off with a polling
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ delay of $initialDelay ms. If there's a connection error,
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ that gets bumped by some value for each subsequent error, up
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to some max value.
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The timeing of resetting the delay when service returns is,
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ because of the long-poll connection and our lack of low-level
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ insight into the connection at this level, a bit wonky.
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ timer:{
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tidPoller: undefined /* poller timer */,
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $initialDelay: 1000 /* initial polling interval (ms) */,
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ currentDelay: 1000 /* current polling interval */,
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ maxDelay: 60000 * 5 /* max interval when backing off for
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ connection errors */,
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ minDelay: 5000 /* minimum delay time */,
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tidReconnect: undefined /*timer id for reconnection determination*/,
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ randomInterval: function(factor){
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return Math.floor(Math.random() * factor);
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ incrDelay: function(){
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( this.maxDelay > this.currentDelay ){
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(this.currentDelay < this.minDelay){
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.currentDelay = this.minDelay + this.randomInterval(this.minDelay);
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.currentDelay = this.currentDelay*2 + this.randomInterval(this.currentDelay);
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this.currentDelay;
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ resetDelay: function(){
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this.currentDelay = this.$initialDelay;
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isDelayed: function(){
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (this.currentDelay > this.$initialDelay) ? this.currentDelay : 0;
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
184 225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
185 226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
186 227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Gets (no args) or sets (1 arg) the current input text field
187 228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
value, taking into account single- vs multi-line input. The
188 229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
getter returns a trim()'d string and the setter returns this
@@ -606,11 +647,11 @@
606 647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
607 648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
608 649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
If animations are enabled, passes its arguments
609 650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
to D.addClassBriefly(), else this is a no-op.
610 651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
If cb is a function, it is called after the
611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- CSS class is removed. Returns this object;
652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CSS class is removed. Returns this object;
612 653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
613 654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
animate: function f(e,a,cb){
614 655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!f.$disabled){
615 656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.addClassBriefly(e, a, 0, cb);
616 657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -645,33 +686,60 @@
645 686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cs.reportError = function(/*msg args*/){
646 687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const args = argsToArray(arguments);
647 688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
console.error("chat error:",args);
648 689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.toast.error.apply(F.toast, args);
649 690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ let InternalMsgId = 0;
650 693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
651 694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Reports an error in the form of a new message in the chat
652 695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
feed. All arguments are appended to the message's content area
653 696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
using fossil.dom.append(), so may be of any type supported by
654 697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
that function.
655 698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
656 699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cs.reportErrorAsMessage = function f(/*msg args*/){
657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(undefined === f.$msgid) f.$msgid=0;
658 700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const args = argsToArray(arguments).map(function(v){
659 701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return (v instanceof Error) ? v.message : v;
660 702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- console.error("chat error:",args);
703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(Chat.beVerbose){
704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ console.error("chat error:",args);
705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
662 706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const d = new Date().toISOString(),
663 707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mw = new this.MessageWidget({
664 708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isError: true,
665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- xfrom: null,
666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- msgid: "error-"+(++f.$msgid),
709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xfrom: undefined,
710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ msgid: "error-"+(++InternalMsgId),
711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mtime: d,
712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lmtime: d,
713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xmsg: args
714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.injectMessageElem(mw.e.body);
716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mw.scrollIntoView();
717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return mw;
718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ For use by the connection poller to send a "connection
722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ restored" message.
723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cs.reportReconnection = function f(/*msg args*/){
725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const args = argsToArray(arguments).map(function(v){
726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (v instanceof Error) ? v.message : v;
727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const d = new Date().toISOString(),
729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mw = new this.MessageWidget({
730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isError: false,
731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xfrom: undefined,
732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ msgid: "reconnect-"+(++InternalMsgId),
667 733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mtime: d,
668 734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lmtime: d,
669 735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xmsg: args
670 736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
671 737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.injectMessageElem(mw.e.body);
672 738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mw.scrollIntoView();
739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //Chat.playNewMessageSound();// browser complains b/c this wasn't via human interaction
740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return mw;
673 741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
674 742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
675 743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cs.getMessageElemById = function(id){
676 744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return qs('[data-msgid="'+id+'"]');
677 745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
@@ -690,24 +758,41 @@
690 758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
691 759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LOCALLY deletes a message element by the message ID or passing
692 760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
the .message-row element. Returns true if it removes an element,
693 761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
else false.
694 762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cs.deleteMessageElem = function(id){
763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cs.deleteMessageElem = function(id, silent){
696 764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var e;
765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //console.warn("Chat.deleteMessageElem",id,silent);
697 766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(id instanceof HTMLElement){
698 767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
e = id;
699 768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
id = e.dataset.msgid;
700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ delete e.dataset.msgid;
770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( e?.dataset?.alsoRemove ){
771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const xId = e.dataset.alsoRemove;
772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ delete e.dataset.alsoRemove;
773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.deleteMessageElem( xId );
774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if(e instanceof Chat.MessageWidget) {
776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( this.e.eMsgPollError === e.body ){
777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.e.eMsgPollError = undefined;
778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(e.e.body){
780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.deleteMessageElem(e.e.body);
781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } else{
701 784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
e = this.getMessageElemById(id);
702 785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
703 786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(e && id){
704 787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.remove(e);
705 788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(e===this.e.newestMessage){
706 789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.fetchLastMessageElem();
707 790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- F.toast.message("Deleted message "+id+".");
791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !silent ){
792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.toast.message("Deleted message "+id+".");
793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
709 794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
710 795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return !!e;
711 796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
712 797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
713 798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
@@ -776,10 +861,11 @@
776 861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const self = this;
777 862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.fetch('chat-fetch-one',{
778 863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
urlParams:{ name: id, raw: true},
779 864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
responseType: 'json',
780 865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onload: function(msg){
866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished('chat-fetch-one');
781 867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
content.$elems[1] = D.append(D.pre(),msg.xmsg);
782 868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
content.$elems[1]._xmsgRaw = msg.xmsg/*used for copy-to-clipboard feature*/;
783 869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self.toggleTextMode(e);
784 870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
785 871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aftersend:function(){
@@ -837,11 +923,14 @@
837 923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!(e instanceof HTMLElement)) return;
838 924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(this.userMayDelete(e)){
839 925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.ajaxStart();
840 926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.fetch("chat-delete/" + id, {
841 927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
responseType: 'json',
842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- onload:(r)=>this.deleteMessageElem(r),
928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ onload:(r)=>{
929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished('chat-delete');
930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.deleteMessageElem(r);
931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
843 932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onerror:(err)=>this.reportErrorAsMessage(err)
844 933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
845 934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
846 935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.deleteMessageElem(id);
847 936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -1035,10 +1124,11 @@
1035 1124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1036 1125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ctor.prototype = {
1037 1126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
scrollIntoView: function(){
1038 1127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.e.content.scrollIntoView();
1039 1128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
1129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //remove: function(silent){Chat.deleteMessageElem(this, silent);},
1040 1130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
setMessage: function(m){
1041 1131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const ds = this.e.body.dataset;
1042 1132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ds.timestamp = m.mtime;
1043 1133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ds.lmtime = m.lmtime;
1044 1134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ds.msgid = m.msgid;
@@ -1212,12 +1302,21 @@
1212 1302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const btnDeleteLocal = D.button("Delete locally");
1213 1303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.append(toolbar, btnDeleteLocal);
1214 1304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const self = this;
1215 1305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
btnDeleteLocal.addEventListener('click', function(){
1216 1306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self.hide();
1217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Chat.deleteMessageElem(eMsg);
1307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.deleteMessageElem(eMsg)
1218 1308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
1309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eMsg.classList.contains('poller-connection') ){
1310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const btnDeletePoll = D.button("Delete poller messages?");
1311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(toolbar, btnDeletePoll);
1312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ btnDeletePoll.addEventListener('click', function(){
1313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self.hide();
1314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.e.viewMessages.querySelectorAll('.message-widget.poller-connection')
1315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ .forEach(e=>Chat.deleteMessageElem(e, true));
1316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
1317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1219 1318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(Chat.userMayDelete(eMsg)){
1220 1319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const btnDeleteGlobal = D.button("Delete globally");
1221 1320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.append(toolbar, btnDeleteGlobal);
1222 1321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.confirmer(btnDeleteGlobal,{
1223 1322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pinSize: true,
@@ -1457,10 +1556,11 @@
1457 1556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
n: nFetch,
1458 1557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i: iFirst
1459 1558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
1460 1559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
responseType: "json",
1461 1560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onload:function(jx){
1561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished('chat-query.onload');
1462 1562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( bDown ) jx.msgs.reverse();
1463 1563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
jx.msgs.forEach((m) => {
1464 1564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.isSearchResult = true;
1465 1565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var mw = new Chat.MessageWidget(m);
1466 1566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( bDown ){
@@ -1624,10 +1724,56 @@
1624 1724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const theMsg = findMessageWidgetParent(w);
1625 1725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(theMsg) Chat.deleteMessageElem(theMsg);
1626 1726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}));
1627 1727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.reportErrorAsMessage(w);
1628 1728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
1729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Assume the connection has been established, reset the
1731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.timer.tidReconnect, and (if showMsg and
1732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ !!Chat.e.eMsgPollError) alert the user that the outage appears to
1733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ be over. */
1734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const reportConnectionReestablished = function(dbgContext, showMsg = true){
1735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(Chat.beVerbose){
1736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ console.warn("reportConnectionReestablished()",
1737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dbgContext, showMsg, Chat.timer.tidReconnect, Chat.e.eMsgPollError);
1738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( Chat.timer.tidReconnect ){
1740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ clearTimeout(Chat.timer.tidReconnect);
1741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.timer.tidReconnect = 0;
1742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.timer.resetDelay();
1744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( Chat.e.eMsgPollError ) {
1745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const oldErrMsg = Chat.e.eMsgPollError;
1746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.e.eMsgPollError = undefined;
1747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( showMsg ){
1748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const m = Chat.reportReconnection("Poller connection restored.");
1749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m.e.body.dataset.alsoRemove = oldErrMsg?.e?.body?.dataset?.msgid;
1750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.addClass(m.e.body,'poller-connection');
1751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ setTimeout( Chat.poll, 0 );
1754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
1755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* To be called from F.fetch('chat-poll') beforesend() handlers. If we're
1757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ currently in delayed-retry mode and a connection is started, try
1758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to reset the delay after N time waiting on that connection. The
1759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fact that the connection is waiting to respond, rather than
1760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ outright failing, is a good hint that the outage is over and we
1761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ can reset the back-off timer. */
1762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const clearPollErrOnWait = function(){
1763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !Chat.timer.tidReconnect && Chat.timer.isDelayed() ){
1764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.timer.tidReconnect = setTimeout(()=>{
1765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.timer.tidReconnect = 0;
1766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( poll.running ){
1767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This chat-poll F.fetch() is still underway, so let's
1768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assume the connection is back up until/unless it times
1769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ out or breaks again. */
1770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished('clearPollErrOnWait');
1771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }, Chat.timer.$initialDelay * 3 );
1773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
1629 1775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1630 1776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
1631 1777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Submits the contents of the message input field (if not empty)
1632 1778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
and/or the file attachment field to the server. If both are
1633 1779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
empty, this is a no-op.
@@ -1686,10 +1832,11 @@
1686 1832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onerror:function(err){
1687 1833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self.reportErrorAsMessage(err);
1688 1834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
recoverFailedMessage(fallback);
1689 1835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
1690 1836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onload:function(txt){
1837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished();
1691 1838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!txt) return/*success response*/;
1692 1839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
try{
1693 1840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const json = JSON.parse(txt);
1694 1841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self.newContent({msgs:[json]});
1695 1842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}catch(e){
@@ -2185,10 +2332,11 @@
2185 2332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*filename needed for mimetype determination*/);
2186 2333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fd.append('render_mode',F.page.previewModes.wiki);
2187 2334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.fetch('ajax/preview-text',{
2188 2335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
payload: fd,
2189 2336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onload: function(html){
2337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished();
2190 2338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.setPreviewText(html);
2191 2339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.pikchr.addSrcView(Chat.e.viewPreview.querySelectorAll('svg.pikchr'));
2192 2340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
2193 2341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onerror: function(e){
2194 2342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.fetch.onerror(e);
@@ -2322,10 +2470,11 @@
2322 2470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onerror:function(err){
2323 2471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.reportErrorAsMessage(err);
2324 2472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat._isBatchLoading = false;
2325 2473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
2326 2474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onload:function(x){
2475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished();
2327 2476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
let gotMessages = x.msgs.length;
2328 2477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
newcontent(x,true);
2329 2478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat._isBatchLoading = false;
2330 2479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.updateActiveUserList();
2331 2480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(Chat._gotServerError){
@@ -2411,10 +2560,11 @@
2411 2560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onerror:function(err){
2412 2561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.setCurrentView(Chat.e.viewMessages);
2413 2562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.reportErrorAsMessage(err);
2414 2563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
2415 2564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onload:function(jx){
2565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished();
2416 2566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
let previd = 0;
2417 2567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.clearElement(eMsgTgt);
2418 2568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
jx.msgs.forEach((m)=>{
2419 2569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.isSearchResult = true;
2420 2570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const mw = new Chat.MessageWidget(m);
@@ -2444,29 +2594,65 @@
2444 2594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2445 2595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2446 2596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
2447 2597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}/*Chat.submitSearch()*/;
2448 2598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const afterFetch = function f(){
2599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
2600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Deal with the last poll() response and maybe re-start poll().
2601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
2602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const afterPollFetch = function f(err){
2450 2603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(true===f.isFirstCall){
2451 2604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.isFirstCall = false;
2452 2605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.ajaxEnd();
2453 2606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.e.viewMessages.classList.remove('loading');
2454 2607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
setTimeout(function(){
2455 2608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.scrollMessagesTo(1);
2456 2609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}, 250);
2457 2610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(Chat._gotServerError && Chat.intervalTimer){
2459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- clearInterval(Chat.intervalTimer);
2611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(Chat.timer.tidPoller) {
2612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ clearTimeout(Chat.timer.tidPoller);
2613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.timer.tidPoller = 0;
2614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(Chat._gotServerError){
2460 2616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.reportErrorAsMessage(
2461 2617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"Shutting down chat poller due to server-side error. ",
2462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "Reload this page to reactivate it.");
2463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- delete Chat.intervalTimer;
2618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Reload this page to reactivate it."
2619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
2620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.timer.tidPoller = undefined;
2621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } else {
2622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( err && Chat.beVerbose ){
2623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ console.error("afterPollFetch:",err.name,err.status,err.message);
2624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !err || 'timeout'===err.name/*(probably) long-poll expired*/ ){
2626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Restart the poller immediately. */
2627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished('afterPollFetch '+err, false);
2628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
2629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Delay a while before trying again, noting that other Chat
2630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ APIs may try and succeed at connections before this timer
2631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ resolves, in which case they'll clear this timeout and the
2632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UI message about the outage. */
2633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const delay = Chat.timer.incrDelay();
2634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //console.warn("afterPollFetch Chat.e.eMsgPollError",Chat.e.eMsgPollError);
2635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const msg = "Poller connection error. Retrying in "+delay+ " ms.";
2636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( Chat.e.eMsgPollError ){
2637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Update the error message on the current error MessageWidget */
2638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.e.eMsgPollError.e.content.innerText = msg;
2639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else {
2640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Set current (new) error MessageWidget */
2641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.e.eMsgPollError = Chat.reportErrorAsMessage(msg);
2642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //Chat.playNewMessageSound();// browser complains b/c this wasn't via human interaction
2643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.addClass(Chat.e.eMsgPollError.e.body,'poller-connection');
2644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.timer.tidPoller = setTimeout(()=>{
2646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ poll();
2647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }, delay);
2648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //console.log("isOkay =",isOkay,"currentDelay =",Chat.timer.currentDelay);
2464 2650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- poll.running = false;
2466 2651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
2467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- afterFetch.isFirstCall = true;
2652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ afterPollFetch.isFirstCall = true;
2653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2468 2654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
2469 2655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
FIXME: when polling fails because the remote server is
2470 2656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
reachable but it's not accepting HTTP requests, we should back
2471 2657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
off on polling for a while. e.g. if the remote web server process
2472 2658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
is killed, the poll fails quickly and immediately retries,
@@ -2478,53 +2664,96 @@
2478 2664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xhrRequest.status value to do so, with status==0 being a
2479 2665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
connection error. We do not currently have a clean way of passing
2480 2666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
that info back to the fossil.fetch() client, so we'll need to
2481 2667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
hammer on that API a bit to get this working.
2482 2668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
2483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const poll = async function f(){
2669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const poll = Chat.poll = async function f(){
2484 2670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(f.running) return;
2485 2671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.running = true;
2486 2672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat._isBatchLoading = f.isFirstCall;
2487 2673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(true===f.isFirstCall){
2488 2674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.isFirstCall = false;
2675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.aPollErr = [];
2489 2676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.ajaxStart();
2490 2677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.e.viewMessages.classList.add('loading');
2678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ setInterval(
2679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
2680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ We manager onerror() results in poll() using a
2681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ stack of error objects and we delay their handling by
2682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a small amount, rather than immediately when the
2683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ exception arrives.
2684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This level of indirection is to work around an
2686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inexplicable behavior from the F.fetch() connections:
2687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ timeouts are always announced in pairs of an HTTP 0 and
2688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ something we can unambiguously identify as a timeout. When
2689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ that happens, we ignore the HTTP 0. If, however, an HTTP 0
2690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is seen here without an immediately-following timeout, we
2691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ process it.
2692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ It's kinda like in the curses C API, where you to match
2694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ALT-X by first getting an ALT event, then a separate X
2695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ event, but a lot less explicable.
2696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
2697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ()=>{
2698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( Chat.aPollErr.length ){
2699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(Chat.aPollErr.length>1){
2700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //console.warn('aPollErr',Chat.aPollErr);
2701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(Chat.aPollErr[1].name='timeout'){
2702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* mysterious pairs of HTTP 0 followed immediately
2703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ by timeout response; ignore the former in that case. */
2704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.aPollErr.shift();
2705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ afterPollFetch(Chat.aPollErr.shift());
2708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
2710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 1000
2711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
2491 2712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ let nErr = 0;
2492 2714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.fetch("chat-poll",{
2493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- timeout: 420 * 1000/*FIXME: get the value from the server*/,
2715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ timeout: window.location.hostname.match(
2716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "localhost" /*presumably local dev mode*/
2717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ) ? 15000
2718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ : 420 * 1000/*FIXME: get the value from the server*/,
2494 2719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
urlParams:{
2495 2720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
name: Chat.mxMsg
2496 2721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
2497 2722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
responseType: "json",
2498 2723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// Disable the ajax start/end handling for this long-polling op:
2499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- beforesend: function(){},
2500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aftersend: function(){},
2724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ beforesend: function(){
2725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ clearPollErrOnWait();
2726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
2727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aftersend: function(){
2728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ poll.running = false;
2729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
2501 2730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onerror:function(err){
2502 2731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat._isBatchLoading = false;
2503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(Chat.verboseErrors) console.error(err);
2504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* ^^^ we don't use Chat.reportError() here b/c the polling
2505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fails exepectedly when it times out, but is then immediately
2506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- resumed, and reportError() produces a loud error message. */
2507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- afterFetch();
2732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(Chat.beVerbose){
2733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ console.error("poll.onerror:",err.name,err.status,JSON.stringify(err));
2734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.aPollErr.push(err);
2508 2736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
2509 2737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onload:function(y){
2738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ reportConnectionReestablished('poll.onload', true);
2510 2739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
newcontent(y);
2511 2740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(Chat._isBatchLoading){
2512 2741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat._isBatchLoading = false;
2513 2742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.updateActiveUserList();
2514 2743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- afterFetch();
2744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ afterPollFetch();
2516 2745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2517 2746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
2518 2747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
2519 2748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
poll.isFirstCall = true;
2520 2749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat._gotServerError = poll.running = false;
2521 2750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( window.fossil.config.chat.fromcli ){
2522 2751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.chatOnlyMode(true);
2523 2752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Chat.intervalTimer = setInterval(poll, 1000);
2753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.timer.tidPoller = setTimeout(poll, Chat.timer.resetDelay());
2525 2754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
delete ForceResizeKludge.$disabled;
2526 2755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ForceResizeKludge();
2527 2756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.animate.$disabled = false;
2528 2757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
setTimeout( ()=>Chat.inputFocus(), 0 );
2529 2758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.page.chat = Chat/* enables testing the APIs via the dev tools */;
2530 2759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
2531 2760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!