Module 258024

17,140 characters · in 3ee4253b98e73f4f.js
Dependencies
Required by (1)
Lazily required by (0)none
Lazily requires (0)none
Source Raw
function(e,t,n){n.d(t,{Ay:()=>T}),n(321073);var i=n(64700),l=n(735438),a=n.n(l),s=n(621466),r=n(951001),o=n(843472),c=n(334738),d=n(775602),u=n(267102),h=n(976860),m=n(863922),A=n(72314),g=n(661191),p=n(326337),_=n(371741),f=n(420819),E=n(381941),C=n(652215);function x(e){if(null==e.jumpTargetId||!e.ready)return null;let{jumpTargetId:t,jumpTargetOffset:n}=e;if(e.has(t)||!e.hasMoreBefore&&t===g.default.castChannelIdAsMessageId(e.channelId)){if(0===n)return t;let i=e.getByIndex(e.indexOf(t)+n);return i?.id??t}let i=[t,...e.map(e=>{let{id:t}=e;return t})].sort(g.default.compare),l=i.indexOf(t),a=i[l+(Math.abs(n)>0?n:1)]??i[l-1];return null!=a?a:null}let S={scrollTop:0,scrollHeight:0,offsetHeight:0};class I{props;ref=i.createRef();automaticAnchor=null;messageFetchAnchor=null;focusAnchor=null;loading;jumping=!1;pinned;dragging=!1;isAtBottom=!1;prevScrollTop=null;anchorTimeout=null;initialScrollTop=null;acking=!1;scrollCounter=0;offsetHeightCache=0;scrollHeightCache=0;scrollTopCache=-1;scrollHeightBeforeLoad=0;loadMorePausedUntilUserScroll=!1;_bottomAnchor=null;_automaticAnchorCallbacks=[];_scrollCompleteCallbacks=[];constructor(e){if(this.props=e,this.loading=e.messages.loadingMore,null!=e.messages.jumpTargetId)this.pinned=!1;else{const t=A.A.isAtBottom(e.channel.id);this.pinned=t??!0,this.initialScrollTop=t?null:A.A.getChannelDimensions(e.channel.id)?.scrollTop??null}}isReady(){return this.props.messages.ready}isLoading(){return this.loading||this.props.messages.loadingMore}isPinned(){return this.pinned}isJumping(){return this.jumping}isDragging(){return this.dragging}isInitialized(){return void 0===this.initialScrollTop}isScrollLoadingDisabled(){return!!this.loadMorePausedUntilUserScroll||this.isLoading()||!this.isInitialized()||this.isJumping()||this.isDragging()||!this.props.canLoadMore}isActivelyScrolling(){return this.scrollCounter>=5}getDocument(){return this.ref.current?.getScrollerNode()?.ownerDocument}getElementFromMessageId(e){let t=this.getDocument(),{channel:{id:n}}=this.props;return null==t?null:(0,_.Av)(t,n,e)}isScrolledToBottom(){let{scrollTop:e,scrollHeight:t,offsetHeight:n}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.getScrollerState();return e>=t-n-2&&!this.props.messages.hasMoreAfter}mergePropsAndUpdate(e){this.mergePropsAndUpdate_(e),this.props.messages.ready&&this.enableAutomaticAck()}mergePropsAndUpdate_(e){let t=this.props.messages,n=this.props.focusId;this.props={...e};let{offsetHeight:i,scrollHeight:l}=this.getScrollerState(),a=this.isHeightChange(i,l);if(this.offsetHeightCache=i,this.scrollHeightCache=l,this.loading=e.messages.loadingMore,t.channelId!==e.messages.channelId)this.loadMorePausedUntilUserScroll=!1;else if(t.loadingMore&&!e.messages.loadingMore){let e=Math.abs(l-this.scrollHeightBeforeLoad);this.loadMorePausedUntilUserScroll=e<100}if(this.isInitialized()||this.isReady()){if(!this.isInitialized())return void this.restoreScroll()}else{null==e.messages.jumpTargetId&&this.scrollTo(Number.MAX_SAFE_INTEGER);return}if(null!=e.messages.jumpTargetId){if(this.isLoading())return;let n=x(e.messages);if(null==n||this.isJumping()||e.messages.jumpSequenceId===t.jumpSequenceId){if(this.isJumping())return void(null!=n?this.scrollToMessage({jumpTargetId:n,animate:!0}):this.jumping=!1)}else{let i,l=t.first();null!=l&&e.messages.last()!==t.last()&&e.messages.first()!==t.first()&&(i=g.default.extractTimestamp(l.id)),this.scrollToMessage({jumpTargetId:n,animate:!0,fromTimestamp:i});return}}if(e.messages.jumpedToPresent&&t.jumpSequenceId!==e.messages.jumpSequenceId){this.jumping=!0,this.scrollTo(0),this.setScrollToBottom(!0);return}let s=e.messages.last(),r=t.last();if(null!=s&&s.state===C.cmJ.SENDING&&r?.id!==s.id)return void this.setScrollToBottom();let{focusId:o}=this.props;if(null!=o&&n!==o){let e=this.getElementFromMessageId(o);if(null!=e)return void this.ref.current?.scrollIntoViewNode({node:e,padding:E.mZ+this.props.additionalMessagePadding,callback:this.handleScroll})}a&&this.fixScrollPosition(i,l)}getAnchorData(e,t,n){let i=this.getElementFromMessageId(e),l=this.ref.current?.getScrollerNode();if(!(0,s.vq)(i)||null==l)return null;let{offsetHeight:a}=i,r=(0,f.A)(i,l),o=r-t;return null!=n&&(o=Math.max(-a,Math.min(n,o))),{id:e,offsetFromTop:o,offsetTop:r,offsetHeight:a,clamped:null!=o}}cleanAutomaticAnchor(){this.setAutomaticAnchor(null)}newMessageBarBuffer(){return this.props.channel.isForumPost()?E.Gt:E.k8}findAnchor(){let{messages:e,hasUnreads:t,channel:n}=this.props,i=this.getScrollerState(),{scrollTop:l}=i,a=t&&l>=this.newMessageBarBuffer()?this.newMessageBarBuffer():0,s=null,r=t=>-1===t?g.default.castChannelIdAsMessageId(n.id):e._array[t]?.id,o=-1,c=!1;for(;;){let t=r(o);if(null==t)break;let n=this.getAnchorData(t,l);if(this._bottomAnchor=n,c&&null!=n&&n.offsetTop>l+a+i.offsetHeight)break;if(c){o++;continue}null!=n&&(n.offsetTop>=l+a||o===e.length-1)&&(s=n,c=!0),o++}return s}findFetchAnchor(e){let{messages:t}=this.props,{scrollTop:n}=this.getScrollerState(),i=e?-1:1,l=null,a=t._array.length-1;for(let s=e?a:0;null!=t._array[s];s+=i){let e=t._array[s],i=this.getAnchorData(e.id,n);if(null!=i){l=i;break}}return l}getAnchorFixData(){for(let e of[this.focusAnchor,this.isLoading()?null:this.messageFetchAnchor,this.automaticAnchor]){if(null==e)continue;let t=this.getElementFromMessageId(e.id);if(!(0,s.vq)(t))continue;let n=e===this.messageFetchAnchor?e.offsetHeight-t.offsetHeight:0;return{node:t,fixedScrollTop:t.offsetTop-(e.offsetFromTop+n)}}return null}fixAnchorScrollPosition(){let e=this.getAnchorFixData();if(null==e)return void this.handleScroll();let{node:t,fixedScrollTop:n}=e;null!=this.focusAnchor?(this.isPinned()?this.scrollTo(Number.MAX_SAFE_INTEGER,!1,this.handleScroll):this.mergeTo(n,this.handleScroll),this.ref.current?.scrollIntoViewNode({node:t,padding:E.mZ+this.props.additionalMessagePadding,callback:this.handleScroll})):this.mergeTo(n,this.handleScroll),this.isActivelyScrolling()?this.setAutomaticAnchor(null):this.setAutomaticAnchor(this.findAnchor()),this.isLoading()||(this.messageFetchAnchor=null)}hasAnchor(){return null!=this.focusAnchor||null!=this.messageFetchAnchor||null!=this.automaticAnchor}updateFocusAnchor(e,t,n){let i=this.focusAnchor=null!=e?this.getAnchorData(e,t):null;null!=i&&(i.offsetFromTop>=n||t>i.offsetTop+i.offsetHeight)&&(this.focusAnchor=null)}handleFocusAnchorScroll(e,t){this.updateFocusAnchor(this.focusAnchor?.id,e,t)}updateFetchAnchor(e,t,n){let i=this.ref.current?.getScrollerNode();null!=this.messageFetchAnchor&&null!=i&&(this.messageFetchAnchor=this.getAnchorData(this.messageFetchAnchor.id,e,this.isInPlaceholderRegion({scrollTop:e,offsetHeight:t,scrollHeight:n})>0?t:void 0))}updateAutomaticAnchor(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.ref.current?.getScrollerNode();if(null==this.automaticAnchor||null==n)return;let i=this.getAnchorData(this.automaticAnchor.id,e);t&&null!=i&&null!=this.automaticAnchor&&(i.offsetFromTop=this.automaticAnchor.offsetFromTop),this.setAutomaticAnchor(i)}updateVisibleMessagesDebounced=a().debounce(m.s_,300);setAutomaticAnchor(e){this.automaticAnchor=e,this._automaticAnchorCallbacks?.forEach(e=>e(this.automaticAnchor,this._bottomAnchor)),this.updateVisibleMessagesDebounced(e?.id,this._bottomAnchor?.id)}getScrollerState(){return this.ref.current?.getScrollerState()??S}handleScroll=e=>{if(!this.isInitialized())return;let t=this.getScrollerState(),n=this.isScrolledToBottom(t);if(n!==this.isAtBottom&&(n?(this.isAtBottom=!0,this.props.handleScrollToBottom()):(this.isAtBottom=!1,this.props.handleScrollFromBottom())),t.offsetHeight!==this.offsetHeightCache||t.scrollHeight!==this.scrollHeightCache)this.scrollCounter=0,clearTimeout(this.anchorTimeout),this.isPinned()||(null==this.automaticAnchor?this.setAutomaticAnchor(this.findAnchor()):this.updateAutomaticAnchor(t.scrollTop,!0)),clearTimeout(this.anchorTimeout),this.fixScrollPosition(t.offsetHeight,t.scrollHeight),this.scrollTopCache=t.scrollTop;else{if(null!=e&&e.target!==this.ref.current?.getScrollerNode())return;this.scrollTopCache!==t.scrollTop&&(this.loadMorePausedUntilUserScroll&&null!=e&&(this.loadMorePausedUntilUserScroll=!1),this.pinned=n,this.scrollCounter=Math.min(this.scrollCounter+1,5),this.pinned?this.cleanAutomaticAnchor():null!=this.automaticAnchor?this.updateAutomaticAnchor(t.scrollTop,!0):this.setAutomaticAnchor(this.findAnchor()),this.scrollTopCache=t.scrollTop,clearTimeout(this.anchorTimeout),this.anchorTimeout=setTimeout(()=>{this.scrollCounter=0,this.anchorTimeout=null,this.prevScrollTop=null;let{scrollHeight:e,offsetHeight:t}=this.getScrollerState();this.isHeightChange(t,e)?this.handleScroll():(this.cleanAutomaticAnchor(),this.isPinned()||this.setAutomaticAnchor(this.findAnchor()))},35))}if(this.handleFocusAnchorScroll(t.scrollTop,t.offsetHeight),this.updateStoreDimensionsDebounced(),this.isScrollLoadingDisabled())return this.props.canLoadMore||this.enableAutomaticAck(),this.handleScrollSpeed(t);let i=this.isInScrollTriggerLoadingRegion(t);1===i?this.loadMore():2===i?this.loadMore(!0):this.enableAutomaticAck(),this.handleScrollSpeed(t)};handleResize=(e,t)=>{let{offsetHeightCache:n,scrollHeightCache:i}=this;"container"===t?n=e.contentRect.height:"content"===t&&(i=e.contentRect.height),this.isHeightChange(n,i)&&this.fixScrollPosition(n,i)};handleMouseDown=e=>{e.target===e.currentTarget&&(this.dragging=!0)};handleMouseUp=()=>{this.dragging=!1,this.handleScroll()};isHeightChange(e,t){return e!==this.offsetHeightCache||t!==this.scrollHeightCache}isInPlaceholderRegion(e){let{scrollTop:t,offsetHeight:n,scrollHeight:i}=e,{messages:l,placeholderHeight:a}=this.props;return l.hasMoreBefore&&t<a&&i>n?1:l.hasMoreAfter&&t>=i-n-a?2:0}isInScrollTriggerLoadingRegion(e){let{scrollTop:t,offsetHeight:n,scrollHeight:i}=e,{messages:l}=this.props;return l.hasMoreBefore&&t<=this.getOffsetToTriggerLoading("top",e)&&i>n?1:l.hasMoreAfter&&t>=this.getOffsetToTriggerLoading("bottom",e)?2:0}handleScrollSpeed(e){if(this.isJumping()||this.isDragging()||!this.props.canLoadMore)return;let{scrollTop:t,offsetHeight:n,scrollHeight:i}=e,{prevScrollTop:l,props:{placeholderHeight:a}}=this;if(this.prevScrollTop=t,null==l)return;let s=this.isInPlaceholderRegion(e),r=t-l;0!==s&&0!==r&&(1===s&&t+r<=0?(this.mergeTo(a-n),this.prevScrollTop=a-n):2===s&&t+r>=i-n&&(this.mergeTo(i-a),this.prevScrollTop=i-a))}enableAutomaticAck(){this.isInitialized()&&!this.acking&&(this.acking=!0,this.updateStoreDimensions(()=>{(0,c._9)(this.props.channel.id,this.props.windowId)}))}fixScrollPosition(e,t){this.offsetHeightCache=e,this.scrollHeightCache=t,this.fixJumpTarget(),this.isPinned()&&null==this.messageFetchAnchor&&null==this.focusAnchor?this.scrollTo(Number.MAX_SAFE_INTEGER,!1,this.handleScroll):this.fixAnchorScrollPosition()}fixJumpTarget(){if(!this.isJumping())return;let{messages:e,hasUnreads:t}=this.props;if(null!=e.jumpTargetId){let n=x(e);if(null==n)return;let i=this.getElementFromMessageId(n);(0,s.vq)(i)?this.scrollTo(this.getOffsetOrientationFromNode(i,"middle",t?this.newMessageBarBuffer():E.mZ),!0):this.scrollToNewMessages(!0,"middle")}else this.scrollTo(Number.MAX_SAFE_INTEGER,!0)}scrollToNewMessages(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"top",n=arguments.length>2?arguments[2]:void 0,i=this.getDocument()?.getElementById(E.q4),l=()=>{this.jumping=!1,this.setAutomaticAnchor(this.findAnchor()),null!=n&&n(),this.handleScroll()};this.pinned=!1,this.jumping=e,null!=i?this.scrollTo(this.getOffsetOrientationFromNode(i,t,this.newMessageBarBuffer()),e,l):this.scrollTo(this.getOffsetToPreventLoading("top"),e,l)}getOffsetOrientationFromNode(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,i=this.ref.current?.getScrollerNode();if(null==i)return 0;let l=this.getScrollerState(),a=(0,f.A)(e,i);return"middle"===t?Math.min(a-.5*l.offsetHeight+.5*e.offsetHeight+-8,a-n):a-n}restoreScroll(){if(this.isInitialized())return;let{initialScrollTop:e}=this;this.initialScrollTop=void 0;let t=x(this.props.messages);null!=t?this.scrollToMessage({jumpTargetId:t,animate:!1}):this.props.hasUnreads&&this.props.channel.type!==C.rbe.GUILD_VOICE&&this.props.channel.type!==C.rbe.GUILD_STAGE_VOICE?this.scrollToNewMessages():null!=e?this.scrollTo(e+this.props.placeholderHeight,!1,this.handleScroll):this.setScrollToBottom()}loadMore=(()=>{var e=this;return function(){let t,n,i=arguments.length>0&&void 0!==arguments[0]&&arguments[0],{messages:l}=e.props;if(i){let e=l.last();null!=e&&(n=e.id)}else{let e=l.first();null!=e&&(t=e.id)}e.messageFetchAnchor=e.findFetchAnchor(i),e.scrollHeightBeforeLoad=e.scrollHeightCache,e.loading=!0,o.A.fetchMessages({channelId:e.props.channel.id,before:t,after:n,limit:Math.min(C.EMb,2*(0,p.h)("scrollManager.loadMore")),truncate:!0})}})();scrollTo(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2?arguments[2]:void 0;this.ref.current?.scrollTo({to:e,animate:!d.A.useReducedMotion&&t,callback:n}),this.isPinned()?this.updateStoreDimensions():this.updateStoreDimensionsDebounced()}mergeTo(e,t){this.ref.current?.mergeTo({to:e,callback:t}),this.isPinned()?this.updateStoreDimensions():this.updateStoreDimensionsDebounced()}setScrollToBottom(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],{messages:t,channel:n}=this.props;if(t.hasMoreAfter)o.A.jumpToPresent(n.id,(0,p.h)("scrollManager.jumpToPresent")),(0,h.uh)(n.getGuildId()??C.ME,n.id);else this.scrollTo(Number.MAX_SAFE_INTEGER,e,()=>{this.jumping=!1,this.handleScroll()})}updateStoreDimensionsDebounced=a().debounce(this.updateStoreDimensions,200);updateStoreDimensions(e){if(this.isJumping()||!this.isInitialized())return;let{channel:t}=this.props;if(this.isPinned())r.A.updateChannelDimensions(t.id,Date.now(),1,1,0,e);else{let{placeholderHeight:n}=this.props,{scrollTop:i,scrollHeight:l,offsetHeight:a}=this.getScrollerState();r.A.updateChannelDimensions(t.id,Date.now(),i-n,l-n,a,e)}}scrollIntoViewRect(){}scrollPageUp(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.ref.current?.scrollPageUp({animate:e})}scrollPageDown(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.ref.current?.scrollPageDown({animate:e})}scrollToMessage(e){let{jumpTargetId:t,animate:n=!1,fromTimestamp:i}=e;if(null==this.ref.current)return;if(t===this.props.channel.id)return void this.scrollTo(0);let l=this.getElementFromMessageId(t);this.isJumping()||!n||null==i||d.A.useReducedMotion||(g.default.extractTimestamp(t)>i?this.scrollTo(0):this.scrollTo(Number.MAX_SAFE_INTEGER)),this.pinned=!1,this.jumping=!0;let a=()=>{this.jumping=!1,(0,s.vq)(l)&&(l.tabIndex=-1,l.focus({preventScroll:!0})),this.scrollCounter=0,this.handleScroll(),this._scrollCompleteCallbacks.forEach(e=>e())};(0,s.vq)(l)?this.scrollTo(this.getOffsetOrientationFromNode(l,"middle",this.props.hasUnreads?this.newMessageBarBuffer():E.mZ),n,a):this.scrollToNewMessages(n,"middle",a)}getOffsetToTriggerLoading(e,t){let{scrollHeight:n,offsetHeight:i}=t,{messages:l,hasUnreads:a,placeholderHeight:s}=this.props;if("top"===e)if(!l.hasMoreBefore)return 0;else return a?s-E.N0-2:s+500;return l.hasMoreAfter?n-i-s-500:n-i}getOffsetToPreventLoading(e){let{messages:t}=this.props,n=0;return"top"===e&&t.hasMoreBefore?n=2:"bottom"===e&&t.hasMoreAfter&&(n=-2),this.getOffsetToTriggerLoading(e,this.getScrollerState())+n}getSnapshotBeforeUpdate(e){if(this.hasAnchor()||null!=e){let{scrollTop:t,offsetHeight:n,scrollHeight:i}=this.getScrollerState();this.updateFocusAnchor(e,t,n),this.updateFetchAnchor(t,n,i),this.updateAutomaticAnchor(t)}}addAutomaticAnchorCallback(e){let t=!(arguments.length>1)||void 0===arguments[1]||arguments[1];this._automaticAnchorCallbacks.push(e),this._automaticAnchorCallbacks=a().uniq(this._automaticAnchorCallbacks),!0===t&&this.setAutomaticAnchor(this.findAnchor())}removeAutomaticAnchorCallback(e){this._automaticAnchorCallbacks=a().without(this._automaticAnchorCallbacks,e)}addScrollCompleteCallback(e){this._scrollCompleteCallbacks.push(e),this._scrollCompleteCallbacks=a().uniq(this._scrollCompleteCallbacks)}removeScrollCompleteCallback(e){this._scrollCompleteCallbacks=a().without(this._scrollCompleteCallbacks,e)}cleanup(){this.acking=!1,this.updateStoreDimensionsDebounced.cancel(),this._automaticAnchorCallbacks.forEach(e=>this.removeAutomaticAnchorCallback(e)),(0,c.Z5)(this.props.channel.id,this.props.windowId)}}function T(e){let{messages:t,channel:n,compact:l,hasUnreads:a,focusId:s,placeholderHeight:r,canLoadMore:o=!0,handleScrollToBottom:c,handleScrollFromBottom:d,additionalMessagePadding:h=0}=e,{windowId:m}=i.useContext(u.Ay),[A]=i.useState(()=>new I({messages:t,channel:n,compact:l,hasUnreads:a,focusId:s,placeholderHeight:r,canLoadMore:o,windowId:m,handleScrollToBottom:c,handleScrollFromBottom:d,additionalMessagePadding:h}));return A.getSnapshotBeforeUpdate(s),i.useLayoutEffect(()=>A.mergePropsAndUpdate({messages:t,channel:n,compact:l,hasUnreads:a,focusId:s,placeholderHeight:r,canLoadMore:o,windowId:m,handleScrollToBottom:c,handleScrollFromBottom:d,additionalMessagePadding:h})),i.useLayoutEffect(()=>()=>A.cleanup(),[A]),A}}